第一篇:中国MOOC, 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<=999;i++)if(is(i,sum)){k=i;break;} if(k==0)printf(“The sum you calculated is wrong!n”);else printf(“The number is %dn”,k);
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;i<=3;i++)if(a[i]>a[max])max=i;min=1;for(i=1;i<=3;i++)if(a[i]< a[min])min=i;ans=6-max-min;printf(“The result is %dn”,a[ans]);
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<=9;x++)for(y=0;y<=9;y++)for(z=0;z<=9;z++)if(x*100+y*110+z*12==532)printf(“X=%d,Y=%d,Z=%dn”,x,y,z);
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<=20*7;t++){ if(t%5 == 0 && t <=20*5){ n++;continue;} if(t%6 == 0 && t <=20*6){ n++;continue;} if(t%7 == 0){ n++;} } printf(“n=%dn”, n);} 兔子生崽问题(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<=12;i++)a[i]=a[i-1]+a[i-2];for(i=1;i<=12;i++)printf(“% 4d”,a[i]);printf(“nTotal=%dn”,a[12]);
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<=100;m++){ ans=m*m;if(((ans/100)%11==0)&&((ans%100)%11==0))printf(“k=%d,m=%dn”,ans,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<=5;i++)for(j=1;j<=5;j++)scanf(“%d”,&a[i][j]);for(i=1;i<=5;i++){ a[i][0]=0;for(j=1;j<=5;j++)a[i][0]+=a[i][j];if(a[i][0]!=a[1][0]){printf(“It is not a magic square!n”);return 0;} } for(i=1;i<=5;i++){ a[0][i]=0;for(j=1;j<=5;j++)a[0][i]+=a[j][i];if(a[0][i]!=a[0][1]){printf(“It is not a magic square!n”);return 0;} } if(a[1][0]!=a[0][1]){printf(“It is not a magic square!n”);return 0;} a[0][0]=0;for(i=1;i<=5;i++)a[0][0]+=a[i][i];if(a[0][0]!=a[1][0]){printf(“It is not a magic square!n”);return 0;} a[0][0]=0;for(i=1;i<=5;i++)a[0][0]+=a[i][6-i];if(a[0][0]!=a[1][0]){printf(“It is not a magic square!n”);return 0;} printf(“It is a magic square!n”);for(i=1;i<=5;i++){ for(j=1;j<=5;j++)printf(“% 4d”,a[i][j]);printf(“n”);}
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<=9;i++)ans+=a[i]*i;ans%=11;if(ans+'0'==s[12]||(ans==10&&s[12]=='X'))printf(“Right”);else {xg(s,ans);printf(“%s”,s);}
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<=10;i++)scanf(“%d”,app+i);scanf(“%d”,&h);for(i=1;i<=10;i++)if(app[i]<=h+30)ans++;printf(“%d”,ans);
return 0;} 求最大素数(4分)题目内容:
求500以内的10个最大素数及其和,并分别输出这10个最大素数及其和。要求10个素数按从大到小的顺序输出。输入格式: 无 输出格式:
10个最大素数的输出格式:“% 6d” 总和的输出格式:“nsum=%dn” 输入样例: 输出样例:
时间限制:500ms内存限制:32000kb
#include “stdio.h” int ss[96];int is(int k){ int i=1;while(ss[i]*ss[i]<=k){ if(k%ss[i]==0)return 0;i++;}
return 1;} int main(){ int n=2,i,sum=0;ss[1]=2;ss[2]=3;for(i=4;i<=500;i++)if(is(i))ss[++n]=i;for(i=n;i>=n-9;i--){ printf(“% 6d”,ss[i]);sum+=ss[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<=len/2;i++){ c=*(s+i);*(s+i)=*(s+len-i);*(s+len-i)=c;} } int main(){ char s[80],len=0;printf(“Input a string:n”);gets(s);while(s[len]!='')len++;len--;dh(s,len);printf(“Inversed results:n”);puts(s);
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<=5;i++){ if((k-1)%5!=0||k< 5)return 0;k=(k-1)/5*4;} return 1;} int main(){ int ans=1;while(!can(ans))ans++;printf(“y=%dn”,ans);
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< 10;i++)if(*(a+*p)<*(a+i))*p=i;
return 0;} int Findmin(int *a,int *p){ int i;*p=0;for(i=1;i< 10;i++)if(*(a+*p)>*(a+i))*p=i;
return 0;} int main(){ int a[10],maxp,minp,i;printf(“Input 10 numbers:n”);for(i=0;i< 10;i++)scanf(“%d”,a+i);Findmax(a,&maxp);Findmin(a,&minp);printf(“Max=%d,Position=%d,Min=%d,Position=%dn”,a[maxp],maxp,a[minp],minp);
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 ss[10];int i;printf(“Please enter a string:n”);gets(ss);for(i=0;i<=6;i++)if(strcmp(ss,s[i])==0){printf(“%s is %dn”,ss,i);return 0;} printf(“Not found!n”);
return 0;} 杨辉三角形(4分)题目内容:
编程打印具有如下形式的杨辉三角形,其中输出数据的行数n从键盘输入,并且n<=10。程序运行结果示例1: Input n(n<=10): 5↙ 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
程序运行结果示例2: Input n(n<=10): 7↙ 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1
输入格式: “%d” 输出格式:
输入提示信息:“Input n(n<=10):n” 输出数据格式:“% 4d” 数据换行: “n”
输入样例: 输出样例:
注意:为避免出现格式错误,请直接拷贝粘贴上面给出的输入、输出提示信息和格式控制字符串!
时间限制:500ms内存限制:32000kb
#include “stdio.h” #include “string.h” int main(){ int a[11][11],n,i,j;printf(“Input n(n<=10):n”);scanf(“%d”,&n);for(i=1;i<=n;i++)for(j=1;j<=i;j++){ if(j==1||j==i)a[i][j]=1;else a[i][j]=a[i-1][j-1]+a[i-1][j];} for(i=1;i<=n;i++){ for(j=1;j<=i;j++)printf(“% 4d”,a[i][j]);printf(“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<=m;i++)for(j=1;j<=n;j++)scanf(“%d”,&a[i][j]);max=a[1][1];maxi=1;maxj=1;for(i=1;i<=m;i++)for(j=1;j<=n;j++)if(max< a[i][j]){max=a[i][j];maxi=i;maxj=j;} printf(“max=%d,row=%d,col=%dn”,max,maxi-1,maxj-1);
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;i<=n;i++)scanf(“%d”,&a[i]);for(i=1;i<=n-1;i++)for(j=1;j<=n-1;j++)if(a[j]>a[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<=n;i++)printf(“% 4d”,a[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(i< 1||j< 1)return-1;if(i%j==0)return j;else return gcd(j,i%j);} int main(){ int a[11],i,max,min,ans;printf(“Input 10 numbers:n”);for(i=1;i<=10;i++)scanf(“%d”,&a[i]);max=a[1];min=a[1];for(i=2;i<=10;i++){ if(a[i]>max)max=a[i];if(a[i]< min)min=a[i];} ans=gcd(max,min);printf(“maxNum=%dn”,max);printf(“minNum=%dn”,min);if(ans!=-1)printf(“%d”,ans);
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<=30;i++){ st+=mo;mi+=10;mo*=2;} st/=100;mi*=10000;printf(“to Stranger: %.2lf yuann”,st);printf(“to Richman: %.2lf yuann”,mi);
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<=9;i++)printf(“% 7d”,i);printf(“n”);for(i=0;i<=9;i++){ printf(“%d”,i);for(j=0;j<=9;j++)printf(“%7.3f”,sqrt(i*10+j));printf(“n”);}
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< 0||j< 0)return 0;for(k=i;k>=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
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
3、编写一个C语言程序,测试下列各表达式:
i, j
i + 1 , j + 1 i++ , j++ ++i , ++j i+++++j(1)算法描述:定义变量并将其分别代入各表达式中,输出结果。(2)源代码及说明:
#include
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
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
(3)测试数据:90.0(4)运行结果:32.222222(5)问题及解决方法:无
三、实验总结:
1.通过实验我清楚的知道了双精度型数据的格式说明符的使用。2.学会使用pow()函数。
实验二分支结构程序设计实验(验证性实验
2学时)
一、目的要求:
(1)了解和掌握分支语句的使用,包括if语句的各种形式以及switch语句。(2)编写实验报告。
二、实验内容(参考实验指导书):
1、编写一个程序完成输入一个整数,输出它的符号。(1)算法描述:
if(i>0)
输出“+”。
if(i<0)
输出“-”。
if(i=0)
输出“0”。(2)源代码及说明:
#include
{
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 y = f(x)= 4x / 3
0 ≤ x ≤ 15
2.5x – 10.5 x > 15(1)算法描述:
if x<0 => f(x)=0;if 0<=x<=15 =>f(x)=4x/3 if x>15 =>f(x)=2.5x-10.5(2)源代码及说明:
#include
scanf(”%f“,&x);if(x<0){
y=0;
printf(”应交水费%f 元n“,y);} else if(x>=0&&x<=15){
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<=score<90 输出良好 if 70<=score<80 输出中等 if 60<=score<70 输出及格 else 输出不及格(2)源代码及说明: #include
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 2%折扣
500km ≤ s < 1000km 5%折扣
1000km ≤ s < 2000km8%折扣 2000km ≤ s < 3000km10%折扣
3000km ≤ s
15%折扣
设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为:
f = p * w * s *(1 – d)请编程实现:从键盘输入基本运费p,货物重w,距离s,计算输出用户最终需要支付的运费。
(1)算法描述:
if(s<250)
d=0.0
if(s>=250&&s<500)
d=0.02
if(s>=500&&s<1000)
d=0.05
if(s>=1000&&s<202_)d=0.08
if(s>=202_&&s<3000)d=0.1 else
d=0.15 然后再将数据代入公式money=p*w*s*(1-d),输出money。(2)源代码及说明: #include
if(s<250){
d=0.0;} else if(s>=250&&s<500){
d=0.02;} else if(s>=500&&s<1000){
d=0.05;} else if(s>=1000&&s<202_){
d=0.08;} else if(s>=202_&&s<3000){
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
for(y=0;y<=9;y++)
{
for(z=0;z<=9;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<=number;i++){
for(k=number;k>=i;k--)
}
for(j=0;j
printf(”%d“,i);
}(2)源代码及说明: #include
for(k=number;k>=i;k--)
{
printf(”“);
}
for(j=0;j
{
printf(”%d“,i);
}
printf(”n“);
} } for(i=2;i<=number;i++){ for(k=number;k>=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<1000;x++)if满足x%5==2 && x%7==3 && x%3==1 则输出x(2)源代码及说明: #include
int x;for(x=1;x<1000;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<='D';x++)if((x!='A')+(x=='C')+(x=='D')+(x!='D')==3)输出谁做了好事
(2)源代码及说明:
#include
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
int st =0;int m=N-1;for(i=0;i scanf(”%d“,&a[i]);} for(i=0;i if(a[i]<0) { 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<20;i++){ if(a[i]>x) break;} j=i;重新排列插入数后面的数 for(i=8;i>=j;i--){ a[i+1]=a[i];} a[j]=x;最后输出插入数据后的数组(2)源代码及说明: #include if(n break;} k = i;for(i=9;i>=k;i--){ a[i+1]=a[i];} a[k]=n;for(i=0;i<9;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<3;i++) for(j=0;j<5;j++) scanf(”%d“,&a[i][j]);交换数组对应数值并输出 for(i=0;i<5;i++) for(j=0;j<3;j++) b[i][j]=a[j][i];printf(”%d “,b[i][j])(2)源代码及说明: #include for(j=0;j<3;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 a[i]=random(200); printf(”%4d“,a[i]);} 进行排序(选择)for(i=0;i<=9;i++){ for(j=i+1;j<10;j++) { if(a[i] { k=a[i]; a[i]=a[j]; a[j]=k; } } }(2)源代码及说明: #include int x;int a[10];int i,j,m = 1;int temp;srand((unsigned)time(NULL));while(1) { for(i=0;i<10;i++){ x =100+ rand()% 101;for(j=0;j if(a[j] == x) { m == 0; } } if(m == 1){ a[i]=x;} else { i--;} } break;} for(i=0;i<10;i++){ printf(”%d “,a[i]);} printf(”n“);printf(”降序排列为:n“);for(i=0;i<9;i++){ for(j=i+1;j<10;j++){ if(a[i] { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<10;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 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 return 0;} for(i=2;i<=n-1;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)一个数如果从左到右和从右到左读,数字是相同的,则称这个数字为回文数,比如898、1221、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 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 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 < am,则x只可能在区间[a1 , am-1] 若x = am,则am即为查找的数,求解结束。 从上面的分析发现,这个过程很适合用递归来实现。(1)算法描述: for(i=10000;i<100000;i++){ if(hw(i)) { if(isprime(i)==1) { cnt++; } } } } printf(”n合计:%d个n“,cnt);(2)源代码及说明: #include if(hw(i)) { if(isprime(i)==1) { cnt++; } } } printf(”n合计:%d个n“,cnt);} int isprime(int n){ int i=2;while(i<=sqrt(n)){ 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 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 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){ 郑州轻工业学院 实 践 报 告 实现内容: OJ1123最佳校友(数组)、OJ1158又是升序(指针)、OJ1180成绩统计(结构)、OJ1203做幻方(文件) 学 号:541507020140 学生姓名:王红旭 专业班级:电子信息科学与技术15-01 所在院系:计算机与通信工程学院 指导教师:王秉政 成绩: 实践名称:上机实验课 来源课程:[0404230]C程序设计进阶 实践时间:202_.03-05 实践地点:科学校区实验楼301 报告撰写时间:202_.05.10 1123最佳校友(数组)1 实践目的 为了方便数组的管理和使用,提高程序设计的效率。实践要求 熟练使用数组解决问题。使用的技术、知识点、工具等 C语言程序设计书本教材,数组等。需求分析和功能描述 要求;北京校友会每年举办两次,所有校友都有校友编号,每次到会的校友都在签到簿上写下自己的编号和姓名,在校友会成立5周年的聚会上将颁发“最佳校友奖”,该奖项颁发给到会次数最多的校友。现在请你编写程序,找出这个奖项的得主。若有多个校友并列第一,则均可获奖。系统总体设计 #include a[n]++;max=a[0];for(i=1;i<100;i++){ if(a[i]>max) max=a[i];} k=0;for(i=0;i<100;i++){ if(a[i]==max) { if(k==0) printf(“%d”,i); else printf(“ %d”,i); k++; } } } printf(“n”);return 0; 1158又是升序(指针)实践目的 指针可以表示复杂的数据结构,能动态分布内存,及方便地址使用字符串,可作为函数间传递的参数,也可以作为函数返回值,为函数之间各类型数据的传递提供简捷便利的方法。实践要求 熟练使用指针 使用的技术、知识点、工具等 C语言程序设计书本教材,指针等 需求分析和功能描述 将输入的四个整数按由大到小的顺序输出。 已定义如下swap函数,可实现形参pa和pb所指内存单元的内容交换。请务必使用本函数实现两个变量内容的互换。void swap(int *pa, int *pb){ int t;t=*pa;*pa=*pb;*pb=t;} 5 系统总体设计 #include void swap(int *pa, int *pb);int main(){ int a[10]; int i, j, n=4; for(i=0;i<4;i++) scanf(“%d”, &a[i]); for(i=0;i for(j=i;j if(a[i] swap(&a[i], &a[j]); for(i=0;i printf(“%d%c”, a[i], i!=n-1 ? ' ' : 'n'); return 0;} void swap(int *pa, int *pb){ int t; t=*pa; *pa=*pb; *pb=t;} 1180成绩统计(结构)实践目的 数组在一定情况下不能更好的完成要求,使用结构可以更好的将数据关联起来,更好的解决问题。实践要求 熟练使用结构 使用的技术、知识点、工具等 C语言程序设计书本教材,结构等 需求分析和功能描述 从键盘输入若干个学生的信息,每个学生信息包括学号、姓名、3门课的成绩,计算每个学生的总分,输出总分最高的学生的信息。系统总体设计 #include char ID[20]; char name[20]; int a; int b; int c;}STUDENT;//int inputArr int main(){ STUDENT stu, first; int T=0, n=0, i=0; scanf(“%d”, &n); first.a = first.b = first.c =-1; for(i = 0;i < n;i++) { scanf(“%s %s %d %d %d”, stu.ID, stu.name, &stu.a, &stu.b, &stu.c); if(stu.a + stu.b + stu.c > first.a + first.b + first.c) first = stu; } printf(“%s %s %d %d %dn”, first.ID, first.name, first.a, first.b, first.c); return 0;} 1203做幻方(文件)实践目的 文件是处理大数据,并可以储存数据,防止数据消失。实践要求 熟练使用文件 使用的技术、知识点、工具等 C语言程序设计书本教材,文件等 需求分析和功能描述 Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.5 系统总体设计 #include int main(){ int m; while(scanf(“%d”, &m), m!= 0) { sqr(m); } return 0;} int sqr(int m){ int a[N][N] = {0}; int x=0, y=0; int times, p, q, fmt; int i, j; x = m / 2; y = m1; } } fmt = log10(times); if(fmt == 0) { for(i = 0;i < m;i++) { for(j = 0;j < m1]); printf(“n”); j++) } } } else if(fmt == 1){ for(i = 0;i < m;i++) { for(j = 0;j < m1]); printf(“n”); } } else if(fmt == 2){ for(i = 0;i < m;i++) { for(j = 0;j < m1]); printf(“n”); } } printf(“n”);return 0; 实验一 C程序的运行环境和方法 一、实验目的 1.了解所用的计算机系统。 2.了解在该系统上如何进行编辑、编译、连接和运行一个C程序。3.通过运行简单的C程序了解C程序的特点。 二、实验内容和步骤 1.熟悉所用的系统。了解Windows资源管理器的使用方法:文件的查看、复制、运行等方法,Visual C++所在目录,文本文件的建立方法。2.进入Visual C++,并新建一个C++源程序文件。 3.熟悉Visual C++的集成环境,了解各菜单项有哪些子菜单。4.输入下面的程序(教材中的例1.1),注意区分大小写。 #include 5.关闭工作区,新建一个程序,然后对教材中的例1.2重复4中的操作(即只将程序改为例1.2中的程序,其它操作步骤相同)。其程序为: #include 6.关闭工作区,新建一个程序,然后输入并运行一个需要在运行时输入数据的程序 #include printf(“input a and b:n”);scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“nmax=%dn”,c);} int max(int x,int y){int z;if(x>y)z=x;else z=y;return(z);}(1)运行程序,若程序有错,则修改错误后继续运行程序,当没有错误信息时输入:2,5并按Enter键,查看运行结果。 其运行结果为: (2)将程序的第三行改为:int a;b;c;然后按F9看结果如何,将其修改为int a,b,c;将子程序max的第3,4行合并为一行,运行程序,看结果是否相同。将程序的第三行改为:int a;b;c;运行结果为: 将子程序max的第3,4行合并为一行,运行程序,其结果相同,结果为: 7.运行一个自己编写的程序,程序的功能是输出两行文字。其程序为: #include 实验二 数据类型、运算符和表达式 一、实验目的 1.掌握C语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。 2.掌握不同数据类型之间赋值的规律。 3.学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(――)运算符的使用。 4.进一步熟悉C程序的编辑、编译、连接和运行的过程。 二、实验内容和步骤 1.输入并运行下面的程序 #include (2)加入下面的一个语句作为“}”前的最后一个语句: printf(“%d,%dn”,c1,c2);其结果为: (3)将第3行改为: int c1,c2;然后再运行程序,并观察结果是否相同。相同,其结果为: (4)将第3行改为int c1,c2;将第4,5行依次改为: c1=a;c2=b;c1=“a”;c2=“b” c1=300;c2=400;每改为一次后运行程序,观察结果。其程序为: #include 2.分析教材第3章习题3.5中的程序的运行结果,然后输入该程序并运行,将运行结果与前面分析的结果对比。其程序为: #include 3.输入并运行下面的程序 #include printf(“%u,%un”,a,b);printf(“%u,%un”,c,d);c=a=e;d=b=f;printf(“%d,%dn”,a,b);printf(“%u,%un”,c,d);} 请对照程序和运行结果分析: 运行结果为: (1)将一个负整数赋给一个无符号的变量,会得到什么结果。画出它们在内存中的表示形式。 (2)将一个大于32767的长整数赋给一个整型变量,会得到什么结果。画出它们在内存中的表示形式。 (3)将一个长整数赋给无符号的变量,会得到什么结果。画出它们在内存中的表示形式。4.输入习题3.10(1)运行程序,注意i,j,m,n的值。(2)将第4,5行改为: m=i++;n=++j;再运行。(3)将程序改为: #include 5.按习题3.6的要求编程并上机运行: 要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”,因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1、c2、c3、c4、c5这5个变量的值分别为’C’,'h', 'i','n', 'a',经过计算,使c1、c2、c3、c4、c5分别变为:'G','l','m',r','e',并输出.程序提示: main函数算法如下: 定义char型变量 c1,c2,c3,c4,c5;给字符型变量赋值 c1=c1+4;c2=c2+4;c3=c3+4;c4=c4+4;c5=c5+4;输出c1,c2,c3,c4,c5 其程序为: #include 实验三 最简单的C程序设计 一、实验目的 1.掌握C语言中使用最多的一种语句――赋值语句的使用方法。2.掌握各种类型数据的输入输出方法,能正确使用各种格式输出符。 二、实验内容和步骤 1.掌握各种格式输出符的使用方法。#include double f,g;long n,m;unsigned p,q;a=61;b=62;c1='a';c2='b';d=3.56;e=-6.87;f=3156.890121;g=0.123456789;m=50000;n=-60000;p=32768;q=40000;printf(“a=%d,b=%dnc1=%c,c2=%cnd=%6.2f,e=%6.2fn”,a,b,c1,c2,d,e);printf(“f=%15.6f,g=%15.12fnm=%ld,n=%ldnp=%u,q=%un”,f,g,m,n,p,q);}(1)运行此程序并分析运行结果。其结果为: (2)在此基础上,修改程序的第9-14行: a=61;b=62;c1=a;c2=b;f=3156.890121;g=0.123456789;d=f;e=g;p=a=m=50000;q=b=n=-60000;运行程序,分析运行结果。其结果为: (3)将9-14行改为以下的scanf语句,即用scanf函数接收从键盘输入的数据: scanf(“%d,%d,%c,%c,%f,%f,%lf,%lf,%ld,%ld,%u,%u”,&a,&b,&c1,&c2,&d,&e,&f,&g,&m,&n,&p,&q);运行程序(无错误的情况下)输入数据如下: 61,62,a,b,3.56,-6.87,3156,890121,0.123456789,50000,-60000,32768,40000 其结果为: 2.按习题3.8的要求编写程序并运行: 设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积,圆球表面积、圆球体积、圆柱体体积。用scanf输入数据,输出计算结果,输出时要有文字说明,取小数后2位数字。其程序为: #include 3.编写程序,用getchar函数输入两个字符给c1,c2,然后分别用putchar函数和printf函数输出这两个字符。其程序为: #include c1=getchar();c2=getchar();printf(“用putchar语句输出结果为:”);putchar(c1);putchar(c2);printf(“n”);printf(“用printf语句输出结果为:”);printf(“%c%cn”,c1,c2);} 其运行结果为: 实验四 选择结构程序设计 一、实验目的 1.了解C语言表示逻辑值的方法。 2.学会正确使用逻辑运算符和逻辑表达式的方法。3.熟悉if语句和switch语句。4.结合程序掌握一些简单的算法。5.学习调试程序的方法。 二、实验内容 本实验要求编程解决以下问题,然后上机调试运行程序。 x1x1x101.y2x13x11x10 用scanf函数输入x的值,求y的值。 其程序为: #include else y=3*x-11;printf(“x=%d,y=%dn”,x,y);} 运行结果为: 2.给出一个百分制的成绩,要求输出成绩等级A,B,C,D,E,90分及以上为A,80-89为B,70-79为C,60-69为D,60分以下为E。要求从键盘输入成绩,然后输出相应等级,分别用if语句和switch语句实现。(1)使用if语句的程序如下: #include (2)使用switch语句程序如下: #include printf(“成绩是%-5.1f,相应的等级是%cn”,score,grade);} 其运行结果与使用if语句运行结果一样。 3.编程实现:输入一个不多于5位的正整数,要求:(1)输出它是几位数,(2)分别输出每一位数字,(3)按逆序输出各位数字,如原数为321,则应输出123。应准备以下测试数据 要处理的数为1位正整数; 要处理的数为2位正整数; 要处理的数为3位正整数; 要处理的数为4位正整数; 要处理的数为5位正整数; 除此之外,程序还应当对不合法的输出作必要的处理。例如: 输入负数; 输入的数超过5位; 其程序为: #include { int num,inp,ten,hundred,thousand,ten_thousand,place;printf(“请输入一个整数(0-99999):n”);scanf(“%d”,&num);if(num>99999)printf(“输入的数超过5位!n”);else if(num<0)printf(“输入的数是一个负数!n”);else { if(num>9999)place=5;else if(num>999)place=4;else if(num>99)place=3;else if(num>9)place=2;else place=1;if(num>99999||num<0)printf(“enter num is error!n”);printf(“位数:%dn”,place);printf(“每位数字为:”);ten_thousand=num/10000;thousand=(int)(num-ten_thousand*10000)/1000;hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;inp=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);switch(place){case 5:printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,inp);printf(“n反序数字为:”);printf(“%d%d%d%d%d”,inp,ten,hundred,thousand,ten_thousand);break;case 4:printf(“%d,%d,%d,%d”,thousand,hundred,ten,inp);printf(“n反序数字为:”);printf(“%d%d%d%d”,inp,ten,hundred,thousand);break;case 3:printf(“%d,%d,%d”,hundred,ten,inp);printf(“n反序数字为:”);printf(“%d%d%d”,inp,ten,hundred);break;case 2:printf(“%d,%d”,ten,inp);printf(“n反序数字为:”);11 printf(“%d%d”,inp,ten);break;case 1:printf(“%d”,inp);printf(“n反序数字为:”);printf(“%d”,inp);break;} printf(“n”);return 0;} } 4.编程实现:输入4个整数,要求按由小到大的顺序输出。得到正确结果后,修改程序使之按由大到小的顺序输出。由小到大顺序输出其程序为: #include if(a>d){t=a;a=d;d=t;} if(b>c){t=b;b=c;c=t;} if(b>d){t=b;b=d;d=t;} if(c>d){t=c;c=d;d=t;} printf(“排序结果为:n”);printf(“%d %d %d %dn”,a,b,c,d);} 其运行结果为: 由大到小顺序输出其程序为: 将上面程序第十九行改为: printf(“%d %d %d %dn”,d,c,b,a);其运行结果为: 5.已知a=12,b=6,要求输入一个算术运算符(+、-、*、/),对a,b进行算术运算,并输出结果。其程序为: #include 实验五 循环控制 一、实验目的 熟悉使用while语句,do-while语句和for语句实现循环的方法。掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。 二、实验内容 1.上机完成习题6.1:输入两个正整数m和n,求出它们的最大公约数和最小公倍数。 输入时,使m 修改程序使对任何的整数都能得到正确的结果。其程序为: #include 2.编写程序利用公式:e1其程序为: #include 111求e的近似值,精确到小数后6位 1!2!n! void main(){ int n,i;double e,p,t;printf(“输入n的值:n”);scanf(“&d”,&n);e=1;t=1;p=1;i=1;while(t>=1e-7){e=e+t;i++;p=p*i;t=1.0/p;} printf(“The e is %fn”,e);} 其运行结果为: 3.编程求1到n中能被3或7整除的数之和。分别用for循环语句和while循环语句完成本题。 用for循环,其程序为: #include 用while循环语句,其程序为: #include int i=1,n,sum=0;printf(“请输入一个整数:n”);scanf(“%d”,&n);while(i<=n){ if(i%3==0||i%7==0)sum=sum+i;i++;} printf(“The sum is %dn”,sum);} 4.上机完成习题6.10:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少桃子。 在得到正确结果后,修改题目,改为每天早上都吃了前一天剩下的一半加二个,请修改程序,并运行,检查运行结果是否正确。其程序为: #include 实验六 数组 一、实验目的 1.掌握一维数组与二维数组的定义、赋值及输入输出方法。2.掌握字符数组和字符串函数的使用。 3.掌握与数组有关的算法(特别是排序算法) 二、实验内容 1.用选择法对10个整数排序。10个整数用scanf函数输入。其程序为: #include 2.有15个数存放在一个数组中,输入一个数要求用折半查找法找出该数是数组中的第几个元素的值,如果该数不在数组中,则输出无此数,要找的数用scanf函数输入。其程序为: #include sign=0; top=0; bott=N-1; if(numbera[N-1]) loca=-1; while((!sign)&&(top<=bott)) { mid=(bott+top)/2; if(number==a[mid]) {loca=mid; printf(“Has found %d,its position is %dn”,number,loca+1); sign=1; } else if(number bott=mid-1; else top=mid+1; } if(!sign||loca==-1) printf(“cannot find %d.n”,number); printf(“continue or not(Y/N)?”); scanf(“%c”,&c); if(c=='N'||c=='n') flag=0;} return 0;} 其运行结果为: 3.将两个串连接起来,不要用strcat函数。其程序为: #include printf(“nThe new string is:n”,s1);return 0;} 其运行结果为: 4.找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。至少准备两组测试数据:(1)二维数组有鞍点 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20(2)二维数组没有鞍点 1 2 3 4 11 2 4 6 8 12 3 6 9 10 15 4 8 12 16 7 用scanf函数从键盘输入数组的各元素的值,检查结果是否正确,题目未指定二维数组的行数和列数,程序应能处理任意行数和列数的数组。其程序为: #include if(max>a[k][maxj]){flag=0;continue;} if(flag){printf(“a[%d][%d]=%dn”,i,maxj,max);break;} } if(!flag)printf(“It is not exist!n”);return 0;} 其运行结果为: 实验七 函数 一、实验目的 1.掌握定义函数的方法。 2.掌握函数实参及形参的对应关系以及“值传递”方式。3.掌握函数的嵌套调用和递归调用的方法。 4.掌握全局变量和局部变量,动态变量、静态变量的概念和使用方法。5.学会对多文件程序的编译和运行。 二、实验内容 1.写出一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。本程序应准备以下测试数据:17,34,2,1,0,分别输入数据,运行程序并检查结果是否正确。其程序为: #include } int prime(int(n)){int flag=1,i;for(i=2;i 2.用一个函数来实现将一行字符串中最长的单词输出。此行字符从主函数传递给该函数。(1)把两个函数放在同一个程序文件中。 (2)将两个函数分别放在两个程序文件中,作为两个文件进行编译、连接和运行。其程序为: #include int alphabetic(char c)22 {if((c>='a'&&c<='z')||(c>='A'&&c<='z'))return(1);else return 0;} int longest(char string[]){int len=0,i,length=0,flag=1,place=0,point;for(i=0;i<=strlen(string);i++)if(alphabetic(string[i]))if(flag){point=i;flag=0;} else len++;else {flag=1;if(len>=length){len=len;place=point;len=0;} } return(place);} 其运行结果为: 3.用递归法将一个整数n转换成字符串。例如输入483.应输出字符串“483”。n的位数不确定,可以是任意的整数。其程序为: #include } convert(number);printf(“n”);return 0;} void convert(int n){int i;if((i=n/10)!=0)convert(i);putchar(n%10+'0');putchar(32);} 其运行结果为: 4.求两个整数的最大公约数和最小公倍数。用一个函数求最大公约数用另一个函数根据求出的最大公约数求最小公倍数。分别用下面的两种方法编程。(1)不用全局变量,在主函数中输入两个数和输出结果。(2)用全部变量的方法,数据的传递通过全部变量的方法。不用全局变量其程序为: #include int hcf(int u,int v){int t,r;if(v>u){t=u;u=v;v=t;} while((r=u%v)!=0){u=v;v=r;} return(v);24 } int lcd(int u,int v,int h){ return(u*v/h);} 其运行结果为: 使用全局变量,其程序为: #include void hcf(int u,int v){int t,r;if(v>u){t=u;u=v;v=t;} while((r=u%v)!=0){u=v;v=r;} Hcf=v;} void lcd(int u,int v){ Lcd=u*v/Hcf;} 其运行结果为: 5.写一个函数,输入一个十六进制数,输出相应的十进制数。其程序为: #include int htoi(char s[]){int i,n;n=0;for(i=0;s[i]!='';i++){if(s[i]>='0'&&s[i]<='9')26 n=n*16+s[i]-'0';if(s[i]>='a'&&s[i]<='f')n=n*16+s[i]-'a'+10;if(s[i]>='A'&&s[i]<='F')n=n*16+s[i]-'A'+10;} return(n);} 其运行结果为: 6、编程实现模拟计算机完成加、减、乘、除运算;加减乘除分别通过调用函数实现 其程序为: #include { case'+':c=add(a,b);break;printf(“a+b=%4fn”,c); case'-':c=minus(a,b);break;printf(“a-b=%4fn”,c); case'*':c=chen(a,b);break;printf(“a*b=%4fn”,c); case'/':c=chu(a,b);break;printf(“a/b=%4fn”,c); default :printf(“enter data error!n”); } printf(“所求得的结果为:%4fn”,c); printf(“n”);} float add(float x,float y){float c;c=x+y;return(c);} float minus(float x,float y){float d;d=x-y;return(d);} float chen(float x,float y){float e;e=x*y;return(e);} float chu(float x,float y){float f;f=x/y;return(f);} 其运行结果为: 实验八 指针 一、实验目的 1.通过实验进一步掌握指针的概念,会定义和使用指针变量。2.能正确使用数组的指针和指向数组的指针变量。3.能正确使用字符串的指针和指向字符串的指针变量。4.能正确使用指向函数的指针变量。 5.了解指向指针的指针的概念及其使用方法。 二、实验内容 以下程序要求使用指针处理。 1. 输入三个整数,按由小到大的顺序输出。运行无错后改为:输入三个字符串,按由小到大的顺序输出。 三个整数按由小到大的顺序输出其程序为: #include 三个字符按由小到大的顺序输出其程序为: #include printf(“input three line:n”);gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0)swap(str1,str2);if(strcmp(str1,str3)>0)swap(str1,str3);if(strcmp(str2,str3)>0)swap(str2,str3);printf(“Now, the order is:n”);printf(“%sn%sn%sn”,str1,str2,str3);return 0;} void swap(char *p1,char *p2){char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 其运行结果为: 2.将一个3×3的矩阵转置,用一函数实现。 在一主函数中用scanf函数输入以下矩阵元素: 1 3 5 7 9 11 13 15 17 将数组名作为函数参数,在执行函数的过程中实现矩阵转置,函数调用结束后在主函数中输出转置后的矩阵。其程序为: #include printf(“%d %d %dn”,a[i][0],a[i][1],a[i][2]);return 0;} void move(int * pointer){int i,j,t;for(i=0;i<3;i++)for(j=i;j<3;j++){t=*(pointer+3*i+j);*(pointer+3*i+j)=*(pointer+3*j+i);*(pointer+3*j+i)=t;} } 其运行结果为: 3.有n人围成一个圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。其程序为: #include i++;if(i==n)i=0;} while(*p==0)p++;printf(“The last one is NO.%dn”,*p);return 0;} 其运行结果为: 4.用一个函数实现两个字符串的比较,即自己写一个strcmp函数,函数的原型为: int strcmp(char *p1,char *p2);设p1指向字符串s1,p2指向字符串s2.要求当两个字符相同时返回0,若两个字符串不相等,则返回返回它们二者第一个不同字符的ASCII码的差值。两个字符串s1,s2由主函数输入,strcmp函数的返回值也由主函数输出。其程序为: #include strcmp(char *p1,char *p2){int i;i=0;while(*(p1+i)==*(p2+i))if(*(p1+i++)=='')return(0);return(*(p1+i)-*(p2+i));} 其运行结果为: 5.用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数,n和各整数在主函数中输入,最后在主函数中输出。其程序为: #include {temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;} } 其运行结果为: 6.用指针实现二维数组的地址和值的输出。其程序为: #include C语言程序设计(B) (202_-202_-2) 实验报告2 教学班级: 学号: 姓名: 课程教师: 实验辅导教师: 一、做一个“杨辉三角” 实验前的源程序: /*杨辉三角*/ #include Y[i][0]=1; Y[i][i]=1;} for(i=2;i<12;i++){ for(j=1;j { Y[i][j]=Y[i-1][j-1]+Y[i-1][j]; } } } main(){ int i,j,k;int Y[12][12];fun(Y);for(i=0;i<12;i++){ for(k=1;k<=11-i;k++) printf(“ ”); for(j=0;j<=i;j++) { printf(“%6d”,Y[i][j]); } printf(“n”);} } 实验错误报告: --------------------配置: mingw2.95-CUI Debug, 编译器类型: MinGW(Old)-------------------- 检查文件依赖性...正在编译 D:Program FilesC-Free Standardsamples杨辉三角.cpp...[Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:4: declaration of `Y' as multidimensional array [Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:4: must have bounds for all dimensions except the first [Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:8: `Y' undeclared(first use this function)[Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:8:(Each undeclared identifier is reported only once [Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:8: for each function it appears in.)[Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:4: too many arguments to function `void fun()' [Error] D:Program FilesC-Free Standardsamples杨辉三角.cpp:23: at this point in file 构建中止 杨辉三角: 7 个错误, 0 个警告 实验后的源程序: /*杨辉三角*/ #include Y[i][0]=1; Y[i][i]=1;} for(i=2;i<12;i++){ for(j=1;j { Y[i][j]=Y[i-1][j-1]+Y[i-1][j]; } } } main(){ int i,j,k;int Y[12][12];fun(Y);for(i=0;i<12;i++){ for(k=1;k<=11-i;k++) printf(“ ”); for(j=0;j<=i;j++) { } } printf(“%6d”,Y[i][j]);} printf(“n”); 二、用函数的方法 3*3矩阵置换 实验前的源程序: /*用函数的方法 3*3矩阵置换*/ #include “stdio.h” main(){ void zhihuan();zhihuan();} void zhihuan(){ int a[3][3],b[3][3];int i,j;printf(“请输入一个3*3的矩阵:”);printf(“n”);for(i=0;i<3;i++){ for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);} printf(“您所输入的矩阵是:n”);for(i=0;i<3;i++){ for(j=0;j<3;j++) { printf(“ %d ”,a[i][j]); b[j][i]=a[i][j]; } printf(“n”);} printf(“n转置后的矩阵排列为:n”);for(i=0 i<3;i++){ for(j=0;j<3;j++) { printf(“ %d ”,b[i][j]); } } } printf(“n”);实验错误报告: [Error] D:Program FilesC-Free Standardtemp未命名3.cpp:30: parse error before `<' [Error] D:Program FilesC-Free Standardtemp未命名3.cpp:30: parse error before `)' [Error] D:Program FilesC-Free Standardtemp未命名3.cpp:32: parse error before `;' [Error] D:Program FilesC-Free Standardtemp未命名3.cpp:38: parse error before `}' 构建中止 未命名3: 4 个错误, 0 个警告 实验后的源程序: /*用函数的方法 3*3矩阵置换*/ #include “stdio.h” main(){ void zhihuan();zhihuan();} void zhihuan(){ int a[3][3],b[3][3];int i,j;printf(“请输入一个3*3的矩阵:”);printf(“n”);for(i=0;i<3;i++){ for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);} printf(“您所输入的矩阵是:n”);for(i=0;i<3;i++){ for(j=0;j<3;j++) { printf(“ %d ”,a[i][j]); b[j][i]=a[i][j]; } printf(“n”);} printf(“n转置后的矩阵排列为:n”);for(i=0;i<3;i++){ for(j=0;j<3;j++) } } { printf(“ %d ”,b[i][j]);} printf(“n”); 三、用函数 输入一个字符串按反序存放 实验前的源程序: /*输入一个字符串按反序存放*/ #include int length,i; char temp;length=strlen(str); length=strlen(str);for(i=0;i<=length/2;i++){ temp=str[i]; str[i]=str[length-i-1]; str[length-i-1]=temp;} } main(){ int i,length;char str[89],temp;printf(“ 请输入一串字符:n”);gets(str);fun(str);printf(“ 字符的逆序排列为:n ”);puts(str);} 实验错误报告: [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存放.cpp:8: passing `char' to argument 1 of `strlen(const char *)' lacks a cast [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存放.cpp:10: passing `char' to argument 1 of `strlen(const char *)' lacks a cast [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存 放.cpp:13: invalid types `char[int]' for array subscript [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存放.cpp:14: invalid types `char[int]' for array subscript [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存放.cpp:14: invalid types `char[int]' for array subscript [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存放.cpp:15: invalid types `char[int]' for array subscript [Error] D:Program FilesC-Free Standardsamples输入一个字符串按反序存放.cpp:24: passing `char *' to argument 1 of `fun(char)' lacks a cast 构建中止 输入一个字符串按反序存放: 7 个错误, 0 个警告 实验后的源程序: /*输入一个字符串按反序存放*/ #include int length,i; char temp;length=strlen(str); length=strlen(str);for(i=0;i<=length/2;i++){ temp=str[i]; str[i]=str[length-i-1]; str[length-i-1]=temp;} } main(){ int i,length;char str[89],temp;printf(“ 请输入一串字符:n”);gets(str);fun(str);printf(“ 字符的逆序排列为:n ”);puts(str);} 四、用指针的方法 将3*3矩阵转置 实验前的源程序: /*用指针的方法,将一个3*3整形矩阵转置*/ #include “stdio.h” void Transfer(int(*pointer)[3]){ int t; int i, j; for(i=1;i<3;i++) { for(j=0;j { t=*(*(pointer+j)+i); *(*(pointer+j)+i)=(*(pointer+i)+j); *(*(pointer+i)+j)=t; } } } main(){ int i,j; int a[3][3]; printf(“请输入一个3*3的整形矩阵:n”); for(i=0;i<3;i++) { for(j=0;j<3;j++) { scanf(“%d”,&a[i][j]); } } printf(“您所输入的3*3矩阵是:n”); for(i = 0;i<3;i++){ for(j=0;j<3;j++) { printf(“ %d ”,a[i][j]); } printf(“n”); } Transfer(a); printf(“转置后的3*3矩阵为:n”); for(i=0;i<3;i++){ for(j=0;j<3;j++) } } { printf(“ %d ”,a[i][j]);} printf(“n”);实验错误报告: 正在编译 D:Program FilesC-Free Standardsamples用指针的方法,将一个33整形 矩阵转置.cpp...[Error] D:Program FilesC-Free Standardsamples用指针的方法,将一个33整形矩阵转置.cpp:13: assignment to `int' from `int *' lacks a cast 构建中止 用指针的方法,将一个33整形矩阵转置: 1 个错误, 0 个警告 实验后的源程序: /*用指针的方法,将一个3*3整形矩阵转置*/ #include “stdio.h” void Transfer(int(*pointer)[3]){ int t; int i, j; for(i=1;i<3;i++) { for(j=0;j { t=*(*(pointer+j)+i); *(*(pointer+j)+i)=*(*(pointer+i)+j); *(*(pointer+i)+j)=t; } } } main(){ int i,j; int a[3][3]; printf(“请输入一个3*3的整形矩阵:n”); for(i=0;i<3;i++) { for(j=0;j<3;j++) { scanf(“%d”,&a[i][j]); } } printf(“您所输入的3*3矩阵是:n”); for(i = 0;i<3;i++){ for(j=0;j<3;j++) { printf(“ %d ”,a[i][j]); } printf(“n”); } Transfer(a); printf(“转置后的3*3矩阵为:n”); for(i = 0;i<3;i++){ for(j=0;j<3;j++) { printf(“ %d ”,a[i][j]); } printf(“n”);} } 五、用指针 请输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换实验前的源程序: 实验前的源程序: #include } for(i=0;i<10;i++){ if(a[i]<*n)n=&a[i];i=a[9];a[9]=*n;*n=i;} for(i=0;i<10;i++)printf(“ %d ”,a[i]);} 实验错误报告: 正在编译 D:Program FilesC-Free Standardtemp未命名7.cpp...[Error] D:Program FilesC-Free Standardtemp未命名7.cpp:13: ANSI C++ forbids comparison between pointer and integer 构建中止 未命名7: 1 个错误, 0 个警告 实验后的源程序: #include int a[10],i,*m,*n; printf(“Input 10 numbers:n”); for(i=0;i<10;i++) { scanf(“%d”,&a[i]); m=n=&a[0]; } for(i=0;i<10;i++) { if(a[i]>*m) m=&a[i]; i=a[10]; a[10]=*m; *m=i; } for(i=0;i<10;i++) { if(a[i]<*n)n=&a[i]; i=a[9]; a[9]=*n; *n=i; } for(i=0;i<10;i++) printf(“ %d ”,a[i]);} 六、用指针 求一字符的长度再main中输入在字符串,并输出长度 实验前的源程序: /*用指针 求一字符的长度 再main中输入在字符串,并输出长度*/ #include int i,n=0; for(i=0;*(s+i)!=;i++) n++; return(n);} void main(){ char *s; char c[20]; s=c; printf(“请输入字符串:n”); gets(c); printf(“ 字符串长度为%dn”,length(s));} 实验错误报告: 正在编译 D:Program FilesC-Free Standardsamples用指针 求一字符的长度 再main中输入在字符串,并输出长度.cpp...[Error] D:Program FilesC-Free Standardsamples用指针 求一字符的长度 再main中输入在字符串,并输出长度.cpp:6: stray '' in program [Error] D:Program FilesC-Free Standardsamples用指针 求一字符的长度 再main中输入在字符串,并输出长度.cpp:6: parse error before `;' 构建中止 用指针 求一字符的长度 再main中输入在字符串,并输出长度: 2 个错 误, 0 个警告 实验后的源程序: #include int i,n=0; for(i=0;*(s+i)!='';i++) n++; return(n); } void main(){ char *s; char c[20]; s=c; printf(“请输入字符串:n”); gets(c); printf(“ 字符串长度为%dn”,length(s));} 七、用函数的方法 由实参传来一个字符串,统计此字符中字母、数字、空格、和其他字符的个数,在主函数中输入字符串以及输出上述结果。实验前的源程序: /*用函数的方法 由实参传来一个字符串,统计此字符中字母、数字、空格、和其他字符的个数,在主函数中输入字符串以及输出上述结果*/ #include int i; for(i=0;str[i]!='';i++) if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) alphabet++; else if(str[i]>='0'&&str[i]<='9') number++; else if(str[i]==32) space++; else others++;} void main(){ void count(char[]); char str[80]; printf(“输入字符串:n”); gets(str); alphbet=0; number=0; space=0; others=0; count(str); printf(“字母的个数= %dn数字的个数= %dn空格的个数= %dn其他字符个数= %dn”,alphabet,number,space,others);} 实验错误报告: 检查文件依赖性...正在编译 D:Program FilesC-Free Standardsamples用函数的方法 由实参传来一 个字符串,.cpp...[Error] D:Program FilesC-Free Standardsamples用函数的方法 由实参传来一个字符串,.cpp:25: `alphbet' undeclared(first use this function)[Error] D:Program FilesC-Free Standardsamples用函数的方法 由实参传来一个字符串,.cpp:25:(Each undeclared identifier is reported only once [Error] D:Program FilesC-Free Standardsamples用函数的方法 由实参传来一个字符串,.cpp:25: for each function it appears in.)构建中止 用函数的方法 由实参传来一个字符串,: 3 个错误, 0 个警告 实验后的源程序: /*用函数的方法 由实参传来一个字符串,统计此字符中字母、数字、空格、和其他字符的个数,在主函数中输入字符串以及输出上述结果*/ #include int i; for(i=0;str[i]!='';i++) if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) alphabet++; else if(str[i]>='0'&&str[i]<='9') number++; else if(str[i]==32) space++; else others++;} void main(){ void count(char[]); char str[80]; printf(“输入字符串:n”); gets(str); alphabet=0; number=0; space=0; others=0; count(str); printf(“ 字母的个数=%dn 数字的个数=%dn 空格的个数=%dn 其他字符个数=%dn”,alphabet,number,space,others);} 八、用函数方法 输入一个3*3矩阵求其中元素的最大值 实验前的源程序: /*用函数方法 输入一个3*3矩阵求其中元素的最大值*/ #include int i,j;printf(“请输入一个3*3矩阵n”);for(i=0;i<3;i++){ for(j=0;j<3;j++) { scanf(“%d”,&A[i][j]); } } int max(int array[][3]);printf(“max= %dn”,max(A));} int max(int array[][3]){ int i,j,max;max=array[0][0];for(i=0;i<3,i++) for(j=0;j<3,j++) if(array[i][j]>max) max=array[i][j]; return(max);} 实验错误报告: 正在编译 D:Program FilesC-Free Standardtemp未命名4.cpp...[Error] D:Program FilesC-Free Standardtemp未命名4.cpp:23: parse error before `)' 构建中止 未命名4: 1 个错误, 0 个警告 实验后的源程序: /*用函数方法 输入一个3*3矩阵求其中元素的最大值*/ #include int i,j;printf(“请输入一个3*3矩阵n”);for(i=0;i<3;i++){ for(j=0;j<3;j++) { scanf(“%d”,&A[i][j]); } } int max(int array[][3]);printf(“max= %dn”,max(A));} int max(int array[][3]){ int i,j,max;max=array[0][0];for(i=0;i<3;i++) for(j=0;j<3;j++) if(array[i][j]>max) max=array[i][j]; return(max);} C语言程序设计实验 --------指针应用实验 ======================== 山东农业大学实验报告 课程名称: c语言程序设计实验 学院: 水利土木工程学院 专业: 道路桥梁与渡河工程 班级: 202_级2班 姓名: 学号: 20133498 C语言与软件技术基础 实 验 报 告 课程名称 指导老师 班 级 实验名称 实验时间 姓 名 实验地点 提交时间 座 号 一、实验目的和要求 1、掌握指针和间接访问的概念,会定义和使用指针变量。 2、能正确使用数组的指针和指向数组的指针变量。 3、能正确使用字符串的执针和指向字符串的指针变量。 二、实验环境和方法 实验方法: (一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。 (二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。 (三)根据实验内容,编译程序。 实验环境:Windows xp Visual C++6.0 三、实验内容及过程描述 实验内容:编译以下题目的程序并调试运行。 1、输入3个整数,按由大到小的顺序输出,然后将程序改为:输入3个字符串,按由小到大顺序输出。 ①先编写一个程序,以处理输入3个整数,按由小到大顺序输出。运行程序,分析结果。②把程序改为能处理输入3个字符串,按由小到大的顺序输出。运行此程序,分析结果。③比较以上两个程序,分析处理整数与处理字符串有什么不同?例如:(a)怎样得到指向整数(或字符串)的指针。(b)怎样比较两个整数(或字符串)的指针。(c)怎样交换两个整数(或字符串)。 2、将一个3×3的整数型二维数组转置,用一个函数实现之。在主函数中用scanf函数输入以下数组元素: 将数组0行0列元素的地址作为函数实参,在执行函数的过程中实现行列互换,函数调用结束后在主函数中输出已转置的二维数组。 请思考: ① 二维数组的指针,某一行的指针、某一元素的指针个代表什么含义?应该怎么表示? ② 怎样表示i行j列元素及其地址。 3、将n个数按输入时顺序的逆序排列,用函数实现。①在调用函数时用数组名作函数实参。 ②函数实参改为用指向数组首元素的指针,形参不变。③分析以上二者的不同。 4、写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。分别在程序中按以下两种情况处理: ①函数形参用指针变量。②函数形参用数组名。实验步骤: ① 进入Visual C++ 6.0集成环境。② 输入自己编好的程序。③ 检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。④ 进行编译和连接。如果在编译和连接过程中发现错误,频幕上会出现“报错信息”,根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到不出错为止。⑤ 运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是否正确,应运行多次,分别检查在不同情况下结果是否正确。以下是各题源代码: 1、输入3个整数,按由大到小的顺序输出,然后将程序改为:输入3个字符串,按由小到大顺序输出。程序① #include void swap(int *p1,int *p2){int p;p=*p1;*p1=*p2;*p2=p;} 程序② #include printf(“请输入3行字符:n”);gets(str1);gets(str2);gets(str3);if(strcmp(str1,str2)>0)swap(str1,str2);if(strcmp(str1,str3)>0)swap(str1,str3);if(strcmp(str2,str3)>0)swap(str2,str3);printf(“排序结果为:n”);printf(“%sn%sn%sn”,str1,str2,str3);return 0;} void swap(char *p1,char *p2){char p[20];strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);} 2、将一个3×3的整数型二维数组转置,用一个函数实现之。#include 3、将n个数按输入时顺序的逆序排列,用函数实现。 #include printf(“逆序排列为:n”);for(i=0;i 4、写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。分别在程序中按以下两种情况处理: ① 函数形参用指针变量。 #include ②函数形参用数组名。 #include 四、实验结果: 1、输入3个整数,按由大到小的顺序输出,然后将程序改为:输入3个字符串,按由小到大顺序输出。程序①结果: 结果分析: 本程序应用指针,在swap函数中交换指针p所指向的单元数值,使较小的数放前面从而达到排序的效果。程序②结果: 结果分析: 利用指针指向字符串数组,在strcmp函数中,将两个字符串自左向右逐个字符比较(按ASCCII码值大小比较),直到出现不同字符或遇到’’为止。 ③处理整数只需将指针指向整数的存储地址然后进行比较;处理字符串时,字符串是用数组存储的,在进行 大小比较时用指针指向数组首地址或数组名从而得到字符串指针。比较整数用swap函数,比较字符串用strcmp函数。 2、将一个3×3的整数型二维数组转置,用一个函数实现之。 ① 二维数组中,某一行的指针是指指向该数组一行中的所有元素可表示为:*(a+i),i表示第i行;某一元素指针代表任意元素的指针*a[i][j],i表示第i行,j表示第j列。② 第i行j列表示为a[i][j],地址表示为&a[i][j]。 3、将n个数按输入时顺序的逆序排列,用函数实现。 结果分析: 用数组名作函数实参与用指向数组首元素的指针作函数实参都是用“值传递”的方法将数值变量的地址传递到函数接收。数组名表示数组首元素的地址,在值传递中把首元素的地址传递到函数接收处,所以函数形参采用指针变量。 4、写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。①运行结果:第二篇:C语言实验报告
第三篇:C语言实验报告
第四篇:C语言实验报告
第五篇:C语言实验报告