用c语言编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言编程相关的知识,希望对你有一定的参考价值。

用c语言编程:整数集合M有如下定义 A:1属于M; B:如果x属于M,则2x+1属于M,3x+1属于M; C:没有别的整数属于M. 编写c程序按递增顺序生成并输出集合M的前30项.再编写一个函数,判定任意一个整数z是否属于集合M.

程序就是读取文件到数组,再将数组进行排序,最后写入文件。

读写文件流程:fopen获取文件流(根据读写需求,选择参数,使用完必须调用fclose函数关闭),fscanf读取文件内容,fseek控制文件流指针,fprintf写入文件。

选择排序:每个循环周期选出一个最值,交换一次。

下面是代码(数组为动态数组):

#include <stdio.h>

#include <malloc.h>

int maxLen;//数组长度

int *read2Nums(char path[]);//读取

int write2File(int *nums,char path[]);//写入

void showNums(int *nums);

int px(int *nums,int flag);//选择排序flag=1升序,flag=0降序

int main()

    int *nums=NULL;

    char rPath[]="c:\\\\000.dat",wPath[]="c:\\\\rank.dat";

    if(!(nums=read2Nums(rPath))) return 1;

    showNums(nums);

    printf("数组升序排列:\\n");

    if(px(nums,1)==-1) return 1;

    showNums(nums);

    printf("数组降序排列:\\n");

    if(px(nums,0)==-1) return 1;

    showNums(nums);

    printf("写入到文件路径%s下(存在覆盖,不存在新建)\\n",wPath);

    if(write2File(nums,wPath)==-1) return 1;

    printf("写入成功!\\n");

    return 0;

void showNums(int *nums)

    int i;

    if(nums) for(i=0,printf("文件内容:\\n");i<maxLen;printf("%d ",nums[i]),i++);

    printf("\\n");

int px(int *nums,int flag)

    int i,j,n,temp;

    if(!nums) return -1;

    for(i=0;i<maxLen-1;i++)

   

        n=i;

        for(j=i+1;j<maxLen;j++)

       

            if(flag && nums[n]>nums[j]) n=j;

            if(!flag && nums[n]<nums[j]) n=j;

       

        temp=nums[i],nums[i]=nums[n],nums[n]=temp;

   

    return 1;

int write2File(int *nums,char path[])

    int i;

    FILE *fp=NULL;

    if(!nums) return -1;

    if(!(fp=fopen(path,"w"))) return -1;

    //fseek(fp,SEEK_END);

    for(i=0;i<maxLen;i++)

        fprintf(fp,"%d ",nums[i]);

    fclose(fp);

    return 1;

int *read2Nums(char path[])

    int *nums=NULL,*temp=NULL,cnt=0;

    FILE *fp=NULL;

    maxLen=10;

    if(!(fp=fopen(path,"r"))) return NULL;

    nums=(int *)malloc(sizeof(int)*maxLen);

    if(!nums) return NULL;

    while(fscanf(fp,"%d",&nums[cnt++])!=-1)

        if(cnt==maxLen)//数组长度不够扩展(每次扩展10长度)

       

            maxLen=maxLen+10;

            temp=(int *)realloc(nums,sizeof(int)*maxLen);

            if(temp) return NULL;

            nums=temp;

       

    if(--cnt<maxLen)//函数结束前,删除多余地址,减少内存占用

   

        maxLen=cnt;

        temp=(int *)realloc(nums,sizeof(int)*maxLen);

        if(!temp) return NULL;

        nums=temp;

   

    fclose(fp);

    return nums;

参考技术A 您若要C++程序就看我这个
#include
<iostream>
using
namespace
std;
int
main()

int
numbers[10];
int
i;
cout<<"请输入10个整数"<<endl;
for(i=0;
i<10;
i++)

cin>>numbers[i];

int
maxnum
=
numbers[0];
for(i=1;
i<10;
i++)

if(maxnum
<=
numbers[i])

maxnum
=
numbers[i];


int
sum
=
0;
for(i=0;
i<10;
i++)

sum
+=
numbers[i];

float
average
=
sum/10.0f;
cout<<"10个整数当中最大的是"<<maxnum<<endl;
cout<<"10个整数的平均数是"<<average<<endl;
return
0;

谢谢采纳!
参考技术B #include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <conio.h>

void insert(int *array, int num)//将num按递增顺序插到array中

int i,j;
for(i=29; i >= 0; i--)//寻找num的合适插入点

if(array[i] == num)

return;//集合没有相同项

else if(array[i] < num)

break;


if(i == 29 ) return;

for(j=28; j > i; j--)//将待插入位置后面的元素后移

array[j+1]=array[j];


array[j+1]=num;


int is_in_array(int *array, int num)/*判断num是否集合M的元素*/

int i;
/*:如果x属于M,则2x+1属于M,3x+1属于M*/
/*<=>*/
/*:如果x属于M,则(x-1)/2或(x-1)/3属于M (1除外)*/
if(num <= array[29] )

for(i=0; i<30; i++)

if(array[i] == num)
return 1;

return 0;
//如果num在array的前30项中则num是集合M中的元素返回1,否则返回0


if( (num-1)%3 == 0 )//num-1=3x是3的倍数

if(is_in_array(array, (num-1)/3))
return 1;


if( (num-1)%2 == 0 )

if(is_in_array(array, (num-1)/2))
return 1;

//递归思想
return 0;


int main()

int array[30]=1;
int num=1;
int i;
for(i=1; i < 30; i++)

array[i]=99999;
//初始化成一些大数,保证大于第30项即可


for(i=0; i < 30; i++)

