串,且串长小于M。
void fun(char (*ss)[M])
{char *ps[N],*tp;int i,j,k; for(i=0;i if(strlen(ps[k]) for(i=0; i {for(j=i+1;j<6;j++){ 后重复出现一次,放在一个新串t中。当s中的字符串为:\时,则t中的字符串应为:\。 void fun (char *s, char *t) {int i,j,sl;sl=strlen(s); for(i=sl-1,j=0;i>=0;i-=2) {if(i-1>=0)t[j++]=s[i-1]; if(i-1>=0)t[j++]=s[i-1]; t[j++]=s[i];t[j++]=s[i];} t[j]=0;} main() {char s[100],t[100]; printf(\scanf(\ printf(\之后插入一个*号。例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:def3*5*adh3*kjsdf7*。 void fun(char *s) {int i,j,n; for(i=0;s[i]!='\\0';i++) if(s[i]>='0'&&s[i]<='9'){n=0; while(s[i+1+n]!=0)n++; for(j=i+n+1;j>i;j--) s[j+1]=s[j];s[j+1]='*';i=i+1;}} 185在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,若找不到相同的字符则函数不做任何处理。例如,s所指字符串为:baacda,c中的字符为:a,执行后s所指字符串为:baaaacdaa。 {int i,j=0,len; for(i=0;i strcpy(ss[j++],ss[i]);} return j;} 192在形参SS所指字符串数组中,将所有串长超过K的字符串右边的字符删除,只保留左边的K个字符串数组中共有N个字符串,且串长小于M。 void fun (char (*ss)[M],int k) {int i=0; while(i 193计算出形参S所指字符串中包含的单词个数作为函数值返回。为便于统计,规定各if(strcmp(*(pstr+i),*(pstr+j))>0) {p=*(pstr + i);pstr[i]=pstr[j]; *(pstr+j)=p;}}}} 173将仅在字符串s中出现而不在字符串t中出现的字符,和仅在字符串t中出现而不在字符串s中出现的字符,构成一个新字符串放在u中,u中的字符按原字符串中字符顺序排列,不去掉重复字符。例如:当s=\,t=\时,u中的字符串为:\。 void fun(char *s,char *t,char *u) {int i,j,sl,tl;sl=strlen(s); tl=strlen(t); for(i=0;i if(j>=sl)*u++=t[i];}*u='\\0';} 174将既在字符串s中出现、又在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,但去掉重复字符。例如,当s=\,t=\时,u中的字符串为:\。 void fun(char *s,char *t,char *u) {int i,j,sl,tl,k,ul=0; sl=strlen(s);tl=strlen(t); for (i=0;i if(j void fun(char *s, char *t, char *u) {int i,j,sl,tl,k,ul=0; sl=strlen(s);tl=strlen(t); for(i=0;i if(j>=sl){for(k=0;k if(k>=ul)u[ul++]=t[i];}} u[ul]='\\0';} 176将在字符串s中出现、而未在字符串t中出现的字符形成一个新的字符串放在u中,u中字符按原字符串中字符顺序排列,不去掉重复字符。例如:当s=\,t=\时,u中的字符串为\。 void fun(char *s,char *t, char *u) {int i,j,sl,tl; sl=strlen(s);tl=strlen(t); for(i=0;i if(j>=tl)*u++ =s[i];}*u = '\\0';} 177将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个新串t中,t中字符按原字符串中字符出现的逆序排列。(注意0为偶数)例如:当s中的字符串为:\时,则t中的字符串应为:\。 void fun(char *s,char *t) {int i,j,sl;sl=strlen(s); if(sl%2)sl-=2;else sl--; for(i=sl,j=0;i>=0;i-=2) {t[2*j]=s[i];t[2*j +1]=s[i]; j++;}t[2*j]='\\0';} 178从字符串s尾部开始,按逆序把相邻的两个字符交换位置,并依次把每个字符紧随其 179从字符串s尾部开始,按逆序把在其中出现的每相邻的两个字符,紧随其后重复出现一次,放在一个新串t中,若字符串s中头部有剩余的单个字符也重复,放在t的最后。例如:当s中的字符串为:\时,则t中的字符串应为:\。 void fun(char *s,char *t) {int i,j,sl;sl=strlen(s); for(i=sl-1,j=0;i>=0;i-=2) {t[j++]=s[i]; if(i-1>=0)t[j++]=s[i-1]; t[j++]=s[i];if(i-1>=0) t[j++]=s[i-1];}t[j] ='\\0';} main() {char s[100],t[100]; printf(\scanf(\ printf(\180将在字符串s中出现、而未在字符串t中出现的字符,构成一个新的字符串放在u中,u中字符按原字符串中字符顺序的逆序排列,不去掉重复字符。 例如,当s=\,t=\时,u中的字符是:\。 void fun(char *s,char *t,char *u) {int i,j,sl,tl,ul;char r,*up=u; sl=strlen(s);tl=strlen(t); for(i=0;i {r=up[i];up[i]=up[ul-1-i]; up[ul-1-i]=r;}} 181把在字符串s中出现的每个字符,紧随其后重复出现一次,形成一个新串放在t中,且在t中把原相邻字符的位置进行了交换。例如:当s中的字符串为:\时,则t中的字符串应为:\。 void fun(char *s,char *t) {int i,j,sl;sl=strlen(s); for(i=0,j=0;i {if(i+1 t[2*j]=s[i];t[2*j+1]=s[i]; j++;}t[2*sl]='\\0';} main() {char s[100],t[100]; printf(\scanf(\ printf(\182求出形参ss所指字符串数组中最长字符串的长度,其余字符串左边用字符*补齐,使其与最长的字符串等长。 void fun(char (*ss)[N]) {int i,j,k=0,n,m,len; for(i=0;i if(len>n){n=len;k=i;}} for(i=0; i if(i!=k){m=n;len=strlen(ss[i]); for(j=len;j>=0;j--) ss[i][m--]=ss[i][j]; for(j=0;j 183求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长。 void fun(char (*ss)[N]) {int i,j,n,len=0; for(i=0;i for(i=0;i for(i=0;s[i]!=0;i++) if(s[i]==c){n=0; while(s[i+1+n]!='\\0')n++; for(j=i+n+1;j>i;j--)s[j+1]=s[j]; s[j+1]=c;i=i+1;}} 186将a和b所指的两个字符串转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含9以下数字字符。例如,主函数中输入字符串:32486和12345,在主函数中输出的函数值为:44831。 long ctod(char *s) {long d=0; while(*s)if(isdigit(*s)) {d=d*10+*s-‘0’; s++;}return d;} long fun(char *a,char *b) {return ctod(a)+ctod(b);} 187在形参ss所指字符串数组中查找与形参t所指字符串相同的串,找到后返回该串在字符串数组中的位置(下标值),未找到则返回-1。ss所指字符串数组中共有N个内容不同的字符串,且串长小于M。 int fun(char (*ss)[M],char *t) {int i; for(i=0;i if(strcmp(ss[i],t)==0)return i; return -1;} main() {char ch[N][M]={?},t[M];int n,i; printf(?); for(i=0;i printf(\else printf(?);} 188在形参ss所指字符串数组中查找含有形参substr所指字符串并输出,若没找到则输出相应信息,ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数 strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为0,若有,为非0。 void fun(char (*ss)[M],char *substr) {int i,find=0; for(i=0;i if(strstr(ss[i],substr)1=NULL) {find=1;puts(ss[i]);printf(“\\n”):} if(find==0) printf(“\\nDon’t found!\\n”);} 189求ss所指字符串数组中长度最长的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长 for(i=0;i if(len>*n){*n=len;k=i;}} return(k);} 190求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长 for(i=0;i if(len<*n){*n=len;k=i;}} return(k);} 191在形参SS所指字符串数组中,删除所有串长超过K的字符串,函数返回所剩字符串的个数,SS所指字符串数组中共有N个字符串,且串长小于M。 int fun(char (*ss)[M],int k) 单词之间用空格隔开。例如:形参S所指的字符串为:This is a C language program,函数的返回值为6。 int fun(char *s) {int n=0,flag=0; while(*s!=’\\0’) {if(*s!=’ ‘&&flag==0) {n++;flag=1;} if(*s==’’)flag=0;s++;} return n;} 194将形参S所指字符串所有ASCII码值小于97的字符存入形参t所指字符数组中,形成一个新串,并统计出符合条件的字符个数作为函数值返回。例如,形参S所指的字符串为:Abc@1x56*,程序执行后t所指字符数组中的字符串应为:A@156* int fun(char *s,char *t) {int n=0; while(*s){*(t+n)=*s;n++;} s++;}*(t+n)=0;return n;} 四、结构体题: 195建立一个带头结点的单向链表并输出到文件“out98.dat”和屏幕上,各结点的值为对应的下标,链表的结点数及输出的文件名作为参数传入。 void fun(int n,char*filename) {NODE *h,*p,*s;FILE *pf;int i; h=p=(NODE *)malloc(sizeof(NODE)); h->data=0; for(i=1;i {s=(NODE *)malloc (sizeof (NODE)); s->data=i;p->next=s;p=p->next;} p->next=NULL; if((pf=fopen(filename,\{printf(\exit(0);}p=h; fprintf(pf,\printf(\while(p){fprintf(pf,\printf(\if(p->next!=NULL) {fprintf(pf,\p=p->next;}fprintf(pf,\printf(\while(p){s=p;p=p->next;free(s);}} 196给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据域中的数据从小到大顺序链接。函数的功能是:把形参x的值放入一个新结点并插入到链表中,插入后各结点仍保持从小到大顺序排列。 void fun( SLIST *h, int x) {SLIST *p, *q, *s; s=(SLIST *)malloc(sizeof(SLIST)); s->data=x;q=h;p=h->next; while(p!=NULL && x>p->data) {q=p;p=p->next;} s->next=p;q->next=s;}} 197对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。 STU *fun(STU a[], int m) {STU b[N],*tt;int i,j,k; tt=(STU*)malloc(sizeof(STU)*m); for(i=0;i if(b[i].order>b[j].order) j=i;tt[k]=b[j];b[j].order=0;} return tt;} 198函数的功能是将存学生数据的结构体数组,按照姓名的字典序(从小到大排序) void fun(struct student a[],int n) struct student t;int i,j; for(i=0;i if(strcmp(a[i].name,a[j].name)>0) {t=a[i];a[i]=a[j];a[j]=t;}} 199给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。 void fun( SLIST *p) {SLIST *t,*s;t=p->next;s=p; while(t->next!=NULL) {s=t;t=t->next;} printf(\s->next=NULL;free(t);} 200已知学生的记录由学号和学习成绩构成,207人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在形参k所指的数组中。 int fun(STU *std,STU *k,int year) {int i,n=0; for(i=0;i if(std[i].year==year) k[n++]= std[i];return (n);} 208通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都87,修改后输出t中的数据应为:10004、“LiJie”、93、85、87。 void fun(struct student b) {b->sno=10004; strcpy(b->name,”LiJie”);} main() {struct student t={1002?87}; int i;printf(?);printf(?); for(i=0;i<3;i++)printf(?); fun(&t);??} 214将带头节点的单向链表结点数据域中的数据从小到大排序,即若原链表结点数据为:10,4,2,8,6,排序后链表结点数据域从while(str[i]){ch=str[i]; fputc(ch,fp);putchar(ch);i++;} fclose(fp);} 219从键盘输入若干行文件(每行不超过80个字符),写到文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。 void WriteText(FILE *fw) {char str[81]; printf(\gets(str); while(strcmp(str,\ {fputs(str,fw);fputs(\N名学生的数据已存入a结构体中,给定程序的功能是找出成绩最低的学生记录,通过形参返回主函数。 fun(STU a[],STU *s) {STU h;int i;h=a[0]; for(i=1;i if(a[i].s 201给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序链接。删除链表中数据域相同的结点,使之只保留一个。 void fun( SLIST *h) {SLIST *p,*q;p=h->next; if(p!=NULL){q=p->next; while(q!=NULL) {if(p->data==q->data) {p->next=q->next; free(q);q=p->next;} else{ p=q;q=q->next;}}}} 202建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。 int fun(NODE *h) {int sum=0;NODE *p;p=h->next; while(p){if(p->data%2==0) sum+=p->data;p=p->next;} return sum;} 203在带有头结点的单向链表中,查找数据域中值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回0值。 void outlist(SLIST *); int fun(SLIST *h, char ch) {SLIST *p; int n=0;p=h->next; while(p!=0){n++; if(p->data==ch)return n; else p=p->next;}return 0;} main() {SLIST *head;int k;char ch; char a[N]={?};head=creatlist(a); outlist(head); printf(\ scanf(\if(k==0) printf(\else printf(\sequence number is : %d\\n\ 204统计出带有头结点的单向链表中结点的个数,存放在形参n所指的存储单元中。 void fun(SLIST *h,int *n) {SLIST *p;(*n)=0;p=h->next; while(p){(*n)++;p=p->next;}} main() {SLIST *head;int a[N]={?},num; head=creatlist(a); outlist(head); fun(head,&num); printf(\ 205计算出带有头结点的单向链表中各结点数据域之和作为函数值返回。 int fun(SLIST *h) {SLIST *p;int s=0;p=h->next; while(p){s+=p->data;p=p->next;} return s;} main() {SLIST *head;int a[N]={?}; head=creatlist(a);outlist(head); printf(\206人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。 STU fun(STU *std,char *num) {int i;STU a={\for(i=0;i if(strcmp(std[i].num,num)==0) return (std[i]);return a;} 乘以一个系数a。 void modify(STU *ss,float a) {int i; for(i=0;i<3;i++)ss->score[i]*=a;} main( ) {STU std={?};float a; printf(\?\ printf(\scanf(\printf(\\\nA result of modifying:\\n\); show(std);} 209将形参指针所指结构体数组中的三个元素按num成员进行升序排列。 void fun(PERSON std[3]) {PERSON temp; if(std[0].num>std[1].num) {temp=std[0];std[0]=std[1]; std[1]=temp;} if(std[0].num>std[2].num) {temp=std[0];std[0]=std[2]; std[2]=temp;} if(std[1].num>std[2].num) {temp=std[1];std[1]=std[2]; std[2]=temp;}} main() {PERSON std[ ]={?};int i; fun(std); printf(\for(i=0; i<3; i++) printf(\%d,%s\\n\,std[i].num,std[i].name);} 210将形参std所指结构体数组中年龄最大者的数据作为函数值返回。 STD fun(STD std[],int n) {STD max; int i;max= *std; for(i=1;i if(max.age {STD std[5]={?};STD max; max=fun(std,5); printf(\ printf(\?\211程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。例如:a所指变量中的学号、姓名、和三门课的成绩依次是:10001、\、95、80、88,则修改后输出b中的数据应为:10002、\、95、80、88。 void fun(struct student a) {struct student b;int i; b=a;b.sno=10002; strcpy(b.name,\printf(?);printf(?); for (i=0;i<3;i++) printf(\212程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量S中的数据进行修改,并把a中地址和为函数值返回主函数,在主函中输出修改后的数据。例如:a所指变量S的学号、姓名和三门课的成绩依次是:10001、“ZhangSan”、95、80、88,修改后输出t中的数据应为:10002、“LiSi”、96、81、89。 struct student *fun(struct student *a) {int i;a->sno=10002; strcpy(a->name,”LiSi”); for(i=0;i<3;i++)a->score[i]+=1; return a;} 213程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。例如:b所指变量t的学号、姓名和三门课的成绩依次是:10002、“ZhangQi”、95、85、 头尾的数值为:2,4,6,8,10。 void fun(NODE *h) {NODE *p,*q;int t;p=h->next; while(p) {q=p->next; while(q) {if(p->data>=q->data) {t=p->data;p->data=q->data; q->data=t;}q=q->next;} p=p->next;}} 215将不带头节点的单向链表结点数据域中的数据从小到大排序,即若原链表结点数据为:10,4,2,8,6,排序后链表结点数据域从头尾的数值为:2,4,6,8,10。 void fun(NODE *h) {NODE *p,*q;int t; while(p) {q=p->next; while(q) {if(p->data>q->data) {t=p->data;p->data=q->data; q->data=t;}q=q->next;} p=p->next;}} 216将不带头节点的单向链表逆置,即若原链表中从头至尾结点数据域依次为2,4,6,8,10;逆置后,从头至尾结点数据域依次为:10,8,6,4,2。 void fun(NODE *h) {NODE *p,*q,*r;p=h->next; if(p==0)return 0;q=p->next; p->next=NULL; while(q) {r=q->next;q->next=p;p=q;q=r;} h->next=p;} 五、文件题: 217把文本文件B中的内容追加到文本文件A的内容之后。例如,文件B的内容为“I’m ten.”,文件A的内容为“I’m a student!”,追加之后文件A的内容为“I’m a student ! I’m ten.” main() {FILE *fp,*fp1,*fp2;int i; char c[N],t,ch; if((fp=fopen(\=NULL) {printf(\exit(0);} printf(\for(i=0;(ch=fgetc(fp))!=EOF;i++) {c[i]=ch;putchar(c[i]);} fclose(fp); if((fp=fopen(\=NULL) {printf(\file B cannot be opened\\n\exit(0);} printf(\for(i=0;(ch=fgetc(fp))!=EOF;i++) {c[i]=ch;putchar(c[i]);}fclose(fp); if((fp1=fopen(\dat\\))&&(fp2=fopen(\B.dat\,\r\ {while((ch=fgetc(fp2))!=EOF) fputc(ch,fp1);}else {printf(\fclose(fp2);fclose(fp1); printf(\if((fp=fopen(\=NULL) {printf(\exit(0);} for(i=0;(ch=fgetc(fp))!=EOF;i++) {c[i]=ch;putchar(c[i]);} fclose(fp);} 218先以只写方式打开文件“out99.dat”,再把字符串str中的字符保存到这个磁盘文件中。 main() {FILE *fp;int i=0;char ch; char str[N]=\ if((fp=fopen(″out99.dat″, ″w″))==NULL) {printf(\exit(0);} gets(str);}} void ReadText(FILE *fr) {char str[81]; printf(\file and output to screen :\\n\fgets(str,81,fr); while(!feof(fr)){printf(\fgets(str,81,fr);}} 220将自然数1~10以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。 int fun(char *fname ) {FILE *fp;int i,n;float x; if((fp=fopen(fname,\=NULL) return 0; for(i=1;i<=10;i++) fprintf(fp,\printf(\fclose(fp); printf(\if((fp=fopen(fname,\=NULL) return 0;fscanf(fp,\while(!feof(fp)) {printf(\fscanf(fp,\fclose(fp);return 1;} 221将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值是1,失败时返回值为0。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放在变量tfname中。 int fun(char *source,char *target) {FILE *fs,*ft; char ch; if((fs=fopen(source, \=NULL) return 0; if((ft=fopen(target, \=NULL) return 0; printf(\ch=fgetc(fs); while(!feof(fs)){putchar(ch); fputc(ch,ft);ch=fgetc(fs);} fclose(fs); fclose(ft); printf(\ 222建立班级通讯录,通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中。 int fun(STYPE *std) {FILE *fp;int i; if((fp=fopen(\=NULL) return(0); printf(\for(i=0;i fwrite(&std[i],sizeof(STYPE),1,fp); fclose(fp);return (1);} 223将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。 void fun(char *s,int a,double f) {FILE *fp;char ch; fp = fopen(\ fprintf(fp, \fclose(fp);fp=fopen(\printf(\ch=fgetc(fp); while(!feof(fp)) {putchar(ch);ch = fgetc(fp);} putchar('\\n');fclose(fp);} 224将形参给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调 用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将显示在屏幕上。 void fun(char *s,int a,double f) {FILE *fp;int a1;double f1; char str[100],str1[100],str2[100]; fp=fopen(“file1.txt”,”w”); fprintf(fp,”%s %d %f\\n”,s,a,f); fclose(fp); fp=fopen(“file1.txt”,”r”); fscanf(fp,”%s%s%s”,str,str1,str2); fclose(fp); a1=stoi(str1);f1=atof(str2); printf(“%s%d%f”,str,a1,f1);} 225程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。 void fun(char *filename) {FILE *fp;int i,j;STU s[N],t; fp=fopen(filename,\fread(s,sizeof(STU),N,fp); fclose(fp); for(i=0;i {t=s[i];s[i]=s[j];s[j]=t;} fp=fopen(filename,\fwrite(s,sizeof(STU),N,fp); fclose(fp);} 226程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其它学生数据不变,若找不到,则什么都做。 void fun(char *filename,long sno) {FILE *fp;STU n;int i; fp=fopen(filename,”rb+”); while(!feof(fp)) {fread(&n,sizeof(STU),1,fp); if(n.sno==sno)break;} if(!feof(fp)) {for(i=0;i<3;i++)n.score[i]+=3; fseek(fp,-(long)sizeof(STU),SEEK_CUR); fwrite(&n,sizeof(STU),1,fp);} fclose(fp);} 改错 一、数字题 1根据整型形参 m,计算如下公式的值。y=1+1/(2*2)+1/(3*3)+1/(4*4)+?+1/(m*m)的值。例如,若m=5,则应输出:1.463611。 double fun(int m) {double y=1.0;int i; for(i=2;i<=m;i++)y+=1.0/(i*i); return(y);} 2根据形参m,计算下列公式的值。t=1-1/2 +1/3-1/4+?+(-1)(m+1) /m例如,若输入5,则应输出0.783333。 double fun(int m) {double t=1.0,j=1.0;int i; for(i=2;i<=m;i++){j=-1*j;t+=j/i;} return t;} 3根据整型参数m,计算如下公式的值。y=1/(100×100)+1/(200×200)+1/(300×300)+?+1/(m×m)。例如,若m=2000,则应输出0.000160。 double fun (int m) {double y=0, d;int i; for(i=100;i<=m;i+=100) {d=(double)i*(double)i;y+=1.0/d;} return(y);} 4根据以下公式求π的值。例如,给eps输入0.0005时,应当输出Pi=3.140578。π/2=1+1/3+1/3*2/5+1/3*2/5*3/7+? double fun(double eps) {double s,t; int n=1;s=0.0;t=1.0; while(t>=eps){s+=t;t=t*n/(2*n+1); n++;}return (s*2);} 5根据形参m,计算下列公式的值。 t=1+1/2+1/3+1/4+?+1/m。例如,若输入5,则应输出2.283333。 double fun(int m) {double t=1.0;int i; for(i=2;i<=m;i++)t+=1.0/i; return t;} 6根据整型参数m,计算如下公式的值。 y=1+1/根号(2)+1/根号(3)+??1/根号(n) 例如,若m中的值为:5,则应输出:3.231671 #include for(i=1;i<=m;i++){t=1/sqrt(i); y=y+t;}return y;} 7根据整型形参m的值,计算如下公式的值。t=1-1/(2×2)-1/(3×3)-?-1/(m×m) 例如m=5,则应输出0.536389 double fun(int m) {double y=1.0;int i; for(i=2;i<=m;i++)y-=1.0/(i*i); return(y);} 8根据整型形参m,计算如下公式的值。y=1-1/(2×2)+1/(3×3)-1/(4×4)+? +(-1)(m+1) /(m×m)例如:m中的值为5,则应输出0.838611。 double fun(int m) {double y=1.0;double j=1.0;int i; for(i=2;i<=m;i++){j=-1*j; y+=j/(i * i);}return(y);} 9根据整型形参n,计算如下公式的值。A1=1,A2=1/(1+A1),A3=1/(1+A2),?,An=1/(1+A(n-1)).例如,若n=10,则应输出0.617977。 float fun(int n) {float A=1;int i; for(i=2;i<=n;i++)A=1.0/(1+A); return A;} 10求s=aa?aa-?-aaa-aa-a(此处aa?aa表示n个a,a和n的值在1至9之间)。如a=3,n=6,则以上表达式为:s=333333-33333-3333-333-33-3。其值是296298。 long fun(int a,int n) {int j;long s=0,t=0; for(j=0;j 11用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止。π/4≈1-1/3+1/5-1/7+?例如,输入0.0001,则程序输出3.1414。 float fun(float num) {int s;float n,t,pi;t=1; pi=0;n=1;s=1; while(fabs(t)>=num) {pi=pi+t;n=n+2;s=-s;t=s/n;} pi=pi*4;return pi;} 12计算并输出下列级数的前N项之和SN,直到SN+1大于q为止,q的值通过形参传入。 SN=2/1+3/2+4/3+(N+1)/N。例如,若q的值为50.0,则函数值为49.394948。 double fun(int q) {int n; double s,t;n=2;s=2.0; while(s<=q){t=s; s=s+(double)(n+1)/n;n++;} printf(\13求S的值。设 S=(22/(1*3))*(42/(3*5))*(62 /(5*7))* ? *(2k)2 /((2k-1)*(2k+1))例如,当k为10时,函数的值应为1.533852。 float fun(int k) {int n; float s,w,p,q;n=1;s=1.0; while(n<=k){w=2.0*n;p=w-1.0;q=w+1.0; s=s*w*w/p/q;n++;}return s;} 14计算S=f(f(-1.0)+f(5.0))的值。结果为:2488.000000。f(x)函数定义如下: ┌2x^2+3x+4 (x<=2) 设f(x)=│ └-2x^2+3x-4 (x>2) double f(double x) {double y; if (x<=2.0)y=2.0*x*x+3.0*x+4.0; else y=-2.0*x*x+3.0*x-4.0; return y;} 15计算S=f(-n)+f(-n+1)+? +f(0)+f(1)+f(2)+?f(n)的值。例如,当n为5时,函数值应为10.407143。f(x)函数定义如下: (x+1)/(x-2) x>0 f(x) = 0 x=0或x=2 (x-1)/(x-2) x<0 double f(double x) {if(x==0.0||x==2.0)return 0.0; else if(x<0.0)return(x-1)/(x-2); else return(x+1)/(x-2);} double fun(int n) {int i;double s=0.0,y; for(i=-n; i<=n;i++) {y=f(1.0*i);s+=y;}return s;} 16按以下递归公式求函数值。 10 (n=1) Fun(n)= Fun(n-1)+2 (n>1) 例如,当给n输入5时,函数值为18 fun(int n) {int c; if(n==1)c=10; else c=fun(n-1)+2;return(c);} 17计算函数 F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。其中x和y不相等,z和y不等。例如,当x的值为9,y的值为11,z的值为15时,函数值为-3.50。 #define FU(m,n) (m)/(n) float fun(float a,float b,float c) {float value; value=FU(a+b,a-b)+FU(c+b,c-b); return(value);} 18用二分法求方程2x3-4x2 +3x-6=0的一个根,并要求绝对误差不超过0.001。例如,若给m输入-100,给n输入90,则函数求得的一个根值为2.000。 double funx(double x) {return (2*x*x*x-4*x*x+3*x-6);} double fun(doble m, double n) {double r;r=(m+n)/2; while(fabs(n-m)>0.001) {if(funx(r)*funx(n)<0) m=r; else n=r;r=(m+n)/2;}return r;} 19传入一个整数m,计算如下公式的值。t=1/2-1/3-?-1/m例如,若输入5,则应输出-0.283333。 double fun(int m) {double t=1.0;int i; for(i=2;i<=m;i++)t=t-1.0/i; return t;} 20求出以下分数序列的前n项之和。1/2,2/3,3/5,5/8,8/13,13/21?和值通过函数值返回main函数。例如,若n的值为:5,则应输出:3.007051。 double fun(int n) {int i;double t,s,a,b,c;s=0; a=1;b=2; for(i=0;i 2/1,3/2,5/3,8/5,13/8,21/13,??和值通过函数值返回主函数。例如,若输入n=5,则应输出8.391667。 double fun (int n) {int a=2,b=1,c,k;double s=0.0; for(k=1;k<=n;k++){s=s+1.0*a/b; c=a;a+=b;b=c;}return(s);} 22计算1+2+3+??+n的和值。 float fun(int n) {double t; if(n==1)return(1); else t=fun(n-1)+n;return t;} 23应用递归算法求某数a的平方根。求平方根的迭代公式如下:x1=(x0+a/x0)/2。例如,2的平方根为1.414214。 double fun(double a,double x0) { double x1,y;x1=(x0+a/x0)/2.0; if(fabs(x1-x0)>=0.00001) y=fun(a,x1); else y=x1;return y;} 24求k!(k<13),例如:若k=10,则应输出3628800。 long fun(int k) {if(k>0)return(k*fun(k-1)); else if(k==0)return 1;} 25计算整数n的阶乘。 double fun(int n) {double result=1.0; while(n>1&&n<170)result*=n--; return result;} 26计算正整数num的各位上的数字之积,例如,若输入:252,则输出应该是:20。 long fun(long num) {long k=1 ; do{k*=num;num/=10;}while(num); return (k);} 27算正整数num的各位上的数字之平方和。例如:输入352,则输出应该是38;若输入328,则输出应该是77。 long fun(long num) {long k=0; do{k+=(num)*(num); num/=10;}while(num);return (k);} 28计算并输出high以内的素数之和。high由主函数传给fun函数。若high的值为100,则函数的值为1060。 int fun(int high) {int sum=0,n=0, j, yes; while(high>=2){yes=1; for(j=2; j<=high/2; j++) if(high%j==0){yes=0;break;} if(yes){sum+=high;n++;} high--;}return sum;} 29计算并输出k以内最大的6个能被7或11整除的自然数之和。若k的值为500,则函数的值为2925。 int fun(int k) {int m=0,mc=0, j; while((k>=2)&&(mc<6)) {if((k%7==0)||(k==0)){m+=k; mc++;}k--;}return m;} 30数列中,第一项为3,后一项都比前一项的值增5。下列给定程序中,函数的功能是:计算前n(4≤n≤50)项的累计和。在累加过程中把那些被4除后余2的当前累加值放入数组中,符合此条件的累加值的个数作为函数值返回主函数里。如,当n的值为20时,该数列为3,8,13,18,23,28,?,93,98。符合此条件的累加值应为42,126,366,570,1010。 int fun(int n, int *a) {int i,j=0,k,sum;sum=0; for(k=3,i=0;i if(sum%4==2)a[j++]=sum;} return j++;} 31读入一个整数k(2≤k≤10000),打印它的所有质因子(即所有为素数的因子)。例如,若输入整数理化2310。则应输出:2、3、7、11。 isPrime (int n) {int i, m; m=1; for(i=2;i if(!(n%i)){m=0;break;}return(m);} 32将长整型数中每一位上为偶数的数依次逆向取出,构成一个新数放在t中。高位在低位,低位在高位。当s中的数为25846513时,t中的数为6482。 void fun(long s,long *t) {int d;long s1=1,i=1;*t=0; while(s/i>0)i=i*10;i=i/10; while(s>0){d=s/i; if(d%2==0){*t=d*s1+*t;s1*=10;} s=s%i;i=i/10;}} 33已知一个数列从0项开始的前3项:0,0,1,以后的各项都是其相邻的前3项之和。函数fun的功能是:计算并输出该数列前n项的和sum。n的值通过形参传入。例如,当n=10时,程序输出结果应为96.000000。 double fun(int n) {double sum,s0,s1,s2,s;int k; sum=1.0; if(n<=2)sum=0.0; s0=0.0;s1=0.0;s2=1.0; for (k=4;k<=n;k++) {s=s0+s1+s2;sum+=s;s0=s1;s1=s2; s2=s;}return sum;} 34计算并输出k以内最大的10个能被13或17整除的自然数之和。例如,若k的值为500,则函数的值为4622。 int fun(int k) {int m=0,mc=0, j; while((k>=2)&&(mc<10)) {if((k==0)||(k==0)) {m=m+k;mc++;}k--;}return m;} 35通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如,变量a中的值原为8,b中的值原为3,程序运行后a中的值为3,b中的值为8。 int fun(int *x,int y) {int t;t=*x;*x=y;return(t);} 36实现两个整数的交换。例如给a和b分别输入60和65,输出为:a=65 b=60 void fun(int *a,int *b) {int t;t=*b;*b=*a;*a=t;} 37将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。当s中的数为87653142时,t中的数为8642。 void fun(long s,long *t) {long d;long s1=1;*t=0; while(s>0){d=s; if(d%2==0){*t=d*s1+*t;s1*=10;} s/=10;}} 38从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。例如,当s中的数为7654321时,t中的数为642。 void fun(long s,long *t) {long s1=10;s/=10;*t=s; while(s>0) {s=s/100;*t=s*s1+*t;s1=s1*10;}} 39从低位开始取出长整型变量s中奇数位上的数,依次构成一个新数放在t中。例如,当s中的数为7654321时,t中的数为7531。 void fun(long s,long *t) {long s1=10;*t=s; while(s>10){s=s/100;*t=s*s1+*t; s1=s1*10;}} 40将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。当s中的数为87653142时,t中的数为7531。 void fun(long s,long *t) {int d;long s1=1;*t=0; while(s>0){d=s; if(d%2!=0){*t=d*s1+*t;s1*=10;} s/=10;}} 41求出两个数的最大公约数,并作为函数值返回。例如,若给num1和num2输入49和21,则输出的最大公约数为7;若给num1和num2分别输入27和81,则输出最大公约数为27。 int fun (int a, int b) {int r,t; if(a fun(int x,int y,int z) {int j,t,n,m;j=1; t=j%x;m=j%y;n=j%z; while(t!=0||m!=0||n!=0) {j=j+1;t=j%x;m=j%y;n=j%z;} return j;} 43求广义斐波那契数的第n项。1,1,1,3,5,9,17,31,?? 项值通过函数值返回 main函数。例如,若n=15,则应输出:2209。 long fun(int n) {long a=1,b=1,c=1,d=1,k; for(k=4;k<=n;k++){d=a+b+c; a=b;b=c;c=d;}return d;} 44用递归算法计算斐波拉契级数列中第n项的值从第1项起,斐波拉契级数序列为1,1,2,3,5,8,13,21?例如,若给n输入7,该项的斐波拉契级数值为13。 long fun(int g) {switch(g){case 0:return 0; switch(g)case 1: case 2:return 1;} return (fun(g-1)+fun(g-2));} 45统计一个无符号整数中各位数字值为零的个数,通过形参传回主函数;并把该整数中各位上最大的数值作为函数值返回。例如,若输入无符号整数30800,则数字值为零的数为3,各位上数字值最大的是8。 int fun(unsigned n,int *zero) {int count=0,max=0,t; do{t=t;if(t==0)count++; if(max 46从3个红球,5个白球,6个黑球中任意取出8个作为一组,进行输出。在每组中,可以没有黑球,但必须要有红球和白球。组合数作为函数值返回。正确的组合数应该是15。程序中i的值代表红球数,j的值代表白球数,k的值代表黑球数。 int fun() {int i,j,k,sum=0; printf(\for(i=1;i<=3;i++) {for(j=1;j<=5;j++){k=8-i-j; if((k>=1&&k<=6)&&(i!=0)&&(j!=0)||(k==0)) {sum=sum+1; printf(\ed:M white:M black:M\\n \,i,j,k);}}} return sum;} 47求整数x的y次方的低3位值。例如,整数5的6次方为15625,此值的低3位值为625。 long fun(int x, int y, long *p) { int i;long t=1; for(i=1;i<=y;i++)t=t*x;*p=t; t=t00;return t;} 48根据输入的3个边长(整型值),判断能否构成三角形:若能构成等边三角形,则返回3,若是等腰三角形,则返回2,若能构成三角形则返回1,若不能,则返回0。 int fun(int a,int b,int c) {if(a+b>c && b+c>a && a+c>b) {if(a==b&&b==c) return 3; else if(a==b||b==c||a==c) return 2;else return 1;} else return 0;} 49为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 void fun(int a, int *b, int *c) {int i,j,d,y; for(i=3;i<=a/2;i=i+2){y=1; for(j=2;j<=sqrt((double)i );j++) if(i%j==0)y=0; if(y==1){d=a-i; for (j=2;j<=sqrt((double)d );j++) if(d%j==0)y=0; if(y==1){*b=i;*c=d;}}}} 50找出一个大于给定整数m且紧随m的素数,并作为函数值返回。 int fun( int m) {int i,k; for(i=m+1; ;i++) {for(k=2;k=i) return(i);}} 51求输入的两个数中较小的数。例如:输入5 10,结果为min is 5。 int fun(int x, int y) {int z;z=x 52判断一个整数m是否是素数,若是返回1,否则返回0。 int fun(int m) {int k=2; while(k<=m&&(m%k))k++; if(m==k)return 1;else return 0;} 53将十进制正整数m转换成k(2≤k≤9)进制数,并按位输出。例如,若输入8和2,则应输出1000。 fun(int m,int k) {int aa[20],i; for(i=0;m;i++){aa[i]=m%k;m/=k;} for(;i;i--)printf(“%d”,aa[i-1]);} 54把输入的十进制数以十六进制数的形式输出。 main() {char b[17]={\int c[64],d,i=0,base=16;long n; printf(\scanf(\ do{c[i]=nose;i++;n=n/base;} while(n!=0); printf(\for(--i;i>=0;--i) {d=c[i];printf(\printf(\ 55将一个由八进制数字字符组成的字符串转换为与其面值相等的十进制整数。若输入77777,则输入出是32767。 int fun(char *p) {int n;n=*p-0’;p++; while(*p!=0){n=n*8+*p-‘0’; p++;}return n;} 56计算正整数num的各位上的数字之积。例如,若输入253,则输出应该是20。 long fun(long num) {long k=1; do{k*=num;num/=10; }while(num);return (k);} 57计算并输出high以内最大的10个素数之和。若high的值为100,则函数的值为732。 int fun(int high) {int sum=0,n=0,j,yes; while((high>=2)&&(n<10)) {yes=1; for(j=2;j<=high/2;j++) if(high%j==0){yes=0;break;} if(yes){sum+=high;n++;} high--;}return sum;} 58从整数1到55之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。 fun(int *b) {int k,a1,a2,i=0; for(k=10;k<55;k++) {a2=k/10;a1=k-a2*10; if((k%3==0&&a2==5)||(k%3==0&&a1==5)) {b[i]=k;i++;}}return i;} 59把主函数中输入的3个数,最大的放在a中,最小的放在c中。例如,输入的数为:55 12 34,输出结果应当是:a=55.0,b=34.0,c=12.0。 void fun(float *p,float *q,float *s) {float *k; if(*p>*q){*k=*p;*p=*q;*q=*k;} if(*s>*p){*k=*s;*s=*p;*p=*k;} if(*q>*p){*k=*q;*q=*p;*p=*k;}} 60计算n的5次方的值,通过形参指针传回主函数;计算该值的个位、十位、百位上数字之和作为函数值返回。如,7的5次方是16807,其低3位数的和值是15。 int fun(int n,int *value) {int d,s,i;d=1;s=0; for(i=1;i<=5;i++)d=d*n;*value=d; for(i=1;i<=3;i++){s=s+d; d=d/10;}return s;} 61求两个形参的乘积和商数,并通过形参返回调用程序。例如输入:61.82和12.65,输出为:c=782.023000 d=4.886957 void fun(double a,double b,double *x,double *y) {*x=a*b;*y=a/b;} 62输入两个双精度数,函数返回它们的平方和的平方根值。例如:输入:22.936和14.121,输出为:y=26.934415。 double fun(double *a,double *b) {double c; c=sqrt((*a)*(*a)+(*b)*(*b)); return c;} 63求二分之一的圆面积,函数通过形参得到圆的半径,函数返回二分之一的圆面积。 例如输入圆的半径值:19.527 输出为:s=598.950017。 float fun(float r) {return 3.14159*r*r/2;} 64判断两个指针所指存储单元中的值的符号是否相同;若相同函数返回1,否则返回0。这两个存储单元中的值都不为0。 fun(double *a,double *b) {if(*a * *b>0.0)return 1; else return 0;} 65求两数平方根之和,作为函数值返回。例如,输入12和20,输出结果是:y=7.936238。 double fun(double *a,double *b) {double c;c=sqrt(*a)+sqrt(*b); return c;} 66判断两个整数m和n是否互质(即是否有公共的因子)(m≠1,n≠1)。方法是:用2到t(t取m和n中较小的那个数)之间的数分别去除m和n,若m和n能同时被某个数除尽,则m和n不互质;否则它们互质。例如,若输入187和85,则应输出No(表示它们不互质,它们有公因子17)。若输入89和187,则应输出Yes(表示它们互质)。 int IsThat(int m,int n ) {int k,t,mk=1;t=m; if(m>n)t=n; for(k=2;k<=t;k++) if(m%k==0&&n%k==0){mk=0;break;} return( mk );} main( ) {int m,n;clrscr(); printf( \\\nPlease enter 2 numbers:\\n\ ); scanf(\ if(IsThat(m,n))printf( \else printf( \ 67判断一个整数m是否是素数,若是返回1,否则返回0。 int fun(int m) {int k=2; while(k<=m&&(m%k))k++; if(m==k)return 1;else return 0;} 68求两个形参的乘积和商数,并通过形参返回调用程序。例如输入:61.82和12.65,输出为:c=782.023,d=4.886957 void fun(double a,double b,double *x,double *y) {*x=a*b;*y=a/b;} 二、数组题 69找出100至n(不大于1000)之间三位数字相等的所有整数。 int fun(int *s,int n) {int i,j,k,a,b,c;j=0; for(i=100;i a=k;k/=10;b=k;k/=10;c=k; if(a==b&&a==c)s[j++]=i;}return j;} 70找出100~n(不大于1000)之间百位数字加十位数字等于个位数字的所有整数。 int fun(int *s, int n) {int i,j,k,a,b,c;j=0; for(i=100;i a=k;k/=10;b=k;c=k/10; if(a==b+c)s[j++]=i;}return j;} 71求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。例如数组中原有的数为:7、10、12、0、3、6、9、11、5、8,输出的结果为:12、11、7、0、3、6、9、10、5、8。 int fun(int *a,int n) {int i,m,t,k; for(i=0;i<2;i++){m=i; for(k=i;k t=a[i];a[i]=a[m];a[m]=t;}} 72计算数组元素中值为正数的平均值(不包括0)。例如:数组中元素中的值依次为39,-47,21,2,-8,15,0,则程序的运行结果为19.250000。 dluble fun(int x[]) {double sum=0.0;int c=0,i=0; while(x[i]!=0) {if(x[i]>0){sum+=x[i];c++;}i++;} sum/=c;return sum;} 73计算数组元素中值为负数的平均值(不包括0)。例如:数组中元素的值依次为43,-47,-21,53,-8,12,0,则程序的运行结果为-25.333333。 double fun(int x[ ]) {double sum=0.0;int c=0,i=0; while(x[i]!=0) {if(x[i]<0){sum=sum+x[i];c++;} i++;}sum=sum/c;return sum;} 74用选择法对数组中的n个元素按从大到小的顺序进行排序。 void fun(int a[],int n) {int i,j,t,p; for(j=0;j t=a[p];a[p]=a[j];a[j]=t;}} 75读入一个整数m(5≤m≤20),函数getarr调用函数rnd获得m个随机整数,函数sortpb将这m个随机整数从小到大排序。例如,若输入整数7,则应输出:3,10,17,28,32,36,47。 sortpb(int n,int *a) {int i,j,p,t; for(j=0;j if(p!=j){t=a[j];a[j]=a[p];a[p]=t;}}} 76给定n个实数,输出平均值,并统计平均值以上(含平均值)的实数个数。例如n=8时,输入 193.199,195.673,195.757,196.051,196.092,196.596,196.579,196.763,所得平均值为 195.838745,在平均值以上的实数个数应为5。 int fun(float x[], int n) {int j, c=0;float xa=0.0; for(j=0;j if(x[j]>=xa)c++;return c;} 77读入一个整数m(1≤m≤20)和m位学生的学号、数学课考分和计算机课考分,并从中查找第一个数学课考分<80且计算机课考分<70的学生,若有则输出他的学号和两门课分数,否则输出\。 int Find(int n,struct student ss[]) {int i; for(i=0;i if((ss[i].math<80)&&(ss[i].cmpt<70)) break;return((i==n)?-1:i);} main() {int i,m;struct student tt[M]; printf(?);scanf(\?); for(i=0;i 78从n个学生的成绩中统计出高于平均分的学生人数,人数由函数值返回,平均分存放在形参aver所指的存储单元中。例如,输入8名学生的成绩:85, 65.5, 69, 95.5, 87, 55, 62.5, 75则高于平均分的学生人数为4(平均分为74.312500)。 int fun(float *s,int n,float *aver) {float ave ,t=0.0;int count=0,k,i; for(k=0;k if(s[i]>ave)count++;*aver=ave; return count;} 79从n个学生的成绩中统计出低于平均分的学生人数,此人数由函数值返回,平均分存放在形参aver所指的存储单元中。例如输入8名学生的成绩: 80.5,60,72,90.5,98,51.5,88,64则低于平 均分的学生人数为4(平均分为75.5625)。 int fun(float *s,int n,float *aver) { float ave ,t=0.0;int count=0,k,i; for(k=0;k if(s[i] 80使数组中的元素的值缩小5倍。 float m[10]; void fun(void) {int j; printf(\for(j=0;j<10;j++) {printf(\81使数组中的元素的值增加10倍。 float m[10] void fun(void) {int j; printf(\for(j=0;j<10;j++) {printf(“%d”,m[j]*10);}} 82删除w所指数组中下标为k的元素中的值。 arrout(int *w,int m) {int k; for(k=0;k printf(\83假如整数数列中的数不重复,删除数列中值为X的元素。N中存放的是数列中元素的个数。 fun (int *a,int n,int x) {int p=0,i;a[n]=x; while(x!=a[p])p=p+1; if(p==n)return -1; else{for(i=p;i a[i]=a[i+1];return n-1;}} 84按顺序给s所指数组中的元素赋予从2开始的偶数,然后再按顺序对每5个元素求一个平均值,并将这些值依次存放在w所指的数组中。若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。 fun (double *s,double *w) {int k,i; double sum; for(k=2,i=0;i if((i+1)%5==0){w[k]=sum/5; sum=0;k++;}}return k;} 85N个有序整数数列已放在一维数组中,函数的功能是:利用折半查找算法查找整数m在数组中的位置。若找到,则返回其下标值;反之,则返回-1。折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和high(low int fun(int a[],int m) {int low=0,high=N-1,mid; while(low<=high) {mid=(low+high)/2; if(m else if(m>a[mid])low=mid+1; else return(mid);}return(-1);} {printf(\86在x数组中放入n个采样值,计算并输出差值 N S= (xK-x’)2 K=1 N N XK 其中 x’= K=1 N float fun(float x[],int n) {int j;float xa=0.0,s; for(j=0;j s+=(x[j]-xa)*(x[j]-xa)/n; return s;} 87先读入整数m,再读入m个从小到大的整数,最后再读入一个整数k,并将k插入到该整数数列中,插入后的数列仍然按从小到大的顺序排列。例如,若先输入4,然后输入4个从小到大排列的整数:-1,1,7,98最后输入待插入的数19,则输出结果应为:-1,1,7,19,98。 void InSort(int *n,int vv[],int k) {int i=0,j; while(k>vv[i]&&i<*n)i++; if(i<*n) for(j=*n;j>i;j--)vv[j]=vv[j-1]; vv[i]=k;++*n;} main() {int aa[M],i,k,m;clrscr(); printf(\\\nPlease enter a number:\\n\ ); scanf(\ printf(\\\nPlease enter %d numbers:\\n\,m ); for(i=0;i {int a[M]={0},i=0,j,m;printf(?); scanf( \ for(j=0;j 89根据形参m的值(2≤m≤9),在m行m列的二维数组中存放如下所示的数据,由主函数输出。 例如,若输入2,则输出1 2 2 4 输入4,则输出1 2 3 4 2 4 6 8 3 6 9 12 4 8 12 16 void fun( int (*a)[M], int m) {int j,k; for(j=0;j a[j][k]=(k+1)*(j+1);} 90先从键盘上输入一个3行3列的矩阵的各个元素的值,然后输出主对角线元素之积。 int fun() {int a[3][3],mul;int i,j;mul=1; for (i=0;i<3;i++) {for(j=0;j<3;j++) scanf(\ for(i=0;i<3;i++)mul=mul*a[i][i]; printf(\ 91先从键盘上输入一个3行3列的矩阵的各个元素的值,然后输出主对角线元素之和。 int fun() {int a[3][3],sum;int i,j;sum=0; for (i=0;i<3;i++) {for(j=0;j<3;j++) scanf(\ for(i=0;i<3;i++)sum=sum+a[i][i]; printf(\ 92输出M行N列整数方阵,然后求两条对角线上的各元素之和,返回此和数。 int fun(int n,int xx[][M]) {int i,j,sum=0; printf(\for(i=0;i printf(\printf(\for(i=0;i sum+=xx[i][i]+xx[i][n-i-1]; return(sum);} 93输出M行N列整数方阵然后求两条对角线上的各元素的平方和返回此和数。 int fun(int n,int xx[][M]) {int i,j,sum=0; printf(\for(i=0;i printf(\printf(“\\n”);} for(i=0;i sum+=xx[i][i]*xx[i][i]+xx[i][n-i-1]*xx[i][n-i-1]; return(sum);} 94给一维数组a输入任意4个整数,并按如下的规律输出。例如输入1,2,3,4,程序运行后输出以下方阵: 4 1 2 3 3 4 1 2 2 3 4 1 1 2 3 4 int fun(int *a) {int i,j,k,m;printf(\for(i=0;i printf(\for(i=M;i>0;i--){k=a[M-1]; for(j=M-1;j>0;j--)a[j]=a[j-1]; a[0]=k; for(m=0;m 95逐个比较a,b两个字符串对应位置中的字符,把ASCII值小或相等的字符依次存放到c数组中,形成一个新的字符串。例如:a中的字符串为fshADfg,b中的字符串为sdAEdi,则c中的字符串应为fdAADf。 void fun(char *p,char *q,char *c) {int k=0; while(*p||*q){if(*p>=*q)c[k]=*q; else c[k]=*p; if(*p)p++;if(*q)q++;k++;}} 96将字符串s中位于偶数位置的字符或ASCII码为奇数的字符放入字符串t中(规定第一个字符放在第0位中)。例如:字符串中的数据为ADFESHDI,则输出应当是AFESDI。 void fun(char *s,char t[]) {int i,j=0; for(i=0;i for(i=0;i if(t[i] 98依次取出字符串中所有的字母,形成新的字符串,并取代原字符串。 void fun(char *s) {int i,j; for(i=0,j=0;s[i]!= '\\0';i++) if((s[i]>= 'A'&&s[i]<= 'Z')||(s[i]>= 'a'&&s[i]<= 'z')) s[j++]=s[i];s[j]=‘\\0’;} 99在字符串str中找出ASCⅡ码值最小的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。例如,调用fun函数之前给字符串输入fagAgBDh,调用后字符串中的内容为AfaggBDh。 void fun(char *p) {char min, *q;int i=0;min=p[i]; while(p[i]!=0){if(min>p[i]) {q=p+i;min=p[i];}i++;} while(q>p){*q=*(q-1);q--;} p[0]=min;} 100在字符串str中找出ASCⅡ码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。例如,调用fun函数之前给字符串输入ABCDeFGH,调用后字符串中的内容为eABCDFGH。 void fun(char *p) {char max, *q;int i=0;max=p[i]; while (p[i]!=0) {if(max p) {*q=*(q-1);q--;}p[0]=max;} 101将字符串tt中的大写字母都改为对应的小写字母,其他字符不变。若输入“Ab,cD”,则输出“ab,cd”。 char *fun(char tt[]) {int i; for(i=0;tt[i];i++) { if((tt[i]>=’A’)&&(tt[i]<= ′Z′)) tt[i]+=32; }return(tt);} 102将字符串tt中的小写字母都改为对应的大写字母,其他字符不变。若输入\,dAd\,则输出\,DAD\。 char *fun(char tt[]) {int i; for(i=0;tt[i];i++) {if((tt[i]>='a')&&(tt[i]<= 'z')) tt[i]-=32;}return(tt);} 103将m(1≤m≤10)个字符串反着连接起来,组成一个新串,放入pt所指字符串中,例如:把3个串DEG,ac,df反着串联起来,结果是dfacDEG。 void fun(char str[][10],int m, char *pt) {int k,q,i,j=0; for(k=m-1;k>=0;k--) {q=strlen(str[k]);j+=q; for(i=0;i 104用冒泡法对6个字符串按由大到小的顺序进行排序。 void fun(char *pstr[6]) {int i, j;char *p; for(i=0;i<5;i++) for(j=i+1;j<6;j++) if(strcmp(*(pstr+i),*(pstr+j))<0) {p=*(pstr+i);*(pstr+i)=*(pstr+j); *(pstr+j)=p;}} 105利用插入排序法对字符串中的字符按从大到小的顺序进行排序插入法的基本方法是先对字符串中的头两个元素进行排序然后把第3个字符插入到前两个字符中插入后前3个字符依然有序再把第4个字符插入到前3个字符中,待排序的字符串已在主函数中赋予。 void insert(char *aa) {int i, j, n;char ch;n=strlen(aa); for(i=1;i for(i=j=0; s[i]!='\\0';i++) if(s[i]!= 'F')s[j++]=s[i]; s[j]='\\0';} 107依次取出字符串中所有的数字字符,形成新的字符串并取代原字符串。 void fun(char *s) {int i,j; for(i=0,j=0; s[i]!= '\\0'; i++) if(s[i]>= '0'&&s[i]<= '9') s[j++]=s[i];s[j]=’\\0’;} 108将s所指字符串中最后一次出现的、t1所指子串替换成t2所指子串,所形成的新串放在w所指的数组中。在些处,要求t1和t2所指字符串的长度相同。例如,当s所指字符串中的内容为abcdabfabc,t1所指子串中的内容为ab,t2所指子串中的内容为99时,结果,在w所指的数中的内容应为abcdabf99c。 void fun(char *s,char *t1,char *t2,char *w) {int i;char *p,*r,*a;strcpy(w,s); while(*w){p=w;r=t1; while(*r)if(*r==*p){r++;p++;} else break; if(*r==’\\0’)a=w;w++;}r=t2; while(*r)(*a=*r;a++;r++;)} 109将s所指字符串中出现的t1所指字符串全部替换成t2所指字符串,所形成的新的字符串放在w所指的数组中。在此处,要求t1和t2所指字符串的长度相同。例如:当s所指字符串中所指的内容为abcdabfab,t1所指字符串中的内容为ab,t2所指字符串中的内容为99时,结果在w所指的数组中的内容应为99cd99f99。 void fun (char *s,char *t1, char *t2, char *w) {int i;char *p,*r,*a;strcpy(w,s); while(*w){p=w;r=t1; while(*r)if(*r==*p){r++;p++;} else break; if(*r= ='\\0'){a=w;r=t2; while (*r){*a=*r;a++;r++;} w+=strlen(t2);}else w++;}} 110求出字符串中最后一次出现的子字符串的地址,通过函数值返回,若未找到,则函数值为NULL。如,当字符串中的内容为abcdabfabcdx,t中的内容为ab时,输出应是abcdx。当字符串中的内容为abcdabfabcdx,t中的内容为abd时,则程序输出未找到的信息:Not found! char *fun(char *s,char *t) {char *p,*r,*a;a=NULL; while(*s){p=s;r=t; while(*r)if(*r==*p){r++;p++;} else break; if(*r=='\\0')a=s;s++;}return a;} 111判断字符ch是否与str所指字符串中的某个字符相同;若相同则什么也不做,若不同,则将其插在串的最后。 void fun (char *str,char ch) {while (*str &&*str !=ch) str++; if(*str==’\\0’) { str[0]=ch;str[1]=′\\0′;}} 112从s所指字符串中,找出t所指字符串的个数作为函数值返回。例如当s所指字符串中的内容为abcdabfab,t所指字符串的内容为ab,则函数返回整数3。 int fun(char *s,char *t) {int n;char *p, *r;n=0; while(*s){p=s;r=t; while (*r) if(*r==*p){r++; p++;} else break; if(*r=='\\0') n++;s++;}return n;} 113在字符串的最前端加入n个*号,形成新串,并且覆盖原串。注意:字符串的长度最长允许79。 void fun (char *s, char *t ) {int i,s1;s1=strlen(s); for(i=0;i t[s1+i]=s[i];t[2*s1]='\\0';} 122将m(1≤m≤10)个字符串连接起来,组成一个新串,放入pt所指字符串中,例如:把3个串abc,CD,EF串联起来,结果是abcCDEF。 while (*a||*b) {if(*a){*c=*a;c++;a++;} if(*b){*c=*b;c++;b++;}} *c=’\\0’ ;} 127将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串中的内容为 \,b所指字符串中的内容为\{while(*s) {if(*s>=’A’&& *s<=’Z’)(*a)++; if(*s>=’a’&& *s<=’z’)(*b)++; s++;}} 135将字符串s中位于奇数位置的字符或ASCII码为偶数的字符放入字符串t中(规定第一个字符放在第0位中)。例如,字符串中的数据为AABBCCDDEEFF,则输出应当是ABBCDDEFF。 void fun(char *s,int n) {char a[80],*p;int i; p=s; for(i=0;i 114将s所指字符串中的字母转换为按字母序列的后续字母(但Z转化为A,z转化为a),其他字符不变。 void fun(char *s) { while(*s) {if(*s>='A'&&*s<='Z'||*s>='a'&&*s<='z') {if(*s=='Z') *s='A'; else if(*s=='z')*s='a'; else *s+=1;}s++;}} 115将从键盘上输入的每个单词的第一个字母写为大写字母,输入时各单词必须用空格隔开,用'.'结束输入。 int fun(char *c,int status) {if(*c==' ') return 1; else {if(status && *c<='z' && *c>='a') *c+='A'-'a';return 0;}} 116读入一个英文文本行,将其中每个单词的第一个字母忙乱成大写,然后输出此文本行(这里的“单词”是指由空格隔开的字符串)。例如,若输入I am a student to take the examination,则应输出I Am Student To Take The Examination。 #include \void upfst(char *p) {int k=0; for(;*p;p++) if(k){if(*p==’‘)k=0; else if(*p!=’‘) {k=1;*p=toupper(*p);}} 117将p所指字符串中每个单词的最后一个字母改成大写(这里的“单词”是指有空格隔开的字符串)。例如,若输入:I am a student to take the examination则应输出:I aM A studenT tO takE thE examinatioN void fun(char *p) {int k=0; for ( ;*p;p++) if(k){if (*p==' ') {k=0; *(p-1)=toupper(*(p-1));}} else k=1;} 118计算s所指字符串中含有t所指字符串的数目,并作为函数值返回。 int fun(char *s,char *t) { int n;char *p, *r;n=0; while(*s){p=s; r=t; while(*r)if(*r==*p){r++;p++;} else break; if(*r==’\\0’) n++;s++;}return n;} 119从N个字符串中找出最长的那个串,并将其地址作为函数值返回。 char *fun(char (*sq)[M]) {int i; char *sp;sp=sq[0]; for(i=0;i if(strlen(sp) for(i=0;i for(i=0;i void fun(char str[][10],int m,char *pt) {int k,q,i,j=0; for(k=0;k {q=strlen(str[k]);j+=q; for(i=0;i pt+=q;pt[0]=0;}pt-=j;} 123分别将a、b所指字符串中字符倒序,然后按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串中的内容为:\,b所指字符串中的内容为:\时,则c所指数组中的内容应该为:\;而当a所指字符串中的内容为:\,b所指字符串中的内容为:\时,则c所指数组中的内容应该为:\。 void fun(char *a,char *b,char *c) {char s1[100],s2[100],*sa,*sb; strcpy(s1,a);strcpy(s2,b); myswap(s1);myswap(s2); sa=s1;sb=s2; while(*sa||*sb) {if(*sa){*c=*sa;c++;sa++;} if(*sb){*c=*sb;c++;sb++;}} *c=0;} 124首先将a所指字符串中字符按逆序存放,然后和b所指字符串中的字符,按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串中的内容为\,b所指字符串中的内容为\时,c所指数组中的内容应该为\;而当a所指字符串中的内容为\,b所指字符串中的内容为 \时,c所指数组中的内容应该为\。 fun(char *a,char *b,char *c) {char *ap,*at,ch; ap=a;at=a+strlen(a)-1; while(ap<=at) {ch=*ap;*ap=*at;*at=ch; ap++;at--;} while(*a||*b) {if(*a){*c=*a;c++;a++;} if (*b){*c=*b;c++;b++;}} *c=0;} 125分别将a、b所指字符串中字符倒序,然后按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串中的内容为: \所指字符串中的内容为:\时,则c所指数组中的内容应该为:\; void myswap(char *s) {char *sp,*st,ch;sp=s; st=s+strlen(s)-1; while(sp<=st) {ch=*sp;*sp=*st;*st=ch; sp++;st--;}} void fun(char *a,char *b,char *c) {char s1[100],s2[100],*sa,*sb; strcpy(s1,a);strcpy(s2,b); myswap(s1);myswap(s2); sa=s1;sb=s2; while(*sa||*sb) {if(*sa){*c=*sa;c++;sa++;} if(*sb){*c=*sb;c++;sb++;}} *c=0;} 126首先把b所指字符串中的字符按逆序存放,然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串中的内容为abcdefg,b所指字符串中的内容为1234时,c所指数组中的内容应该为a4b3c2d1efg;而当a所指字符串中的内容为1234,b所指字符串中的内容为abcdefg时,c所指数组中的内容应该为1g2f3e4dcba。 void fun(char *a,char *b,char *c) {int i,j; char ch;i=0; j=strlen(b)-1; while (i {ch=b[i];b[i]=b[j];b[j]=ch; i++;j--;} 时,c所指数组中的内容应该为 \;而当a所指字符串中的内容为\,b所指字符串中的内容为 \时,c所指数组中的内容应该为\。 fun(char *a,char *b,char *c) {while(*a&&*b){*c=*a;c++;a++; *c=*b;c++;b++;} if(*a=='\\0') while(*b){*c=*b;c++;b++;} else while(*a){*c=*a;c++;a++;} *c = '\\0';} 128统计字符串中各元音字母(即A,E,I,O,U)的个数。注意:字母不分大小写。例如,输入THIs is a boot,则应输出是1 0 2 2 0。 void fun(char *s, int num[5]) {int k, i=5; for(k=0;k {case 'a': case'A':{i=0;break;} case 'e ': case 'E':{i=1;break;} case 'i': case 'I':{i=2;break;} case 'o': case 'O':{i=3;break;} case 'u': case 'U':{i=4;break;}} if(i>=0)num[i]++;}} 129将字符串p中所有字符复制到字符串b中,要求每复制3个字符之后插入一个空格。例如,在调用函数之前给字符串a输入 ABCDEFGHIJK,调用函数之后,字符串b中的内容则为ABC DEF GHI JK。 void fun(char *p,char *b) {int i, k=0; while(*p) { i=0; while(i<3&&*p) {b[k]=*p;k++;p++;i++;} if(*p){b[k++]=' ';}} b[k]= '\\0';} 130统计字符串substr在字符串str中出现的次数。若字符串为aaas 1kaaas,子字符串为as,则应输出2。 fun(char *str,char *substr) {int i, j, k,num=0; for(i=0;str[i];i++) for(j=i,k=0;substr[k]==str[j];k++,j++) if(substr[k+1]=='\\0') {num++;break;}return num;} 131删除字符串s中所有空白字符(包括Tab字符、回车符及换行符)。输入字符串时用'#'结束输入。 fun(char *p) {int i,t;char c[80]; for(i=0,t=0;p[i];i++) if(!isspace(*(p+i)))c[t++]=p[i]; c[t]='\\0'; strcpy(p,c);} 132此函数的功能是从字符串s中,删除所有小写字母′c′。 void fun(char *s) {int i,j; for(i=j=0; s[i]!= '\\0';i++) if(s[i]!= 'c') s[j++]=s[i]; s[j]='\\0';} 133逐个比较a、b两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存入到c数能中,形成一个新的字符串。例如,若a中的字符串为:aBCDeFgH,b中的字符串为:Abcd,则c中的字符串应为:aBcdeFgH。 void fun(char *p,char *q,char *c) {int k=0; while(*p||*q){if(*p<=*q)c[k]=*q; else c[k]=*p; if(*p) p++; if(*q) q++;k++;}} 134分别统计字符串中大写字母和小写字母的个数。例如,给字符串s输入:AaaaBBb123CCccccd,则应输出结果:upper=6,lower=8 。 void fun (char *s,int *a, int *b) void fun(char *s,char t[]) {int i,j=0; for(i=0;i if(i%2!=0||s[i]%2==0)t[j++]=s[i]; t[j]=’\\0’;} 136比较两个字符串,将长的那个字符串的首地址作为函数值返回。 char *fun(char *s,cahr *t) {int s1=0,t1=0;char *ss,*tt; ss=s;tt=t; while(*ss){s1++;ss++;} while(*tt){t1++;tt++;} if(t1>s1)return t;else return s;} 137首先将大写字母转换为对应小写字母;若小写字母为a~u,则将其转换为其后的第5个字母;若小写字母为v~z,使其值减21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母b。 char fun(char c) {if(c>='A'&&c<='Z')c=tolower(c); if(c>='a'&&c<='u')c=c+5; else if(c>='v'&&c<='z')c=c-21; return c;} 138将大写字母转换为对应小写字母之后的第五个字母;若小写字母为v—z,使小写字母的值减21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转为小写字母f;若形参是字母W,则转换为小写字母b。 char fun(char c) {if(c>=’A’&&c<=’Z’)c=c+32; if(c>=’a’&&c<=’u’)c=c+5; else if(c>=’v’&&c<=’z’) c=c-21;return c;} 139将字符串中的内容按逆序输出,但不改变字符串中的内容。例如,若字符串为abcd,则应输出dcba。 fun(char *a) {if(*a){fun(a+1);printf(“%c”,*a);}} 140读入一个字符串(长度<20),将该字符串中的所有字符按升序排序后输出。例如:若输入:edcba,则应输出:abcde。 void fun(char t[]) {char c;int i,j; for(i=strlen(t)-1;i;i--) for(j=0;jt[j+1]) {c=t[j];t[j]=t[j+1];t[j+1]=c;}} 141交换主函数中两个字符串中的内容。例如:若a所指字符串中的内容原为:123456,b所指字符串中的内容原为:abcde;程序运行后,a所指字符串中为:abcde,b所指字符串中则为:123456。 void fun(char *a,char *b) {char c[N];int i; for(i=0;a[i];i++)c[i]=a[i];c[i]=0; for(i=0;b[i];i++)a[i]=b[i]; a[i]=0; for(i=0;c[i];i++)b[i]=c[i];b[i]=0;} 四、结构体、文件题 142建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。 int fun(NODE *h) {int sum=0;NODE *p;p=h->next; while(p!=NULL) {if(p->data%2==0)sum+=p->data; p=p->next;}return sum;} 143函数Creatlink的功能是:创建带头结点的单向链表,并为各结点数据域赋0到m-1的值。 NODE *Creatlink(int n,int m) {NODE *h=NULL,*p,*s;int i s=(NODE *)malloc(sizeof(NODE)); h=p;p=s; for(i=1;i<=n;i++) {s=(NODE *)malloc(sizeof(NODE)); s->data=rand()%(m-1); s->next=p->next;p->next=s; p=p->next;}return h;} 144下列给定程序是建立一个带头结点的单