题目一:按要求将程序补充完整。有n个整数,使前面各数顺序向后移动m个位置,余下n-m个数变成最前面的数。写一个函数void moveNumber(int *pnum,int n,int m)实现以上功能。
程序代码:
#include <stdio.h> #define MAXNUM 100 main() { int num[MAXNUM],*pnum,n,m,i; void moveNumber(int *pnum,int n,int m); printf("请输入数组长度n(n<%d)",MAXNUM); scanf("%d",&n); printf("请输入需移动数的个数m(m<n):"); scanf("%d",&m); printf("请输入%d个整数,按空格分开:\n",n); //以下使用指针移动法访问数组元素,请仔细研究体会 pnum=num; for (i=0;i<n;i++) { scanf("%d",pnum); //用户输入的数放入当前pnum指向的位置 pnum++; } pnum=num; moveNumber(pnum,n,m); //调用函数移动m个数 printf("\n移动最后%d个数到前面后,数组变为:\n",m); for (i=0;i<n;i++) printf("%d ",*(num+i)); //指针运算法访问数组元素 } void moveNumber(int *pnum,int n,int m) {//算法思路:用一个与主函数中num等大的数组temp,利用pt和pn指针,将num的数按要求赋值到temp中后,再拷贝回num数组 int temp[MAXNUM]; int *pt ; //用来指向temp数组 int *pn; //用来 指向num数组 int i; pn=pnum+n-m; pt=temp; for(i=0;i<m;i++) { *pt=*pn;pt++;pn++; } pn=pnum; for(i=0;i<n-m;i++) { *pt=*pn;pt++;pn++; } pt=temp; for(i=0;i<n;i++) { *pnum=*pt; pt++;pnum++; } }
题目二:指针方法编写一个程序,输入3个整数,将它们按由小到大的顺序输出。(提示可以编写一个交换函数swap(int *a,int *b)来实现)
程序代码:
#include<stdio.h> int main() { void swap(int *p1,int *p2); int a=0,b=0,c=0; int *p1,*p2,*p3; printf("请输入3个整数a,b,c:"); scanf("%d %d %d",&a,&b,&c); p1=&a; p2=&b; p3=&c; if(a>b) { swap(p1,p2); } if(a>c) { swap(p1,p3); } if(b>c) { swap(p2,p3); } printf("从小到大的排序为:%d %d %d\n",a,b,c); return 0; } void swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; }
题目三:输入n(不大于20)个单精度数存入一维数组,用指针变量处理数组元素的方式将其逆序存放后输出,n从键盘输入。
程序代码:
#include<stdio.h> void oppsite(float *a,int N); main() { float a[20]; float *p=a; int i=0, N=0; printf("请输入元素个数:"); scanf("%d",&N); printf("请输入数组元素:"); for(i=0;i<N;i++) scanf("%f",&a[i]); oppsite(a,N); for(i=0;i<N;i++) printf("%f\n",a[i]); return 0; } void oppsite(float *p,int N) { int temp=0,i=0,m=N/2; for(i=0;i<m;i++) { temp=*(p+i); *(p+i)=*(p+N-1-i); *(p+N-1-i)=temp; } }
调试错误:
错误一:[Error] cannot convert 'float*' to 'int*' for argument '1' to 'void oppsite(int*, int)'
更正错误:第一次定义函数声明时将数组名和另一变量(本来应该都是一个变量)搞混,在后面进行函数调用时发现牛不对马嘴,调用时写的是函数定义的另一变量,改正后写成数组名;在初函数定义时将定义类型写成了int 后面调用发现错误,因为在main内又定义数组名为float型,调用不了,将函数定义改成了float
错误二:[Error] declaration of 'int N' shadows a parameter
更正错误:这里忽略了主函数已经定义N,在oppsite函数中又重新定义一个一样的N变量,导致错误,换一个变量进行定义
错误三:[Error] ld returned 1 exit status
更正错误:在oppsite函数调用时将形参定义为int导致错误,更改为float
题目四:已知,char name[20]="DELHIk";int length;char*cptr=name;,编写程序,使用指针来确定字符串的长度。
程序代码:
#include <stdio.h> int main() { char name[20]="DELHIk"; int length; char*cptr=name;/*这里是将字符数组s的首地址赋给指针p,就是指针p指向字符数组*/ while(1) { if(*cptr !='\0')/*cptr指向字符数组的结束符‘\0’的地址,而s为字符数组的首地址*/ { length++; cptr++; } else break; } printf("字符串长度为:%d",length=cptr-name);/*二者相减可以得出两个地址之间的字符个数,就是被测字符数组的长度*/ return 0; }
调试错误:无
调试结果:
题目五:编写一个程序,用12个月份的英文名称初始化一个字符指针数组,当键盘输入整数为1到12 时,显示相应的月份名,键入其他整数时显示错误信息。
程序代码:
#include <stdio.h> #include <stdlib.h> char *getmonth(int n); int main() { char *month[12]={"January","February","march","April","may","June","July","August","September","October","November"," December"}; int n ; printf("请输入1-12数字:"); scanf("%d",&n); while(1) { if(n>12||n<1) { printf("输入错误,请检查!\n"); } printf("%s\n",month[n-1]); return 0; } }
调试错误:
错误一:[Error] lvalue required as decrement operand
更改错误:将month【month--】改成month【n--】
调试结果:
题目六:学生信息统计
程序代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 10 #define M 3 #define H 10 //按照顺序为project1为高数 project2英语 project3 C语言 typedef struct student { long num;//xuehao char name[10]; int score[M]; char sex[10]; char age[H]; }inform; void Input (inform stu[],int n,int m);//shuru void totalc (inform stu[],int n,int m);//meimenkechen void everystu (inform stu[],int n,int m); void ranking (inform stu[],int n,int m); void statistis (inform stu[],int n,int m); void List (inform stu[],int n,int m); int main() { int n,c,m; char name[10]; inform stu[N]; printf("输入学生人数:"); scanf("%d",&n); printf("输入考试科目:"); scanf("%d",&m); printf("1.输入信息\n"); printf("2.计算每门科目的总分和平均分\n"); printf("3.每个学生的考试情况\n"); printf("4.查看排名\n"); printf("5.查看成绩占比\n"); printf("6.全部输出\n"); printf("0.Exit\n"); printf("请输入序号:\n"); printf("\n"); for(;;) { scanf("%d",&c); switch(c) { case 1: //录入学生信息和各科成绩 Input (stu,n,m); printf("请输入序号:\n"); break; case 2: //计算每门课程的总分和平均分 totalc (stu,n,m); printf("请输入序号:\n"); break; case 3: //计算每个学生的总分和平均分 everystu (stu,n,m); printf("请输入序号:\n"); break; case 4: //按每个学生的总分由高到低排出名次表 ranking (stu,n,m); printf("请输入序号:\n"); break; case 5: //成绩分析 所占百分比 statistis (stu,n,m); printf("请输入序号:\n"); break; case 6: //全部输出 List (stu,n,m); totalc (stu,n,m); printf("请输入序号:\n"); break; case 0: exit(0); } } return 0; } void Input (inform stu[],int n,int m) //1 { int i,j; for(i=0;i<n;i++) { printf("输入学号,名字,年龄,性别,成绩:"); scanf("%ld",&stu[i].num); scanf("%s",&stu[i].name); scanf("%s",&stu[i].age) ; scanf("%s",&stu[i].sex); for(j=0;j<m;j++) scanf("%d",&stu[i].score[j]); } } void totalc (inform stu[],int n,int m) //2.计算每门课程的总分和平均分 { int i,j,sum[M]; double ave[M]; for(j=0;j<m;j++) { sum[j]=0; for(i=0;i<n;i++) { sum[j]=sum[j]+stu[i].score[j]; } ave[j]=(double)sum[j]/n; } for(i=0;i<m;i++) printf("科目%d的总分=%d,课程的平均分=%f\n",i+1,sum[i],ave[i]); } void everystu (inform stu[],int n,int m) //3.计算每个学生的总分和平均分 { int i,j,sum[N]; double ave[N]; for(i=0;i<n;i++) { sum[i]=0; for(j=0;j<m;j++) { sum[i]=sum[i]+stu[i].score[j]; } ave[i]=(double)sum[i]/m; } for(i=0;i<n;i++) printf("学号为%ld,姓名为%s的总分=%d,其平均分=%f\n",stu[i].num,stu[i].name,sum[i],ave[i]); } void ranking (inform stu[],int n,int m) //4.按每个学生的总分由高到低排出名次表 { int i,j,k,h,sum[N]; inform t; for(i=0;i<n;i++) { sum[i]=0; for(j=0;j<m;j++) { sum[i]=sum[i]+stu[i].score[j]; } } for(i=0;i<n;i++) { k=i; for(j=i+1;j<n;j++) { if (sum[j]>sum[k]) k=j; } if(i!=k) { t=stu[i],h=sum[i]; stu[i]=stu[k],sum[i]=sum[k]; stu[k]=t,sum[k]=h; } } for(i=0;i<n;i++) printf("学号:%7ld,名字:%s,分数:%d,年龄:%s,性别:%s\n",stu[i].num,stu[i].name,sum[i],stu[i].age,stu[i].sex);//以长整形打印用%ld } void statistis (inform stu[],int n,int m) { int a=0,b=0,c=0,d=0,e=0,i,j; double A,B,C,D,E; for(j=0;j<m;j++) { for(i=0;i<n;i++) { if(stu[i].score[j]>=90) a++; else if(stu[i].score[j]>=80) b++; else if(stu[i].score[j]>=70) c++; else if(stu[i].score[j]>=60) d++; else e++; } A=(double)a/n*100; B=(double)b/n*100; C=(double)c/n*100; D=(double)d/n*100; E=(double)e/n*100; printf("project %d\n",j+1); printf("优秀人数%d,百分比:%f%%\n",a,A); printf("良好人数%d,百分比:%f%%\n",b,B); printf("中等人数%d,百分比:%f%%\n",c,C); printf("及格人数%d,百分比:%f%%\n",d,D); printf("不及格人数%d,百分比:%f%%\n",e,E); } } void List (inform stu[],int n,int m) { int i,j,sum[N]; double ave[N]; for(i=0;i<n;i++) { sum[i]=0; for(j=0;j<m;j++) { sum[i]=sum[i]+stu[i].score[j]; } ave[i]=(double)sum[i]/m; } for(i=0;i<n;i++) { printf("num:%10ld,name:%s\n",stu[i].num,stu[i].name); for(j=0;j<m;j++) { printf("score:%d\n",stu[i].score[j]); } printf("总分=%d\n平均分%f\n",sum[i],ave[i]); } }
调试错误:
错误一:年龄输出为随机数
更改错误:实在是不知道怎么改了,把数字输入改为了字符输入避免了输出的时候随机值的生成
错误二:[Error] expected primary-expression before '[' token
更改错误:修改结构体内容,定义更为详细,防止结构体内的信息被当成别名
错误三:[Error] expected ',' or '...' before numeric constant
更改错误:定义了两个相同变量,更改其中一个变量名
调试结果:
标签:语言,错误,int,void,高级,stu,printf,实验报告,输入 From: https://www.cnblogs.com/librakeep/p/17091976.html