上机实验题目解题思路.docx
- 文档编号:7390811
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:18
- 大小:21.91KB
上机实验题目解题思路.docx
《上机实验题目解题思路.docx》由会员分享,可在线阅读,更多相关《上机实验题目解题思路.docx(18页珍藏版)》请在冰豆网上搜索。
上机实验题目解题思路
上机实验题目解题思路
目录
指针之二3
2455:
步骤:
3
2456:
步骤:
3
2457:
步骤:
4
3577:
步骤:
4
3578:
步骤:
4
3579:
步骤:
5
3581:
步骤:
5
3583:
步骤:
6
3584:
步骤:
6
3584:
步骤:
7
3585:
步骤:
7
3586:
步骤:
8
指针之一8
2453:
步骤:
8
2454:
步骤:
9
3575:
步骤:
方法同24549
3576:
步骤:
9
3580:
步骤:
10
3582:
步骤:
10
函数11
2452:
步骤:
11
2482:
步骤:
11
3574:
步骤:
12
3571:
步骤:
12
函数12
3565:
步骤:
12
3566:
步骤:
13
3567:
步骤:
13
3568:
步骤:
13
3569:
步骤:
14
3570:
步骤:
14
3571:
步骤:
14
3573:
步骤:
14
数组14
3552:
步骤:
14
3553:
步骤:
15
3555:
步骤:
15
3556:
步骤:
15
3561:
步骤:
15
3893:
步骤:
15
3895:
步骤:
16
3900:
步骤:
16
3905:
步骤:
16
指针之二
2455:
步骤:
1)定义两数交换的函数voidswap(int*p1,int*p2),交换两指针所指向的值。
.
2)main函数:
20个元素的浮点数组表示n个数,用选择排序或冒泡排序对n个数进行从小到大的排序,对排序过程中的交换两数用函数调用来实现,如交换a[i]和a[index]为swap(&a[i],&a[index]);;
2456:
步骤:
法一:
1)定义移数函数mov(int*a,intn),把数组最后面一个数移到最前面,其他数往后移一位,具体过程为:
a)先保存最后一个元素
b)从第一个元素开始到倒数第二个元素都往后移一位
c)最后一个元素放到最前面
2)定义main函数,多组输入测试数据,循环调用移数函数mov()。
intmain()
{inta[100],m,n,i;
while(scanf("%d%d",&n,&m)!
=EOF)//多组输入n、m值
{
for(I=0;I scanf(“%d”,&a[i]); for(i=0;i mov(a,n); for循环输出数组的每一个元素 } Return0; } 法二: 1)定义递归移数函数mov(int*a,intn,intm),把数组最后面一个数移到最前面,其他数往后移一位,当m>1时,调用函数mov(a,n,m-1)具体过程为: d)先保存最后一个元素 e)从第一个元素开始到倒数第二个元素都往后移一位 f)最后一个元素放到最前面 g)如果m>1,move(a,n,m-1); 2)定义main函数 intmain() {inta[100],m,n,i; while(scanf("%d%d",&n,&m)! =EOF)//多组输入n、m值 { for循环输入数组的每一个元素 mov(a,n,m); for循环输出数组的每一个元素 } Return0; } 2457: 步骤: 1)定义逆序函数voidsort(int*p1,intn),逆序排列p1地址开始的n个数。 循环变量i从0开始到n/2,*(p+i)与*(p+n-1-i)交换。 若是定义函数为voidsort(intx[],intn),则改为*(p+i)为x[i],其实作为形参int*p与intp[]是完全等价的,后面*(p+2)与p[2]是等价的。 2)main函数: 多组输入测试。 intmain() {intnum[20],n,i; while(scanf("%d",&n)! =EOF)//多组输入n值 { for循环输入数组的每一个元素 sort(num,n);//逆序排列数组num,或sort(&num[0],n)或int*p,p=num,sort(p,n); for循环输出数组的每一个元素 } Return0; } 3577: 步骤: 与2456完全相同。 3578: 步骤: 1)main函数: 定义三个一维字符数组s1[80]/s2[80]/s3[80],定义一个用于交换的临时字符数组t[80]。 如同三个整数的排序,先比较符数组s1、s2,若s1大于s2则交换两字符串;再比较s1、s3,若s1大于s3则交换两字符串;这样s1一定是最小的。 再比较s2、s3,若s2大于s3则交换两字符串。 2)比较字符数组s1、s2为: strcmp(s1,s2) 3)字符串S1和s2交换为: {strcpy(t,s1);strcpy(s1,s2);strcpy(s2,t);}若写s1=s2,为错误。 4)由于有三次比较,就会有三次交换,三次交换为重复代码,考虑用交换函数实现。 交换函数定义为: voidswap(char*str1,char*str2)//表示函数功能要交换str1、str2对应两个字符值 {chart[80];步骤3的三个语句} 3579: 步骤: 1)自定义求字符串长度函数intlength(char*s),功能为返回字符串s的长度。 intlength(char*s) {inti; ……………. returni; } 2)main函数: 多组输入测试。 intmain() { charstr[80]; while(gets(str)! =NULL) { printf("%d\n",length(str)); } return0; } 3581: 步骤: 1)自定义排序函数voidsort(int*p,intn),功能是对以p的值为起始地址的n个数排序。 voidsort(int*p,intn)//冒泡法排序代码,也可写成选择法排序的 {inti,j,t; For(I=0;i For(j=0;j If(p[j]>p[j+1])//a[j]可改为*(p+j),p[j+1]可改为*(p+j+1) {t=p[j];p[j]=p[j+1];p[j+1]=t;} } 2)main函数: 多组输入测试。 intmain() {Inta[100]; IntI,n; while(scanf("%d",&n)! =EOF) {输入数组每一个元素; 调用排序函数; 输出数组每一个元素; 换行printf("\n"); } return0; } 3583: 步骤: 1)自定义排序函数voidsortA(int*p,intn),功能是对以p的值为起始地址的n个数从小到排序;方法参考题目3581 2)自定义排序函数voidsortD(int*p,intn),功能是对以p的值为起始地址的n个数从大到排序,方法参考题目3581。 3)main函数: 多组输入测试。 intmain() {Inta[10],i; Charc; while(scanf("%c",&c)! =EOF) {输入10个整数; Getchar();//得到10个整数输入时的最后一个回车符,让下一次的%c能得到字符’A’或’D’ If(c==‘A’) 调用排序函数sortA(a,10); Elseif(c==‘D’) 调用排序函数sortD(a,10); 输出数组每一个元素; 换行printf("\n"); } return0; } 3584: 步骤: 1)自定义查找函数intsearch(intlist[],intn,intx),功能是在以list值为起始地址的n个数中找x,若找到返回下标,否则返回-1. 2)main函数: 多组输入测试。 intmain() {inta[10],x,i,result; while(scanf("%d",&a[0])! =EOF) {for(i=1;i<10;i++) scanf("%d",&a[i]); scanf("%d",&x); result=search(a,10,x); if(result==-1) printf("Notfound\n"); else printf("%d\n",result); } return0; } 3584: 步骤: 1)自定义查找函数intsearch(intlist[],intn,intx),功能是在以list值为起始地址的n个数中找x,若找到返回下标,否则返回-1. 2)main函数: 多组输入测试。 intmain() {inta[10],x,i,result; while(scanf("%d",&a[0])! =EOF) {for(i=1;i<10;i++) scanf("%d",&a[i]); scanf("%d",&x); result=search(a,10,x); if(result==-1) printf("Notfound\n"); else printf("%d\n",result); } return0; } 3585: 步骤: 1)自定义函数voidmcopy(char*src,char*dst,intm),功能是从src为起始地址的第m个字符开始的全部字符复制到以dst为起始地址的字符数组中。 voidmcopy(char*src,char*dst,intm) {inti,j=0; for(i=m;src[i]! ='\0';i++,j++) ………..; dst[j]='\0'; } 2)main函数: 多组输入测试。 intmain() {intm; charsrc[80],dst[80]; while(scanf("%d",&m)! =EOF) { ………………… } return0; } 3586: 步骤: 1)自定义函数intstrcomp(char*s1,char*s2),功能是当s1>s2时,返回1,当s1==s2时,返回0,当s1 不能调用函数strcmp(),字符串的比较是从两个字符串的首字符开始,依次比较相对应的字符(比较字符的ASCII码),直到出现不同的字符或遇到’\0’为止。 如果所有字符相同,表示相同;以第一个不相同的字符进行比较,哪个大则其对应的字符串就为较大的字符串。 如“abc”与”abcd”,第一个不同的是’\0’与’d’,而’d’>’\0’,所以“abcd”大于”abc”。 intstrcomp(char*s1,char*s2) {intresult,…… Returnresult; } 2)main函数: 多组输入测试。 intmain() { chars1[80],s2[80]; while(gets(s1)! =NULL) { gets(s2); printf("%d\n",strcomp(s1,s2)); } return0; } 指针之一 2453: 步骤: 1)定义两数交换的函数voidswap(int*p1,int*p2),交换两指针所指向的值。 . 2)main函数: 多组输入a、b,调用交换函数交换两变量值。 代码框架: voidswap(int*p1,int*p2) { …… } intmain() {inta,b; Int*pointer_1,*pointer_2; while(scanf("%d%d",&a,&b)! =EOF)//输入a、b值 { Pointer_1=….; Pointer_2=…..; If(a Swap(…..); printf(“%d%d\n”,a,b); } return0; } 2454: 步骤: h)定义同2453相同的函数voidswap(int*p1,int*p2),交换两指针所指向的值。 i)定义main函数,多组输入三个数,从大到小输出。 intmain() {inta,b,c; while(scanf("%d%d",&a,&b)! =EOF)//输入a、b值 {If(a Swap(&a,&b); If(a Swap(&a,&c); If(b Swap(&b,&c); printf(“%d%d%d\n”,a,b,c); } return0;} 3575: 步骤: 方法同2454 3576: 步骤: 1)定义类同2453函数voidswap(float*p1,float*p2),交换两指针所指向的值。 2)定义main函数,多组输入五个数,从小到大输出。 intmain() {inta[5],i,temp; while(scanf("%f",&a[0])! =EOF)//输入a、b值 { for(i=1;i<5;i++) scanf(“%f”,&a[i]); 选择排序完成5个数的排序,其中交换通过 Swap(&a[],&a[])完成; 循环输出a的所有元素; } return0; } 3580: 步骤: 1)自定义函数input(inta[],intn),output(inta[],intn); Voidinput(inta[],intn)//函数无返回值,等效于void(int*a,intn) {inti; For(i=0;i Scanf(“%d”,&a[i]); } 2)在main函数中,调用它,完成对数组n个元素的输入输出。 Intmain() {intarray[100],n; While(scanf(“%d”,&n)! =EOF) { Input(array,n); Output(array,n); } Return0; } 3582: 步骤: 1)定义一个计算两个数和、差的函数sumDiff(intop1,intop2,int*pSum,int*pDiff),功能是求两个数op1、op2的和、差,其中*psum和*pdiff是计算得出的和与差,代替return返回值,故函数不需要返回任何值了。 VoidsumDiff(intop1,intop2,int*pSum,int*pDiff) {//op1、op2是要计算的两数 *pSum=op1+op2;//pSum是main()函数中变量的地址,故修改的是main()函数中变量的值 …… } 2)在main函数中,调用它,计算输入的任意两个数的和与差。 Intmain() {inta,b,s,d; While(scanf(“%d%d”,&a,&b)! =EOF) { sumDiff(a,b,&s,&d); printf(“sum=%d,diff=%d\n”,s,d); } Return0; } 函数 2452: 步骤: 3)定义判断素数函数intprime(intx): 当x是素数时,函数返回1,否则返回0. 4)main函数: 多组输入n、m,对n-m间的每一个数i,调用函数prime(x)判断是否是素数,若是就输出。 代码框架: intprime(intx)//(循环从2到sqrt(x),不能从2到x-1) { …… } intmain() {intm,n,i; while(scanf("%d%d",&n,&m)! =EOF)//输入n、m值 { for(i=n;i<=m;i++) { If() Printf(“%d”,i);.....//输出素数 } printf(“\n”); } return0; } 2482: 步骤: 3)定义递归函数intage(intn,intm,intk),功能是求第n个人的岁数,并返回此岁数。 函数: intage(intn,intm,intk) {intresult; if(n==1) result=k; else result=age(n-1,m,k)+m; returnresult; } 4)定义main函数,多组输入,输出第n个人的岁数。 3574: 步骤: 1)定义函数intreverse(intn),功能返回n的逆序数。 函数: intreverse(intn) {intresult=0; do{…… ……………… }while(….! =0); returnresult; } 2)定义main函数,多组输入n,输出结果。 3571: 步骤: 1)定义递归函数intfib(intn),,功能是求返回第n项Fibonacci数。 函数: intfib(intn) {inti,f1,f2,item,result; if(n==1||n==2) result=1; else result=fib(n-1)+fib(n-2) returnresult; } 2)定义main函数,多组输入,输出结果。 intmain() {int…. while(scanf(……)! =EOF) { for(i=m;i<=n;i++) printf(“%5d“,fib(i)) printf(“\n”); } 函数 3565: 步骤: 1)定义符号函数sign(intn) 2)main函数: 输入x,调用函数sign(x)。 代码框架: intsign(intn) {intm; ........ returnm; } intmain() {intx,y; while(scanf("%d",&x)! =EOF)//输入x值 { y=sign(x); .....//输出y的值 } return0; } 3566: 步骤: 1)定义函数max(intx,inty),功能是求两个数x、y中最大数的,并返回最大数。 函数: intmax(intx,inty) {intz; if(x>y)z=x; elsez=y; returnz; } 2)main函数: 定义三个变量a、b、c和m、多组测试输入三个整数;两次调用函数,就可得到最大数了。 3567: 步骤: 1)定义判断素数的函数intprime(intx),若是素数返回1,否则返回0。 2)主函数: 从100-200每个数都通过调用函数prime(i)来判断是否素数。 intmain() {inti; For(I=100;I<200;i++) If(prime(i)==1) Printf(“%5d”,i); }(以上代码未处理换行) 3568: 步骤: 1)定义求n! 函数intfact(intn),函数返回n! 值。 (既可用整数表阶乘也可用浮点表阶乘) 2)主函数: 从1-10每个数都通过调用函数fact(i)来求i! ,并累加求和。 由于阶乘和较大,故用浮点表示和。 intmain() {inti;floatsum; For(I=1;I<=10;i++) Sum+=fact(i); Printf(“%f\n”,sum); } 3569: 步骤: 1)定义函数intfn(inta,intn),返回a…a(n个a)。 2)主函数核心语句: 循环i=1到n,s+=fn(a,i)。 3570: 步骤: 1)定义函数intcountdigit(intnumber,intdigit),返回number中数字digit的个数 关键算法: 取出number的每一位,若等于digit,则计数count加1,最后返回count。 2)主函数核心语句: 输入x,个数n=countdigit(x,2)。 3571: 步骤: 1)定义函数intfactorsum(intnumber),返回number的因子和。 关键算法: i从1到number-1,若i是number的因子,则累加和sum;最后返回sum。 2)主函数main(),核心语句: i从m到n,若I==fact(i),则输出i。 3573: 步骤: 1)定义函数intis(intnumber),若数字立方和等于本身,返回1,否则返回0。 关键算法: 累加number的每一位数字,若和等于number,则返回1,否则返0。 2)主函数main(),核心语句: i从m到n,若I==is(i),则输出i。 数组 3552: 步骤: 1)定义数组a[10][10],s[10]及相关变量 2)多组测试: 输入m,n;二重for循环输入数组a的每一个元素(scanf(“%d”,&a[i][j]),注意%d后不加空格)。 3)对于第一行a[0]的每个元素a[0][j](j=0-n-1)都和第m-1行对应元素交换。 4)对每一行(i=0---m-1),计算元素和并存入数组s[i]中 5)输出数组a的每一行(i=0----m-1)元素及s[i],并换行。 3553: 步骤: 1)定义数组a[10][10]及相关变量 2)多组测试: 输入n;二重for循环输入数组a的每一个元素(scanf(“%d”,&a[i][j]),注意%d后不加空格)。 3)主对角线元素: a[i][i],副对角线a[i][n-1-i]。 3555: 步骤: 1)定义数组a[6][6]、标记是否上三角变量flag、及相关变量 2)多组测试: 输入n;flag=1;二重for循环输入数组a的每一个元素 3)对于主对角线以下每个元素进行判断,如果不为零的,则flag=0同时跳出循环。 4)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上机 实验 题目 解题 思路
![提示](https://static.bdocx.com/images/bang_tan.gif)