insert(array, 2*array[i]+1);
insert(array, 3*array[i]+1);
/*:如果x属于M,则2x+1属于M,3x+1属于M*/

printf("the M is\n");

for(i=0; i < 30; i++)

printf("%d\t", array[i]);

if( i%5 == 4)

printf("\n");//每行5个


printf("please input a num to judge\n");
scanf("%d", &num);

if(is_in_array(array, num))

printf("%d is in M\n", num);

else

printf("%d is not in M\n", num);


return 0;
本回答被提问者采纳

怎样用C语言编写这个程序

有一个5*5的表格,将1,2,3,4四个数填入到这25个小格中,其中1可以放在任何小格中,2必须和1相邻,3必须和1,2都相邻,4则要和1,2,3,都相邻,怎样填写这些数字才能够使这个表格里所有数字的和最大
高手在哪啊,高手,求高手指点。

#include "stdio.h"
#include "conio.h"
#include "dos.h"

typedef struct

int x;
int y; //二维坐标
int value; //每4进制位的值
int near_flag;
/*权值,
二进制:000
第1位是1表示已经与0相连
第2位是1表示已经与1相连
第3位是1表示已经与2相连
例:
110 :表示与2和1相连,但是不与0相连
111 :表示与0,1,2都相连
001 :表示与0相连,与1,2不相连
*/
xy_value;

xy_value num[26];
/* 判断权位,确定相连的数是否符合 */
jdg_flag()

int i;
for(i=0;i<25;i++)
switch (num[i].value)

case 3: if( num[i].near_flag != 6) return 0; else break;
case 2: if(( num[i].near_flag& 3)!= 3) return 0; else break;
case 1: if(( num[i].near_flag& 1)!= 1) return 0; else break;


return 1;



flag()//初始化权位

int i;
int x,y;
for(i=0;i<25;i++)

x=num[i].x;
y=num[i].y;

if((x-1)>=0) //如果越界,则越界的那边不给予权值
num[i].near_flag|=(1<<(num[(x-1)*5+y].value));
if((x+1)<=4)
num[i].near_flag|=(1<<(num[(x+1)*5+y].value));
if((y-1)>=0)
num[i].near_flag|=(1<<(num[(y-1)+x*5].value));
if((y+1)<=4)
num[i].near_flag|=(1<<(num[(y+1)+x*5].value));



/* 增加1 */
addnum(int i)

num[i].value+=1;
if(num[i].value==4)

num[i].value=0;
i=addnum(i+1);

return i;


main()


int i,sumbuff=0,sum=0;
int x,y;
for( i= 0; i< 26; i++)//初始化结构体

num[i].value= 0;
num[i].x= (int)(i/ 5); //初始化坐标
num[i].y= i% 5;


while( num[25].value== 0)

addnum(0); //0表示从第一位开始
flag();

if(!jdg_flag())


for(i=0;i<25;i++)
num[i].near_flag&=0; /*由于不符合条件,必须消除消权*/
continue;

for( i=0; i<25; i++)
sumbuff+=num[i].value; //能运算到这,说明符合条件.求和
if(sumbuff>sum)//输出目前得到的 满足条件的 最大和的 矩阵

for(x=0;x<5;x++)

for(y=0;y<5;y++)
printf("%d ",num[x*5+y].value);
printf("\n");


sum=sumbuff;
printf("now sum is:%d\n",sum);
printf("\n");

sumbuff=0;


for(x=0;x<5;x++)

for(y=0;y<5;y++)
printf("%d ",num[x*5+y].value);
printf("\n");





这是最笨的方法,一个个比较。。我跑半个小时了 - -!
一共有1000多万亿种,3G CPU,每秒30亿次浮点型运算。假设每次比较一次需要一个浮点型的话,需要100小时左右!那么。。。这个算法 将摇摇无期。。。 跑上一年我都不觉得奇怪。。
算法,基本没有。
1.当成二维坐标。
2.赋值结构体的时候,我是弄成类似25位的4进制数。每个结构体中的value为每位的数值。
26位为循环用的标志位。每次循环,4进制数,增加一。正好可以遍历所有的数。
额。。我写成的是 0,1,2,3四个数字填。
20:54--------------------------
目前情况是这样的:
3 2 1 0 1
1 0 2 2 3
3 2 2 1 2
2 1 0 0 0
0 0 0 0 0
now sum is:28
参考技术A 我目前所想到的,不一定完全正确
第一步:5*5的空格中每个空格初始化为1

第二步:把每个空格中的数字1再+1试试,符合2必须和1相邻条件则加一
然后每行就是21212,21212,21212,21212,21212

然后以此类推
参考技术B 每个格的上下左右是相邻,左上角左下角,右上角右下角,算不算相邻?我试试看能不能编出来追问

只有上下左右才算相邻

参考技术C 这个我以前解过,和一个很有名的堆房子手机游戏city bloxx的部分内容一样。
这个的数学论证方法在这:club。tech。163。com/bbs/mobile_0s22/92272018。html (把。改成.)
参考技术D 你的相邻是什么意思?斜着的(比如左上角算不)算么???一个格子旁边有8个,是最接近的那4个还是8个都可以?追问

只有最近的4个方向才可以

第5个回答  2011-08-29 int i;
int sum;
for(i=1;i<=10;i++)

sum = sum + i;


手头没用C++ 大概这个意思

以上是关于用c语言编程的主要内容,如果未能解决你的问题,请参考以下文章

C语言编程,求助!

编写脚本用的语言是C语言吗?

树莓派可以用c语言吗

用c语言编程

怎样用C语言编写这个程序

用C语言 怎么做出这个来