C语言程序改错及填空题
- 格式:docx
- 大小:46.78 KB
- 文档页数:49
第一套1.程序填空程序通过定义学生结构体数组,存储了若干个学生的学号、姓名和三门课的成绩。
函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大排序)。
第一处 struct student t;第二处 for(i=0;i<n-1;i++)第三处if(strcmp(a[i].name,a[j].name) >0)2程序修改/**found**/q=p+i;/**found**/while(q>p)第二套1.程序填空给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序连接。
函数fun的功能是:删除链表中数据域值相同的结点,使之只保留一个。
第一处 free(q);第二处 q=p->next;第三处 q=q->next;2.程序修改/**found**/p=j;/**found**/p=i;第三套1. 程序填空函数fun的功能是:逆置数组元素是的值。
例如:若a所指数组中的数据依次为:1、2、3、4、5、6、7、8、9,则逆置后依次为:9、8、7、6、5、4、3、2、1。
形参n给出数组中数组中数据的个数。
第一处 for(i=0;i<n/2;i++)第二处 a[i]=a[n-1-i];第三处 a[n-i-1]=t;2程序修改/**found**/n=*p-‘0’;/**found**/n=n*8+*p-‘0’;第四套1.程序填空给定程序中,函数fun的功能是:在带有头结点的单向链表中,查找数据域中值为ch的结点。
找到后通过函数值返回该结点在链表中所处的顺序号:若不存在值为ch的结点,函数值返回0.第一处 while(p!=0)第二处if(p->data==ch)return n;第三处 k=fun(head,ch);2. 程序修改/**found**/for(i=0,t=0;p[i];i++)/**found**/c[t]=’\0’;第五套1. 程序填空给定程序中,函数fun的功能是:计算下式前n项的和作为函数值返回。
1.下列给定程序中,函数fun的功能是:先将字符串s中的字符按正序存放到字符串t中,然后把s中的字符按逆序连接到字符串t的后面。
例如,当s中的字符串为"ABCDE"时,则t中的字符串应为"ABCDEEDCBA"。
#include <stdio.h>#include <string.h>void fun (char *s, char *t){ int i, sl;sl = strlen(s);/************found************/for( i=0; i<sl; i++)t[i] = s[i];for (i=0; i<sl; i++)t[sl+i] = s[sl-i-1];/************found************/t[sl*2] = '\0';}2.下列给定程序中,函数fun的功能是:读入一个字符串(长度<20),将该字符串中的所有字符按ASCII码值升序排序后输出。
例如,若输入"edcba",则应输出"abcde"。
#include <string.h>#include <stdio.h>void fun(char t[]){char c;int i,j;/*************found**************/for(i=strlen(t)-1;i;i--)for(j=0;j<i;j++)/*************found**************/if(t[j]>t[j+1]){c= t[j];t[j]=t[j+1];t[j+1]=c;}}3.下列给定程序中函数fun的功能是:从N个字符串中找出最长的串,并将其地址作为函数值返回。
各字符串在主函数中输入,并放入一个字符串数组中。
三、读程序题1、float f=3.1415927;printf(“%f,%5.4f,%3.3f”,f,f,f);则程序的输出结果是3.141593,3.1416,3.142 .2、int x=6,y=7;printf(“%d,”,x++);printf(“%d\n”,++y);程序的输出结果是6,83、a=3;a+=(a<1)?a:1;printf(“%d”,a);结果是. 44、for (a=1,b=1;a<=100;a++){ if(b>=20)break;if(b%3==1){b+=3;continue;}b-=5;}程序的输出结果a的值为22 .5、int y=1,x,*p,a[ ]={2,4,6,8,10};p=&a[1];for(x=0;x<3;x++)y + = * (p + x);printf(“%d\n”,y);程序的输出结果y的值是19 .四、程序填空题1、从键盘上输入10个数,求其平均值。
main(){int i;float f,sum;for(i=1,sum=0.0;i<11;i++){ scanf(“%f”,&f);Sum+=f ;}printf(“average=%f\n”,sum/10);}2、以下程序是建立一个名为myfile的文件,并把从键盘输入的字符存入该文件,当键盘上输入结束时关闭该文件。
#include <stdio.h>main(){ FILE *fp;char c;fp= ;do{c=getchar();fputs(c,fp);}while(c!=EOF);3、以下程序的功能是:从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。
请填空。
main(){ float x,amax,amin;scanf(“%f”,&x);amax=x;amin=x;while(x>=0.0 ){ if(x>amax)amax=x;if(x<=amin )amin=x;scanf(“%f”,&x);}printf(“\namax=%f\namin=%f\n”,amax,amin);}三、阅读程序题(1) 3.141593,3.1416,3.142(2)6,8(3) 4(4)22(5)19四、程序填空题1、scanf(“%f”,&f);sum+=f;2、fopen(“myfile”,w)fclose(fp);3、x>=0.0 x<=amin三、阅读程序题1、int x=6,y=7;printf(“%d,”,x++);printf(“%d\n”,++y);程序的输出结果是______.2、float f=3.1415927;printf(“%f,%5.4f,%3.3f”,f,f,f);则程序的输出结果是______.3、a=3;a+=(a<1)a:1;printf(“%d”,a);结果是______.4、main(){ int a[5]={2,4,6,8,10},*P,* *k;p=a;k=&p;printf(“%d,”,*(p++));printf(“%d\n”,* *k);程序的输出结果是______.5、main(){int a,b;for (a=1,b=1;a<=100;a++){ if(b>=20)break;if(b%3==1){b+=3;continue;}b-=5;} }程序的输出结果a的值为______.四、程序填空题1、求主次对角线之和。
每个注行邻近,更正。
更正中,不得改程序构,也不得增句。
#define NULL 0struct stud{long num;char name[10];float score;struct stud *next;};/* ⋯⋯⋯⋯⋯ comment⋯⋯⋯⋯⋯*/ int n;struct stud create()////////struct stud *create(void){struct stud *head,*p1,*p2;n=0;p1=p2=(struct stud *)malloc(sizeof(struct stud));scanf("%ld,%s,%f",&p1->num,p1->name,&p1->score);/*⋯⋯⋯⋯⋯ comment ⋯⋯⋯⋯⋯*/head=NULL;while(p1!=0)//////////while(p1->num!=0){n=n+1;if(n==1) head=p1;else p2->next=p1;p1=(struct stud *)malloc(size(struct stud));scanf("%ld,%s,%f",&p1->num,p1->name,&p1->score);}p2->next=NULL;return(head);}gc57.c 的功能是互定数中的最大数和最小数。
如将下边8 个数:5,3,1,4,2,8,9,6变为:5,3,9,4,2,8,1,6程序中,最大数与最小数的交换操作经过函数调用来实现,让指针max 和 min 分别指向最大数和最小数。
程序有二处错误,请更正。
注意:不得增行和删行,也不得改正程序的构造。
main(){int i;static int a[8]={5,3,1,4,2,8,9,6};void jhmaxmin();printf(" Original array: \n");for(i=0; i<8; i++)printf("%5d",a[i]);printf("\n");jhmaxmin(a,8);printf(" Array after swaping max and min: \n");for(i=0; i<8; i++)printf("%5d",a[i]);printf("\n");}// 注意: void jhmaxmin(p,n)int p, n;这是一种老的函数形式,此刻一般这样写void jhmaxmin(int p,int n)void jhmaxmin(p,n)int p, n;//////// int *p,n;{int t, *max, *min, *end, *q;end=p+n;max=min=p;for(q=p+1; q<end; q++){ if(*q>*max) max=q;if(*q<max) min=q; ////////*q<*min}t=*max; *max=*min; *min=t;}gc101.c 的功能为 : 输入 8 个整数 , 使用指针以选择法对其进行排序( 从小到大 ). 程序中有两处错误代码 , 请更正 . 注意,不得改变程序构造。
说明:在程序中用/* */包围的部分是题目的答案,表示用相应的语句修改程序或完成程序。
共有31套试题。
0.⒈已知 f(n)=f(n-1)+2f(n-2)-5f(n-3), f(0)=1,f(1)=2,f(2)=3,求 f(0)+f(1)+……+f(30)。
程序中有一处错误。
(1) 输入原程序并运行,记录运行结果,将结果填入答题窗口的①。
(程序名由考生自定)(2) 更正程序中的错误,运行更正后的程序,记录运行结果,将结果填入答题窗口的②。
#include <stdio.h>main(){long f0=1,f1=2,f2=3,f,s,i;s=f0+f1+f2;for (i=1; i<=30; i++) /*for (i=3; i<=30; i++)*/{ f=f2+2*f1-5*f0;s+=f;f0=f1;f1=f2;f2=f; }printf("%ld\n",s);}⒉已知24有8个因子,而24正好能被8整除,求[1,100]之间有多少个整数能被其因子的个数整除?在下列程序中填上缺少的语句或另外编写具有同样功能的程序,运行程序,将结果填入答题窗口的①。
#include "stdio.h"#include "math.h"main(){ int i,j,k,n=0;for(i=1;i<=100;i++){ k=0;for(j=1;j<=i;j++)if(fmod((float)i,(float)j)==0.0)k++;if( ________ ) /*i%k==0*/n++;}printf("%d\n",n);}1.⒈求解方程 x^2- 7912x +12976 = 0 的最大实根。
程序中有一处错误。
(1) 输入原程序并运行,记录运行结果,将结果填入答题窗口的①。
(程序名由考生自定)(2) 更正程序中的错误,运行更正后的程序,记录运行结果,将结果填入答题窗口的②。
c语言题库改错题及详解答案C语言是一种广泛使用的计算机编程语言,它以其强大的功能和灵活性而闻名。
在学习和掌握C语言的过程中,练习题库中的改错题是提高编程技能的有效方式。
以下是一些常见的C语言改错题及其详解答案。
1. 题目:编写一个程序,计算并输出1到10的累加和。
错误代码:```cint main() {int sum = 0;for(int i = 1; i <= 10; i++) {sum = sum + i;}print("Sum is %d", sum);return 0;}```错误点: `print` 函数应为 `printf`。
正确代码:```c#include <stdio.h>int main() {int sum = 0;for(int i = 1; i <= 10; i++) {sum += i; // 可以简化为 sum += i;}printf("Sum is %d\n", sum);return 0;}```2. 题目:编写一个程序,判断输入的年份是否为闰年。
错误代码:```cint main() {int year;printf("Enter a year: ");scanf("%d", &year);if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {printf("%d is a leap year.\n", year);} else {printf("%d is not a leap year.\n", year);}return 0;}```错误点:逻辑判断的括号使用不正确。
正确代码:```c#include <stdio.h>int main() {int year;printf("Enter a year: ");scanf("%d", &year);if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {printf("%d is a leap year.\n", year);} else {printf("%d is not a leap year.\n", year);}return 0;}```3. 题目:编写一个程序,实现字符串的反转。
【程序填空】功能:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
len=length(str...);I.nt length ........(p)N.++..;P.++..;【程序改错】功能:将一个字符串中的大写字母转换成小写字母。
bool (char)......fun(char *c)fun= c;(return *c)..........puts(*p);(putchar(*p)).............【程序设计】功能:编写函数实现两个数据的交换,在主函数中输入任意三个数据,调用函数对这三个数据从大到小排序。
------------------------------------------------*/ #include<stdio.h>void wwjt();void swap(int *a,int *b){/**********Program**********//********** End **********/ }main(){int x,y,z;scanf("%d%d%d",&x,&y,&z);if(x<y)swap(&x,&y);if(x<z)swap(&x,&z);if(y<z)swap(&y,&z);printf("%3d%3d%3d",x,y,z);wwjt();}void wwjt(){FILE *IN,*OUT;int m,n;int i[2];IN=fopen("in.dat","r");if(IN==NULL){printf("Read FILE Error"); }OUT=fopen("out.dat","w"); if(OUT==NULL){printf("Write FILE Error"); }for(n=0;n<3;n++){for(m=0;m<2;m++){fscanf(IN,"%d",&i[m]);}swap(&i[0],&i[1]);fprintf(OUT,"%d\n",i[0]);fprintf(OUT,"%d\n",i[1]);}fclose(IN);fclose(OUT);}/*-------------------------------------------------------【程序填空】功能:输入3个数a,b,c,按从小到大的顺序输出。
gc23.c下列程序是建立一个包含学生有关数据的单向链表。
但该程序有2个错误,错误出现在每个注释行附近,请调试改正。
调试改正中,不得改变程序结构,也不得增删语句。
#defineNULL0structstud{longnum;charname[10];floatscore;structstud*next;};/*……………comment……………*/intn;structstudcreate()////////structstud*create(void){structstud*head,*p1,*p2;n=0;p1=p2=(structstud*)malloc(sizeof(structstud));scanf("%ld,%s,%f",&p1->num,p1->name,&p1->score);/*……………comment……………*/head=NULL;while(p1!=0)//////////while(p1->num!=0){n=n+1;if(n==1)head=p1;elsep2->next=p1;p1=(structstud*)malloc(size(structstud));scanf("%ld,%s,%f",&p1->num,p1->name,&p1->score);}p2->next=NULL;return(head);}gc57.c的功能是互换给定数组中的最大数和最小数。
如将下面8个数:5,3,1,4,2,8,9,6变成:5,3,9,4,2,8,1,6程序中,最大数与最小数的互换操作通过函数调用来实现,让指针max和min分别指向最大数和最小数。
程序有二处错误,请改正。
注意:不得增行和删行,也不得修改程序的结构。
main(){inti;staticinta[8]={5,3,1,4,2,8,9,6};voidjhmaxmin();printf("Originalarray:\n");for(i=0;i<8;i++)jhmaxmin(a,8);printf("Arrayafterswapingmaxandmin:\n");for(i=0;i<8;i++)printf("%5d",a[i]);printf("\n");}//注意:voidjhmaxmin(p,n)intp,n;这是一种老的函数形式,现在一般这样写voidjhmaxmin(intp,intn)voidjhmaxmin(p,n)intp,n;////////int*p,n;{intt,*max,*min,*end,*q;end=p+n;max=min=p;for(q=p+1;q<end;q++){if(*q>*max)max=q;if(*q<max)min=q;////////*q<*min}t=*max;*max=*min;*min=t;}gc101.c的功能为:输入8个整数,使用指针以选择法对其进行排序(从小到大).程序中有两处错误代码,请改正.注意,不得改变程序结构。
#include<stdio.h>main(){inta[8],*p=a;inti,j;inttempmin,tempcode;printf("\ninputthenumbers:\n");for(i=0;i<8;i++)scanf("%d",p+i);tempmin=*p;for(i=0;i<7;i++){for(j=i;j<8;j++)if(j==i||*(p+j)<tempmin){tempmin=*(p+i);//////////tempmin=*(p+j);tempcode=j;};if(tempcode!=i){*(p+tempcode)=*(p+i);*(p+j)=tempcode;/////////////*(p+i)=tempmin;}}for(i=0;i<8;i++)}gc137.c中的sub函数的功能是:将s所指字符串的反序和正序进行连接形成一个新串放在t所指的数组中。
例如,当s所指字符串的内容为“ABCD”时,t所指数组中的内容为“DCBAABCD”。
请改正函数sub中的两个错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得修改程序的结构。
#include"stdio.h"#include"conio.h"#include"string.h"voidsub(char*s,char*t){inti,d;d=strlen(s);for(i=1;i<d;i++)///////for(i=0;i<d;i++)t[i]=s[d-1-i];for(i=0;i<d;i++)t[d+i]=s[i];t[2*d]='/0';/////////t[2*d]='\0';}main(){chars[100],t[100];clrscr();printf("\nPleaseenterstringS:");scanf("%s",s);sub(s,t);printf("\nTheresultis:%s\n",t);}gc163.c的功能是实现求1000以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:6=1+2+3,28=1+2+4+7+14),并显示结果。
但该程序中有3处错误,请调试并改正。
不允许改变程序结构和增删语句。
#include<stdio.h>voidmain(void){inti,k,m,n,s,p;//////////////////p=0inta[100];printf("\n10000以内的自然数中的完数有:");for(i=2;i<=10000;i++){s=0;m=0;for(k=1;k<=i/2;k++){if(i%k==0){s=s+k;a[m]=k;m=m+1;}}if(s=i)////////if(s==i){p=p-1;//////////p=p+1printf("\n%d=%d",s,a[0]);n=1;while(n<m){printf("+%d",a[n]);n=n+1;}}}printf("\n总个数为:%d\n",p);}gc165.c程序中的函数find_str()用来返回字符串s2在字符串s1中第一次出现的首地址;如果字符串s2不是s1的子串,则该函数返回空指针NULL。
现在程序中发现有两个错误,错误就出现在那些注释行的附近,请你找出错误并将它们改正过来,要求在调试过程中不允许改变程序结构,更不得增删语句。
include<stdio.h>#include<string.h>char*find_str(char*s1,char*s2){inti,j,ls2;ls2=strlen(s2);for(i=0;i<=strlen(s1)-ls2;i++){for(j=0;j<ls2;j++)if(s1[j+i]!=s2[j])break;/*mentone..............*/if(j==ls2)return(s1+j);//////return(s1+i)}returnNULL;}voidmain(){char*a="dos6.22windows98office2000",*b="windows",c;///////*c/*menttwo..............*/c=find_str(a,b);if(c!=NULL)printf("%s\n",c);elseprintf("未找到字符串%s\n",b);}gc166.c程序的功能是:计算并输出从键盘输入的任一正整数的各位数字之和s以及各位数字之积t。
例如,当输入的正整数为237时,s的值为12,t的值为42。
请改正程序中的两个错误,使它能得出正确的结果。
注意:不得增行或删行,也不得修改程序的结构。
#include"stdio.h"main(){intn,yw,s=0,t=0;/////////t=1scanf("%d",&n);while(n!=0){yw=n%10;s=s+yw;t=t*yw;n=n%10;////////////n=n/10}printf("s=%d,t=%d\n",s,t);}gc228.c代码功能为:使用指针将数组a中10个整数按相反的顺序存放。
程序中有3处错误代码,请指出并改正之.voidinv(x,n)int*x,n;{int*p,t,*i,*j,m=(n-1)/2;i=x;j=n;///////////j=x+n-1;p=x+m;for(;i<=p;i++,j--){t=*i;*i=*j;*j=t;}return;}main(){inta[10],i;printf("input10number");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("Theoriginalarray:\n");for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");inv(a,n);/////////////////inv(a,10);printf("Thearrayhasbeeninverted:\n");for(i=0;i<10;i--)/////////////////for(i=0;i<10;i++)printf("%d,",a[i]);printf("\n");}gc234.c中函数fun的功能是:求S的值。
设S=((2*2)/3)*((4*4)/(3*5))*...*((2*k*2*k)/((2*k-1)*(2*k+1)))请改正函数fun中的两个错误,使程序能输出正确的结果。