用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 "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语言编程的主要内容,如果未能解决你的问题,请参考以下文章