中国MOOC, C 语言代码和实验报告总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言实验报告总结”。
递归法计算游戏人员的年龄(4分)题目内容:
有n个人围坐在一起,问第n个人多大年纪,他说比第n-1个人大2岁;问第n-1个人,他说比第n-2个人大2岁,.....,问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁。第1个人说自己10岁,问第n个人多大年纪。递归函数原型:unsigned int ComputeAge(unsigned int n);提示: 递归公式
输入格式: “%u” 输出格式:
“The person's age is %un”
输入样例1: 5↙
输出样例1:
The_person's_age_is_18 输入样例2: 10↙
输出样例2:
The_person's_age_is_28 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(注意:在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。)
时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ unsigned int a,b;scanf(“%u”,&a);b=10+(a-1)*2;printf(“The person's age is %un”,b);
return 0;} 魔术师猜数(4分)题目内容:
在一种室内互动游戏中,魔术师要每位观众心里想一个三位数abc(a、b、c分别是百位、十位和个位数字),然后魔术师让观众心中记下acb、bac、bca、cab、cba五个数以及这5个数的和值。只要观众说出这个和是多少,则魔术师一定能猜出观众心里想的原数abc是多少。例如,观众甲说他计算的和值是1999,则魔术师立即说出他想的数是443,而观众乙说他计算的和值是1998,则魔术师说:“你算错了!”。请编程模拟这个数字魔术游戏。要求用函数实现,函数原型:int Magic(int m);其中形参m代表观众计算的和值。输入格式: “%d” 输出格式:
观众计算错误,魔术师给出的结论:“The sum you calculated is wrong!n” 观众计算正确,魔术师给出的结论:“The number is %dn” 输入样例1: 1998↙
输出样例1:
The_sum_you_calculated_is_wrong!输入样例2: 1999↙
输出样例2:
The_number_is_443 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(注意:在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。)
时间限制:500ms内存限制:32000kb
#include “stdio.h” int is(int i,int k){ int j=0,ii=i;while(ii){j+=ii%10;ii/=10;} if(j*222==k+i)return 1;else return 0;} int main(){ int i,j,k,sum;scanf(“%d”,&sum);k=0;for(i=100;i
return 0;} 寻找中位数v1.0(4分)题目内容:
编写一个函数返回三个整数中的中间数。函数原型:int mid(int a, int b, int c);功能是返回a,b,c三数中大小位于中间的一个数。输入格式: “%d%d%d” 输出格式:
“The result is %dn” 输入样例1: 12 6 18↙ 输出样例1: The_result_is_12 输入样例2:-9 7-2↙
输出样例2: The_result_is_-2 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(注意:在输出中,“_”代表空格,如果直接将上段示例粘贴到代码中,应将其替换为空格。)
时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ int a[4],max,min,ans,i;scanf(“%d%d%d”,&a[1],&a[2],&a[3]);max=1;for(i=1;ia[max])max=i;min=1;for(i=1;i
return 0;} 还原算术表达式(4分)题目内容: 编写程序求以下算式中XYZ的值。
输入格式: 输出格式:“X=%d,Y=%d,Z=%dn” 输入样例: 输出样例: X=3,Y=2,Z=1 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:31kb
#include “stdio.h” int main(){ int x,y,z;for(x=0;x
return 0;} 计算礼炮声响次数(4分)题目内容:
在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次礼炮声。输入格式:无 输出格式: n=%d 输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include “stdio.h” main(){ int n=0,t;for(t=0;t
兔子生崽问题(4分)题目内容:
假设一对小兔的成熟期是一个月,即一个月可长成成兔,那么如果每对成兔每个月都可以生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,一年以后可有多少对兔子(即当年12月份总计有多少对兔子,含成兔和小兔)?请编程求解该问题。
参考答案:依题意,兔子的繁殖情况如图所示。图中实线表示成兔仍是成兔或者小兔长成成兔;虚线表示成兔生小兔。观察分析此图可发现如下规律:(1)每月小兔对数 = 上个月成兔对数。
(2)每月成兔对数 = 上个月成兔对数 + 上个月小兔对数。综合(1)和(2)有:每月成兔对数 = 前两个月成兔对数之和。
用fn(n=1,2,„)表示第n个月成兔对数,于是可将上述规律表示为如下递推公式:
输入格式:无 输出格式:
每个月兔子对数的输出格式: “% 4d” 第12个月的兔子总数的输出格式: “nTotal=%dn” 输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include“stdio.h” int main(){ int i,a[13];a[1]=1;a[0]=1;for(i=2;i
return 0;} 抓交通肇事犯(4分)题目内容:
一辆卡车违犯交通规则,撞人后逃跑。现场有三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。现在请根据以上线索帮助警方找出车号以便尽快破案。
[提示]:假设这个4位数的前两位数字都是i,后两位数字都是j,则这个可能的4位数 k = 1000*i + 100*i + 10*j + j 式中,i和j都在0~9变化。此外,还应使k=m*m,m是整数。由于k是一个4位数,所以m值不可能小于31。输入格式:无
输出格式:“k=%d,m=%dn” 输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include“stdio.h” int main(){ int i,m,ans;for(m=31;m
return 0;} 检验并打印幻方矩阵。(4分)题目内容:
幻方矩阵是指该矩阵中每一行、每一列、每一对角线上的元素之和都是相等的。从键盘输入一个5×5的矩阵并将其存入一个二维整型数组中,检验其是否为幻方矩阵,并将其按指定格式显示到屏幕上。输入格式: “%d” 输出格式:
如果是幻方矩阵,输出提示信息: “It is a magic square!n” 矩阵元素的输出: “% 4d”(换行使用“n”)
如果不是幻方矩阵,输出提示信息: “It is not a magic square!n” 输入样例1: 17_24_1_8_15 23_5_7_14_16 4_6_13_20_22 10_12_19_21_3 11_18_25_2_9(输人样例中“_”代表空格)输出样例1:
It is a magic square!**17**24***1**8**15 **23***5***7**14**16 ***4***6**13**20**22 **10**12**19**21***3 **11**18**25***2***9(输出样例中“*”代表空格)输入样例2: 1_0_1_6_1 3_1_1_1_1 1_1_1_1_2 1_1_1_1_1 9_1_7_1_1(输人样例中“_”代表空格)输出样例2:
It is not a magic square!注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
(输人样例中“_”代表空格,输出样例中“*”代表空格)时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ int a[6][6];int i,j;for(i=1;i
return 0;} ISBN识别码判断(4分)题目内容:
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2„„以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即0×1+6×2+„„+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。程序运行结果示例1: 0-123-41562-4↙ Right 程序运行结果示例2: 0-123-41562-7↙ 0-123-41562-4 输入格式: 用gets()输入字符串 输入只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN的格式要求)。输出格式:
输入的ISBN号码的识别码正确,输出信息: “Right” 输入的ISBN号码的识别码错误,按照规定的格式,输出正确的ISBN号码(包括分隔符“-”),输出格式:“%s” 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!输入样例: 输入样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int xg(char *s,int k){ if(k==10)*(s+12)='X';else *(s+12)='0'+k;} int main(){ char s[14];int a[10],i,ans=0;gets(s);a[1]=s[0]-'0';a[2]=s[2]-'0';a[3]=s[3]-'0';a[4]=s[4]-'0';a[5]=s[6]-'0';a[6]=s[7]-'0';a[7]=s[8]-'0';a[8]=s[9]-'0';a[9]=s[10]-'0';for(i=1;i
return 0;} 摘苹果(4分)题目内容:
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。程序运行结果示例1:
200 140 150 156 187 197 149↙ 110↙ 4 程序运行结果示例2:
210 102 153 147 110 130 182 88 113↙ 100↙ 6 输入格式: “%d” 输入包括两行数据:
第1行包含10个100到200之间的整数(包括100和200,以厘米为单位),分别表示10个苹果到地面的高度。两个相邻的整数之间用一个空格隔开。
第2行只包括一个100到120之间的整数(包含100和120,以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。输出格式: “%d” 注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ int app[11],i,ans=0,h;for(i=1;i
return 0;} 求最大素数(4分)题目内容:
求500以内的10个最大素数及其和,并分别输出这10个最大素数及其和。要求10个素数按从大到小的顺序输出。输入格式: 无 输出格式:
10个最大素数的输出格式:“% 6d” 总和的输出格式:“nsum=%dn” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int [96];int is(int k){ int i=1;while([i]*[i]
return 1;} int main(){ int n=2,i,sum=0;[1]=2;[2]=3;for(i=4;i=n-9;i--){ printf(“% 6d”,[i]);sum+=[i];} printf(“nsum=%dn”,sum);
return 0;} 字符串逆序(4分)题目内容:
用字符数组作函数参数编程,利用一个数组实现字符串(允许输入带空格的字符串)的逆序存放。要求如下:
(1)在主函数中从键盘输入字符串,字符串的最大长度为80个字符。
调用Inverse()函数将字符串逆序存放,然后在主函数中输出逆序后的字符串。(2)在子函数Inverse()中实现字符串的逆序存放。函数原型为: void Inverse(char str[]);程序运行结果示例1: Input a string: abcde↙
Inversed results: edcba 程序运行结果示例2: Input a string: hello↙
Inversed results: olleh 输入格式: 用gets()输入字符串 输出格式:
输入提示信息:“Input a string:n” 输出提示信息:“Inversed results:n” 用puts()输出字符串
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” #include “string.h” int dh(char *s,int len){ int i;char c;for(i=0;i
return 0;}
水手分椰子(4分)题目内容:
五个水手在岛上发现一堆椰子,先由第1个水手把椰子分为等量的5堆,还剩下1个给了猴子,自己藏起1堆。然后,第2个水手把剩下的4堆混合后重新分为等量的5堆,还剩下1个给了猴子,自己藏起1堆。以后第3、4个水手依次按此方法处理。最后,第5个水手把剩下的椰子分为等量的5堆后,同样剩下1个给了猴子。请用迭代法编程计算并输出原来这堆椰子至少有多少个。
输入格式: 无
输出格式:“y=%dn” 输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include “stdio.h” int can(int k){ int i;for(i=1;i
return 0;} 找最值(4分)题目内容:
从键盘任意输入10个整数,用指针变量作函数参数编程计算最大值和最小值,并返回它们所在数组中的位置。函数原型如下所示:
int FindMax(int num[], int n, int *pMaxPos);//函数返回最大值,pMaxPos返回最大值所在的下标
int FindMin(int num[], int n, int *pMinPos);//函数返回最小值,pMaxPos返回最小值所在的下标
程序运行结果示例: Input 10 numbers:-1 2 3 45 92 8 9 12 7 8↙
Max=92,Position=4,Min=-1,Position=0
输入格式: “%d” 输出格式:
提示信息:“Input 10 numbers:n” 输出结果:“Max=%d,Position=%d,Min=%d,Position=%dn” 输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include “stdio.h” int Findmax(int *a,int *p){ int i;*p=0;for(i=1;i
return 0;} int Findmin(int *a,int *p){ int i;*p=0;for(i=1;i*(a+i))*p=i;
return 0;} int main(){ int a[10],maxp,minp,i;printf(“Input 10 numbers:n”);for(i=0;i
return 0;} 星期查找(4分)题目内容:
任意输入英文的星期几,通过查找如图所示的星期表,输出其对应的数字,若查到表尾,仍未找到,则输出错误提示信息。
提示:用一个二维字符数组weekDay来存放如图所示的星期表的内容(字符串)。输入待查找的字符串,然后在星期表中顺序查找与输入字符串相匹配的字符串。找到的字符串在星期表数组中的第一维下标(行号)即为题目所求。程序运行结果示例1: Please enter a string: Friday↙ Friday is 5 程序运行结果示例2: Please enter a string: Fruday↙ Not found!输入格式: 字符串输入采用gets()函数 输出格式:
输入提示信息:“Please enter a string:n” 找到了,输出:“%s is %dn” 没找到,输出:“Not found!n” 输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include “stdio.h” #include “string.h” int main(){ char s[][10]={“Sunday”,“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”};char [10];int i;printf(“Please enter a string:n”);gets();for(i=0;i
return 0;} 杨辉三角形(4分)题目内容:
编程打印具有如下形式的杨辉三角形,其中输出数据的行数n从键盘输入,并且n
程序运行结果示例2: Input n(n
输入格式: “%d” 输出格式:
输入提示信息:“Input n(n
输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include ”stdio.h“ #include ”string.h“ int main(){ int a[11][11],n,i,j;printf(”Input n(n
return 0;} 找数组最值(4分)题目内容:
按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。void InputArray(int *p, int m, int n);int FindMax(int *p, int m, int n, int *pRow, int *pCol);//函数返回最大值,pRow和pCol分别返回最大值所在的行列下标
例如,程序的1次运行结果如下: Input n: 3,4↙
Input 3*4 array: 1 2 3 4↙ 5 6 7 8↙ 9 0-1-2↙
max=9,row=2,col=0 输入格式: 提示信息: “Input m,n:n” 输入数组维数:“%d,%d” 提示信息: “Input %d*%d array:n” 输入数组元素:“%d” 输出格式: “max=%d,row=%d,col=%dn” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ int a[11][11],i,j,m,n,maxi,maxj,max;printf(“Input m,n:n”);scanf(“%d,%d”,&m,&n);printf(“Input %d*%d array:n”,m,n);for(i=1;i
return 0;} 冒泡排序(4分)题目内容:
采用冒泡法进行升序排序法的基本原理是:对数组中的n个数执行n-1遍检查操作,在每一遍执行时,对数组中剩余的尚未排好序的元素进行如下操作:对相邻的两个元素进行比较,若排在后面的数小于排在前面的数,则交换其位置,这样每一遍操作中都将参与比较的数中的最大的数沉到数组的底部,经过n-1遍操作后就将全部n个数按从小到大的顺序排好序了。程序的某次运行结果如下: Input n:10↙
Input 10 numbers:2 9 3 4 0 6 8 7 5 1↙
Sorting results: 0 1 2 3 4 5 6 7 8 9 输入格式: “%d” 输出格式:
输入数据个数提示:“Input n:” 输入数据提示:“Input %d numbers:” 输出提示:“Sorting results:” 输出格式:“% 4d” 输入样例: 输出样例: 时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ int a[110],n,i,j;printf(“Input n:”);scanf(“%d”,&n);printf(“Input %d numbers:”,n);for(i=1;ia[j+1]){ a[j]+=a[j+1];a[j+1]=a[j]-a[j+1];a[j]=a[j]-a[j+1];} printf(“Sorting results:”);for(i=1;i
return 0;}删除字符串中与某字符相同的字符(4分)题目内容:
在字符串中删除与某字符相同的字符,要求用字符数组作函数参数。程序运行结果示例: Input a string: hello, my friend!↙ Input a character:!↙
Results:hello, my friend 输入格式: 字符串输入用 gets()函数
单个字符输入用 getchar()函数 输出格式:
输入字符串的提示信息: “Input a string:n” 输入单个字符的提示信息: “Input a character:n” 输出格式: “Results:%sn” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int main(){ char a[100],c;int i;printf(“Input a string:n”);gets(a);printf(“Input a character:n”);c=getchar();i=0;printf(“Results:”);while(a[i]!=' '){ if(a[i]!=c)printf(“%c”,a[i]);i++;} printf(“n”);
return 0;}求最大数和最小数的最大公约数(4分)题目内容:
从键盘输入10个正整数,求出最大数,最小数,以及他们的最大公约数。要求用数组实现。程序运行结果示例1: Input 10 numbers: 15 23 56 87 94 105 78 19 22 43↙ maxNum=105 minNum=15 15
程序运行结果示例2: Input 10 numbers: 33 1 2 9 8 7 5 4 0 10↙ maxNum=33 minNum=0
输入格式: “%d” 输出格式:
输入提示信息:“Input 10 numbers:n” 最大数输出格式:“maxNum=%dn” 最小数输出格式:“minNum=%dn” 最大公约数输出格式:“%d” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int gcd(int i,int j){ if(imax)max=a[i];if(a[i]
return 0;} 百万富翁的换钱计划(4分)题目内容:
有一天,一位百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,陌生人对百万富翁说:“我每天给你10万元,而你第一天只需给我1分钱,第二天我仍给你10万元,你给我2分钱,第三天我仍给你10万元,你给我4分钱„„。你每天给我的钱是前一天的两倍,直到满一个月(30天)为止”,百万富翁很高兴,欣然接受了这个契约。请编程计算在这一个月中陌生人总计给百万富翁多少钱,百万富翁总计给陌生人多少钱。输入格式: 无
输出格式:
输出百万富翁给陌生人的钱: “to Stranger: %.2f yuann” 输出陌生人给百万富翁的钱: “to Richman: %.2f yuann” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include“stdio.h” int main(){ int i;double st=0,mi=0,mo=1;for(i=1;i
return 0;} 用计数控制的循环实现正数累加求和(4分)题目内容: 输入一些整数,编程计算并输出其中所有正数的和,输入负数时不累加,继续输入下一个数。输入零时,表示输入数据结束。要求最后统计出累加的项数。程序运行结果示例: Input a number: 1↙
Input a number: 3↙
Input a number: 4↙
Input a number: 2↙
Input a number:-8↙ Input a number:-9↙
Input a number: 0↙
sum=10,count=4
输入格式: “%d” 输出格式:
输入提示信息: “Input a number:n” 输出格式: “sum=%d,count=%dn” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include“stdio.h” int main(){ int i,ans=0,c=0;do { printf(“Input a number:n”);scanf(“%d”,&i);if(i>0){ans+=i;c++;} }while(i!=0);printf(“sum=%d,count=%dn”,ans,c);
return 0;} 平方根表(4分)题目内容:
按如下格式输出100以内整数的平方根表。
输入格式: 无 输出格式:
输出表头: “% 7d” 输出每行的开头数字: “%d” 输出第m行n列中的值:“%7.3f” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include“stdio.h” #include“math.h” int main(){ int i,j;for(i=0;i
return 0;} 最大公约数(4分)题目内容:
按照如下函数原型编写子函数计算正整数a和b的所有公约数。第一次调用,返回最大公约数。以后只要再使用相同参数调用,每次返回下一个小一些的公约数。无公约数时,函数CommonFactors()返回-1,主函数中不输出任何信息。函数原型: int CommonFactors(int a, int b)程序运行结果示例1:
Input a and b: 100,50↙
Common factor 1 is 50 Common factor 2 is 25 Common factor 3 is 10 Common factor 4 is 5 Common factor 5 is 2 Common factor 6 is 1
程序运行结果示例2:
Input a and b: 7,-3↙
输入格式: “%d,%d” 输出格式:
输出公约数: “Common factor %d is %dn” 输入提示信息:“Input a and b:n” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include“stdio.h” int main(){ int i,j,k,ans=0;printf(“Input a and b:n”);scanf(“%d,%d”,&i,&j);if(i=1;k--)if(i%k==0&&j%k==0){ ans++;printf(“Common factor %d is %dn”,ans,k);}
return 0;}
实验一数据类型和表达式实验(验证性实验
2学时)
一、目的要求:
(1)了解C语言中数据类型的意义。(2)理解常用运算符的意义。
(3)掌握C语言表达式的运行规则。(4)编写实验报告。
二、实验内容(参考实验指导书):
1、计算由键盘输入的任何两个双精度数据的平均值。(1)算法描述:将数据代入公式(a+b)/2,输出结果。(2)源代码及说明:
#include main(){ double a,b;
scanf(“%lf %lf”,&a,&b);
printf(“%lf”,(a+b)/2);}
(3)测试数据:2 6(4)运行结果:4.00000(5)问题及解决方法:问题:格式符使用“%f ”,输出结果总是 0.000000。
解决方法:格式符改为”%lf ”。
2、写一个输入7个数据的程序,把输入的数据代入a + b *(c – d)/ e * f – g 表达式进行运算。
(1)算法描述:将数据代入公式a + b *(c – d)/ e * f – g,输出结果。(2)源代码及说明:
#include main(){ int a,b,c,d,e,f,g;scanf(“%d %d %d %d %d %d %d”, &a,&b,&c,&d,&e,&f,&g);printf(“%d”, a+b*(c-d)/e*f-g);}(3)测试数据:1 2 3 4 5 6 7(4)运行结果:-6(5)问题及解决方法:无
3、编写一个C语言程序,测试下列各表达式:
i, j
i + 1 , j + 1 i++ , j++ ++i , ++j i+++++j(1)算法描述:定义变量并将其分别代入各表达式中,输出结果。(2)源代码及说明:
#include main(){ int i=2,j=3;printf(“%d %dn”,i,j);
printf(“%d %dn”,i+1,j+1);printf(“%d %dn”,i++,j++);
i=2,j=3;printf(“%d %dn”,++i,++j);
i=2,j=3;
printf(“%dn”,(i++)+(++j));
}(3)测试数据:2 3(4)运行结果:2 3;3 4;2 3;3 4;6(5)问题及解决方法:
问题:没有注意变量的使用。解决方法:重新定义变量。
4、输入存款金额money,存期year和年利率rate,根据下列公式计算存款到期时的利息interest(税前),输出时保留2位小数。
interest = money(1+rate)yearmoney输出结果。
(2)源代码及说明:
#include #include main(){ double money,rate,interest;
int year=0;
scanf(“%lf %lf”,&money,&rate);
scanf(“%d”,&year);interest=money*pow(1+rate, year)-money;printf(“%.2lf”,interest);}(3)测试数据:100 0.1 2(4)运行结果:21.00(5)问题及解决方法:
问题:求利率的多次幂
解决方法:利用math 函数库里的pow()函数
5、输入华氏温度,输出对应的摄氏温度。计算公式如下:
c = 5 *(f32)/ 9,输出结果。(2)源代码及说明:
#include main(){ double c,f;scanf(“%lf”,&f);c=5*(f-32)/9;printf(“摄氏温度为: %lf”,c);}
(3)测试数据:90.0(4)运行结果:32.222222(5)问题及解决方法:无
三、实验总结:
1.通过实验我清楚的知道了双精度型数据的格式说明符的使用。2.学会使用pow()函数。
实验二分支结构程序设计实验(验证性实验
2学时)
一、目的要求:
(1)了解和掌握分支语句的使用,包括if语句的各种形式以及switch语句。(2)编写实验报告。
二、实验内容(参考实验指导书):
1、编写一个程序完成输入一个整数,输出它的符号。(1)算法描述:
if(i>0)
输出“+”。
if(i
输出“-”。
if(i=0)
输出“0”。(2)源代码及说明:
#include main()
{
int i;
printf(“请输入一个整数:n”);
scanf(“%d”,&i);
if(i>0)
{
printf(“ + n”);
}
else if(i=0)
printf(“0n”);
else
printf(“(5)问题及解决方法:无
2、请编写居民应交水费,并提供各种测试数据。
居民应交水费y(元)与月用水量x(吨)的函数关系式如下:
0
x
0 ≤ x ≤ 15
2.5x – 10.5 x > 15(1)算法描述:
if x f(x)=0;if 0f(x)=4x/3 if x>15 =>f(x)=2.5x-10.5(2)源代码及说明:
#include main(){ float x,y;
scanf(”%f“,&x);if(x
y=0;
printf(”应交水费%f 元n“,y);} else if(x>=0&&x
y=4*x/3;
printf(”应交水费%f 元n“,y);} else
{
y=2.5 * x-10.5;
printf(”应交水费%f 元n“,y);} }(3)测试数据:-1
20(4)运行结果:0.000000 10.666667 35.200000(5)问题及解决方法:无
3、请根据输入的学生成绩给出成绩等级的判断,判断规则如下:
如果输入的成绩大于等于90,则输出优秀;
如果输入的成绩小于90、大于等于80,则输出良好;
如果输入的成绩小于80、大于等于70,则输出中等;
如果输入的成绩小于70、大于等于60,则输出及格;
其他输出不及格。(1)算法描述:
if score>=90 输出优秀 if 80 main(){ int score;scanf(”%d“,&score);if(score>=0&&score
switch(score/10)
{
case 10:
} case 9:printf(”优秀“);break;
case 8:printf(”良好“);break;case 7:printf(”中等n“);break;
case 6:printf(”及格n“);break;case 5: case 4: case 3: case 2: case 1: case 0:printf(”不及格n“);break;default: printf(”你输入的成绩非法n“)} printf(”你输入的成绩非法n“);}(3)测试数据:98
-22(4)运行结果:优秀良好中等及格不及格输入不合法输入不合法(5)问题及解决方法:
问题:大于100的分数未给出明确结果 解决方法;在代码中加上对高于100分的限制
4、运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:
s = 250km
没有折扣
250km ≤ s
500km ≤ s
1000km ≤ s
3000km ≤ s
15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为:
f = p * w * s *(1 – d)请编程实现:从键盘输入基本运费p,货物重w,距离s,计算输出用户最终需要支付的运费。
(1)算法描述:
if(s
d=0.0
if(s>=250&&s
d=0.02
if(s>=500&&s
d=0.05
if(s>=1000&&s
if(s>=2000&&s
d=0.15 然后再将数据代入公式money=p*w*s*(1-d),输出money。(2)源代码及说明: #include main(){ double p,w,s,money,d;scanf(”%lf %lf %lf“,&p,&w,&s);
if(s
d=0.0;} else if(s>=250&&s
d=0.02;} else if(s>=500&&s
d=0.05;} else if(s>=1000&&s
d=0.08;} else if(s>=2000&&s
d=0.1;} else
d=0.15;money=p*w*s*(1-d);printf(”总运费为:%.2lf“,money);}(3)测试数据:10 2 230(4)运行结果:4600.00(5)问题及解决方法:无
三、实验总结:掌握了if和switch分支语句的使用。
实验三循环结构程序设计实验(验证性综合性实验
2学时)
一、目的要求:
(1)使用循环语句完成累乘、图像输出的程序编写。(2)掌握较复杂结构程序的编写。(3)掌握程序调试的方法。(4)编写实验报告。
二、实验内容(参考实验指导书):
1、已知xyz + yzz = 532,其中x、y、z都是数字(0~9),编写一个程序求出x、y、z分别代表什么数字。(1)算法描述: for i=1到9
for j=1到9
for z=1到9
if满足xyz + yzz = 532 则输出x、y、z(2)源代码及说明: #include main(){ int x,y,z;for(x=0;x
for(y=0;y
{
for(z=0;z
{
if(x*100+y*10+z+y*100+z*10+z==532)
printf(”%d %d %dn“,x,y,z);
}
} } }(3)测试数据:(4)运行结果:3 2 1(5)问题及解决方法:无
2、编写一个程序打印如下对称图形(行数由键盘输入1~9范围的值),例如下面是输入的数字4时的情形:
4444444
33333
222
222
33333
4444444(1)算法描述:
for(i=number;i>0;i--){
for(k=number;k>=i;k--){
printf(”“);
}
for(j=0;j
printf(”%d“,i);
}
for(i=2;i
for(k=number;k>=i;k--)
}
for(j=0;j
printf(”%d“,i);
}(2)源代码及说明: #include main(){ int number;int i,j,k;scanf(”%d“,&number);for(i=number;i>0;i--){
for(k=number;k>=i;k--)
{
printf(”“);
}
for(j=0;j
{
printf(”%d“,i);
}
printf(”n“);
} } for(i=2;i=i;k--){
printf(”“);} for(j=0;j
printf(”%d“,i);}
printf(”n“);}(3)测试数据:4(4)运行结果:4444444
33333
222
222
33333
4444444(5)问题及解决方法:无
3、学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。(1)算法描述:
for(x=1;x main(){
int x;for(x=1;x
if(x%5==2 && x%7==3 && x%3==1)
printf(”%dn“,x);} }(3)测试数据:
(4)运行结果:52 157 262 367 472 577 682 787 892 997(5)问题及解决方法:无
4、学校某班A、B、C、D四位同学中的一位做了好事不留名,表扬信来了之后,班主任问这四位是谁做了好事,四位回答如下:
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。
已知三个人说的是真话,一个人说的是假话。请根据这些信息,找出做了好事的人。(1)算法描述:
for(x='A';x
(2)源代码及说明:
#include main(){ char x;for(x='A';x
if((x!='A')+(x=='C')+(x=='D')+(x!='D')==3)
printf(”%c做了好事n“,x);} }(3)测试数据:
(4)运行结果:C做了好事(5)问题及解决方法:无
三、实验总结:通过这几个实验基本掌握了循环的用法和循环嵌套的使用。
实验四数组程序设计实验(验证性综合性实验
4学时)
一、目的要求:
(1)掌握一维和二维数组的使用技巧。(2)编写实验报告。
二、实验内容(参考实验指导书):
1、从键盘输入一个长度为N(比如10)的整型数组,而后将数组中小于零的元素移动到数组的前端,大于零的元素移到数组的后端,等于零的元素留在数组中间。比如原来数组为:2-5-89 75 0-89 0 93 48 0,经过处理后的数组为:-5-89-89 0 0 0 75 93 48 2。由于不要求数组有序,所以不允许用排序方法。提示:
1)输入N个数据,构建数组。
2)按照要求确定数据的位置,需要注意循环条件的确定、0数据元素往中间推的实现过程以及数组处理的方向。(1)算法描述: for(从第一个数到第十个数){ for(从第i+个数到第十个数){ 首先判断前一个数是否大于零,再判断后一个数是与零之间的关系,如果不是等于零,则需交换位置。} }(2)源代码及说明: #include main(){ int N,i,end=0;scanf(”%d“,&N);int a[N];int b[N];int j=0;
int st =0;int m=N-1;for(i=0;i
scanf(”%d“,&a[i]);} for(i=0;i
if(a[i]
{
b[j++]=a[i];
st++;
}
if(a[i]>0)
{
b[m--]=a[i];
end=m;
} } for(i=st;i
b[i]=0;} for(j=0;j
printf(”%d “,b[j]);} }(3)测试数据:10
2-5-89 75 0-89 0 93 48 0(4)运行结果:-5-89-89 0 0 0 75 93 48 2(5)问题及解决方法:
问题:对大于0和小于0的数进行分类,再重新组合。解决方法:重新定义一个数组,依次放入数据。
2、设数组a的定义如下:
int a[20] = {2,4,6,8,10,12,14,16};已存入数组中的数据值已经按由小到大的顺序存放,现从键盘输入一个数据,把它插入到数组中,要求插入新数据以后,数组数据仍然保持有序。请编写一个程序实现上述功能。提示:
1)定义整型数组并初始化。2)从键盘输入一个数据。
3)将该数据插入到数组中,由于要保证插入的数组仍然有序,所以需要查找插入的位置。4)输出插入数据以后的数组。(1)算法描述:
遍历数组找到插入数在数组中的位置
for(i=0;i
if(a[i]>x)
break;}
j=i;重新排列插入数后面的数
for(i=8;i>=j;i--){
a[i+1]=a[i];}
a[j]=x;最后输出插入数据后的数组(2)源代码及说明: #include main(){ int a[20]={2,4,6,8,10,12,14,16};int n,i,k;scanf(”%d“,&n);for(i=0;i
if(n
break;} k = i;for(i=9;i>=k;i--){
a[i+1]=a[i];} a[k]=n;for(i=0;i
printf(”%4d“,a[i]);} }(3)测试数据:3(4)运行结果:2 3 4 6 8 10 12 14 16 0 0 0 0 0 0 0 0 0 0 0(5)问题及解决方法:无
3、写一个3 x 5矩阵的转置程序,输出其原矩阵的值和转置以后的结果。提示:
1)定义一个二维数组及相关变量。
2)对二维数组赋值,可以由键盘输入,也可以通过其他方式赋值。3)输出转置前的二维数组。
4)对二维数组中的值进行转置。5)输出转置后的二维数组中的值。(1)算法描述:
从键盘中输入数组
for(i=0;i
for(j=0;j
scanf(”%d“,&a[i][j]);交换数组对应数值并输出
for(i=0;i
for(j=0;j
b[i][j]=a[j][i];printf(”%d “,b[i][j])(2)源代码及说明: #include main(){ int a[3][5]={1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};int b[5][3];int i,j;for(i=0;i
for(j=0;j
{
b[i][j]=a[j][i];
printf(” %d“,b[i][j]);
}
printf(”n“);} }(3)测试数据:1 2 3 4 5
9
9(4)运行结果:1 5 1
3
5
7
9(5)问题及解决方法:无
4、编程实现随机产生10个位于区间[100 200]互不相等的整数,并将其按降序排序和输出。(1)算法描述: 产生随机数
#include #include #define random(x)(100+rand()%101)存入数组for(i=0;i
a[i]=random(200);
printf(”%4d“,a[i]);} 进行排序(选择)for(i=0;i
for(j=i+1;j
{
if(a[i]
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
} }(2)源代码及说明: #include #include #include main(){
int x;int a[10];int i,j,m = 1;int temp;srand((unsigned)time(NULL));while(1)
{
for(i=0;i
if(a[j] == x)
{
m == 0;
}
}
if(m == 1){
a[i]=x;} else {
i--;}
} break;} for(i=0;i
if(a[i]
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
} } } for(i=0;i
printf(”%d “,a[i]);} }(3)测试数据:137 114 155 107 146 173 160 166 172 186(4)运行结果:186 173 172 166 160 155 146 137 114 107(5)问题及解决方法:无
三、实验总结:
(1)熟练地掌握了选择排序和穷举算法的使用;(2)掌握了对二维数组的简单的使用。
实验五函数实验
(验证性综合性实验
5学时)
一、目的要求:
(1)学习函数的编程思想,编写一个包括3~4个函数的程序。(2)掌握函数中参数传递的两种方式和函数的相互调用。(3)编写实验报告。
二、实验内容(参考实验指导书):
1、写一个函数int digit(int n , int k),它返回数n的从右向左的第k个十进数字值。例如,函数调用digit(1234,2)将返回值3。(1)算法描述:
int digit(int n , int k){
for(i=0;i
d=n%10;
n=n/10;
}
return d;}
用scanf输入数,调用函数int digit输出结果(2)源代码及说明: #include int digit(int n,int k){ int i;int m;for(i=0;i
m= n%10;
n=n/10;} return m;} main(){ int x;x = digit(1234,2);printf(”%dn“,x);}(3)测试数据:digit(1234,2)将返回值3(4)运行结果:3
(5)问题及解决方法:无
2、写一个函数int isprime(int n),当n是质数时,函数返回非零值;当n是合数时,函数返回零值。
(1)算法描述:
int isprime(int n){ for(i=2;i
if(n%i==0)
return 0;
else
return 1;
}
}
if(n==1)
return 0(2)源代码及说明:
#include int isprime(int n){ int i;if(n==1){
return 0;} for(i=2;i
if(n%i==0){
return 0;
} } return 1;} main(){ int r;r = isprime(5);
} printf(”%dn“,r);r = isprime(8);printf(”%dn“,r);(3)测试数据:2 4(4)运行结果:1 0
(5)问题及解决方法:无
3、写一个函数reverse(char s[]),将字符串s[]中的字符串倒序输出。试分别用递归和非递归两种形式编写。(1)算法描述:
递归:递归的出口: if(n==1)
printf(”%c “,s[0]);return;递归的形式
printf(”%c “,s[n-1]);
s[n-1]=' ';
reverse(s);非递归:
利用倒序特点,进行交换
for(i=0;i
temp=s[i];s[i]=s[n-1-i];s[n-1-i]=temp;}(2)源代码及说明: 递归:
void reverse(char s[]){ int n;n=strlen(s);if(n==1){
printf(”%c “,s[0]);
return;} printf(”%c “,s[n-1]);s[n-1]=' ';reverse(s);}
非递归:
void reverse(char s[]){
} int n;int i,j;char temp;n=strlen(s);if(n==1){ printf(”%c “,s[0]);return;} for(i=0;i
temp=s[i];s[i]=s[n-1-i];s[n-1-i]=temp;} for(i=0;i
(5)问题及解决方法:
4、写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性。(5)一个数如果从左到右和从右到左读,数字是相同的,则称这个数字为回文数,比如89
8、12
21、15651都是回文数。求:既是回文数又是质数的5位十进制数有多少个?要求:回文判断和质数判断都需要通过子函数实现,输出的时候要求5个数字一行。(1)算法描述:
用递归和非递归写出函数reverse(char s[])递归:递归的出口: if(n==1)
printf(”%c “,s[0]);return;递归的形式
printf(”%c “,s[n-1]);
s[n-1]=' ';
reverse(s);非递归:
利用倒序特点,进行交换
for(i=0;i
temp=s[i];s[i]=s[n-1-i];s[n-1-i]=temp;} 写出主函数,调用函数reverse(char s[])(2)源代码及说明: 递归:
#include #include void reverse(char s[]){ int n;n=strlen(s);if(n==1){
printf(”%c “,s[0]);
return;} printf(”%c “,s[n-1]);s[n-1]=' ';reverse(s);} int main(){ char text[10]={'a','b','c','d','e','f','g','h','m','o'};int i,n=10;for(i=0;i
printf(”%c “,text[i]);} printf(”n“);
} printf(”倒序为:n“);reverse(text);非递归:
#include #include void reverse(char s[]){ int n;int i,j;char temp;n=strlen(s);if(n==1){
printf(”%c “,s[0]);
return;} for(i=0;i
temp=s[i];
s[i]=s[n-1-i];
s[n-1-i]=temp;} for(i=0;i
printf(”%c “,s[i]);}
} int main(){ char text[10]={'a','b','c','d','e','f','g','h','m','o'};int i,n=10;for(i=0;i
printf(”%c “,text[i]);} printf(”n“);printf(”倒序为:n“);reverse(text);}(3)测试数据:a b c d e f g h i j(4)运行结果:j i h g f e d c b a(5)问题及解决方法:无
5、在n个已排好序(设为从小到大)的数据(数或字符串)中查找某一个数据,如果找到了,就指出其在n个数中的位置;否则给出无该数据的信息。请用递归的方法实现二分查找来实现这一查找过程。
提示:采用二分法求解本问题的基本思路是:设数列为a1,a2,„,an,被查找的数为x,则查找首先对am(m =(n + 1)/ 2)进行,于是得到三种情形。若x > am,则x只可能在区间[am + 1 , an] 若x
从上面的分析发现,这个过程很适合用递归来实现。(1)算法描述:
for(i=10000;i
if(hw(i))
{
if(isprime(i)==1)
{
cnt++;
}
} } } printf(”n合计:%d个n“,cnt);(2)源代码及说明: #include #include int hw(int n);int isprime(int n);void main(){ int i;int cnt=0;for(i=10000;i
if(hw(i))
{
if(isprime(i)==1)
{
cnt++;
}
} } printf(”n合计:%d个n“,cnt);} int isprime(int n){
int i=2;while(i
if(n%i==0)
return 0;
i++;} return 1;} int hw(int n){ int m=0;int t=n;while(t){
m=m*10+t%10;
} t/=10;} return m==n;(3)测试数据:
(4)运行结果:93个(5)问题及解决方法:无
三、实验总结:掌握了函数中参数传递的两种方式和函数的相互调用。
实验六指针实验
(验证性综合性实验
4学时)
一、目的要求:
(1)用指针作为函数参数完成字符串的传递。(2)掌握函数中参数传递的两种方式。(3)编写实验报告。
二、实验内容(参考实验指导书):
(1)编写一个函数char *delk(char *sp),把sp所指向的字符串中所有的“$”字符删除,并把处理后的字符串指针返回。(1)算法描述:
char *b=”$keidk$kd“;char *a=(char*)malloc(sizeof(b));
delk(b,a);(2)源代码及说明: #include #include char *delk(char *sp,char *q){ char *p=sp;while(*p!=' '){
if(*p!='$'){
*q=*p;
q++;
}
p++;} } main(){ char *b=”$keidk$kd“;char *a=(char*)malloc(sizeof(b));
delk(b,a);printf(”%sn“,a);}(3)测试数据:$abcd$efgh(4)运行结果:abcdefgh(5)问题及解决方法:无
2、写一个函数int find(char *s1, char *s2),函数find的功能是查找串s1中是否包含指定的词(s2指向),如果存在则返回第1次出现的位置,否则返回-1.约定串中的词由1个或1个以上的空格符分隔。(1)算法描述:
char s1[]=”abc bc cd ef“;char s2[]=”we";int a=find(s1,s2);(2)源代码及说明: #include #include int find(char *s1,char *s2){ char *p=s1;char *q;int k=0;int r;while(*p!=' '){
while(*p==' '){
p++;
}
q=p;
while(*q!=' '&&*q!=' '){
q++;
}
char c=*q;
*q=' ';
r=strcmp(p,s2);
k=k+1;
if(r==0){
return k;
}
p=q+1;
} if(r!=0){