C语言上机练习题_第1页
C语言上机练习题_第2页
C语言上机练习题_第3页
C语言上机练习题_第4页
C语言上机练习题_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编辑版word编辑版word编辑版wordC语言上机考试练习题(1)说明:我们已经学习完成了基本数据类型、基本控制语句,以及数组、函数这些知识了,请同学们看看附件中的这些题目是否能够快速编写出来?可能有个别题目与过去的练习有些重复,请尽量不要去参考过去的答案。如果现在编写起来困难还很多,那你就要加倍努力了。1、编写一个程序,判定一个字符串是否是另一个字符串的子串,若是,返回子串在主串中的位置。要求:(1)在主函数中输入两个字符串,调用子函数cmpsubstr()判断,并在主函数输出结果。(2)子函数的返回值为-1表示未找到,否则返回子串的位置(起始下标)。#include<stdio.h>#include<string.h>voidmain(){ intcmpsubstr(char*s1,char*s2); charstr1[20],str2[50]; char*s1=str1,*s2=str2; gets(str1); gets(str2); printf("%d",cmpsubstr(s1,s2));}intcmpsubstr(char*s1,char*s2){ inti,d,a=0,situation=0; d=strlen(s1); for(i=0;*(s2+i)!='\0';i++) { if(*(s1+a)==*(s2+i)) { a++; if(a==d) { situation=1; break; } } else { a=0; } } if(situation==0)return(-1); elsereturn(i-d+2);}2、输入一个字符串,内有数字和非数字字符,如:a123x45617960?302tab5876,将其中连续的数字作为一个整数,依次存放到数组a中。例如,123放在a[0]中,456放在a[1]中等等,统计共有多少个整数,并输出这些整数。要求:(1)在主函数中输入字符串,并输出结果。调用子程序处理字符串。(2)子函数的返回值为整数的个数。#include<stdio.h>#include<string.h>voidmain(){ intsearch(char*str,int*sum); charstr[100]; intd,sum[20],i; gets(str); d=search(str,sum); for(i=0;i<d;i++)printf("%d\n",*(sum+i));}search(char*str,int*sum){ inti,t=0,a=0; for(i=0;*(str+i)!='\0';i++) { if(*(str+i)>='0'&&*(str+i)<='9') { if(a==0) { *(sum+t)=(int)(*(str+i)-'0'); a++; } else { *(sum+t)=*(sum+t)*10+(int)(*(str+i)-'0'); } } elseif(*(str+i-1)>='0'&&*(str+i-1)<='9') { t++; a=0; } } if(*(str+i-1)>='0'&&*(str+i-1)<='9')return(t+1); elsereturn(t);}3、编写一个主函数和子函数tran(x,r),要求是:函数tran(x,r)将十进制整数x转换成r进制数y(r在2-16之间),x和r的值由主调函数(即主函数)传入,y的值需要返回主调函数进行输出。要求:y的值利用字符数组进行存储,数组的每一个元素存放y的一位数字字符。#include<stdio.h>#include<string.h>#include<malloc.h>#include<math.h>voidmain(){ char*tran(intx,intr); intx,r; char*y; printf("Pleaseinputx&r=\n"); scanf("%d,%d",&x,&r); y=tran(x,r); puts(y);}char*tran(intx,intr){ intlen1,len2,i,t; char*y1,*y2; len1=2+(int)log((double)x)/log((double)r); y1=(char*)malloc(len1*sizeof(char)); for(i=0;x!=0;i++) { t=x%r; if(t<10) *(y1+i)=(char)(t+48); else*(y1+i)=(char)(t+87); x=(int)x/r; } *(y1+i)='\0'; len2=strlen(y1); y2=(char*)malloc(len2*sizeof(char)); for(i=0;i<len2;i++) { *(y2+i)=*(y1+len2-i-1); } *(y2+i)='\0'; return(y2);}4、编写一个主函数和函数tran(x),要求是:(1)函数tran(x)产生支付指定金额x(如234.78元)的各种面额人民币的数量(注意:尽量支付大面额的人民币),要求按100元、50元、10元、1元、5角、1角、5分、1分八种面额进行统计,产生的结果存放在数组中返回主函数。(2)在主函数中输入一金额,并以该金额调用tran函数,并输出该函数返回的统计结果。5、编写程序实现将键盘输入的一行字符按单词倒排输出。如键盘输入“Iloveyou”,屏幕显示“youloveI”。要求:(1)编写一个函数intinvertion(charch1[],charch2[])实现按单词倒排字符串,第一个形参ch1接受实参传过来的原字符串,倒排后的新字符串通过第二个形参返回主函数,函数中还需要统计该字符串中共有多少个单词,函数最后返回字符串中包含的单词个数。(2)主函数中输入字符串,调用子函数invertion,输出倒排后的字符串及字符串中包含的单词个数。#include<stdio.h>#include<string.h>#include<math.h>#include<malloc.h>voidmain(){ intinvertion(charch1[],charch2[]); intlen; char*ch1,*ch2; ch1=(char*)malloc(100); ch2=(char*)malloc(100); gets(ch1); len=invertion(ch1,ch2); puts(ch2); printf("%d\n",len);}intinvertion(charch1[],charch2[]){ inti,j,t=0,len1,len,sum=0; char*str; str=(char*)malloc(10); for(i=0,len=0;*(ch1+i)!='\0';i++,len++); len1=len; for(i=0;*(ch1+i)!='\0';i++) { if(*(ch1+i)!='') { *(str+t)=*(ch1+i); //将ch1的单词转移到str上// t++; } else { sum++; //单词个数加一// *(ch2+len1)=''; len1=len1-t; for(j=0;j<t;j++)*(ch2+j+len1)=*(str+j); //将str转移到ch2上// t=0; len1--; } } sum++; //最后一个单词转移到ch2上// *(ch2+len1)=''; len1=len1-t; for(j=0;j<t;j++)*(ch2+j+len1)=*(str+j); *(ch2+len)='\0'; return(sum);}6、编写一个主函数以及一个函数maxlong(str)。要求是:(1)函数maxlong(str)找出字符串str中包含的第一个最长单词(用字符数组进行存储),并返回主调函数。(2)在主函数中输入一个字符串,假定输入字符串中只含字母和空格,空格用来分割不同单词;以该字符串作为参数调用maxlong函数,并输出返回的结果。#include<stdio.h>#include<string.h>#include<math.h>#include<malloc.h>voidmain(){ char*maxlong(char*str); charstr[100],*str0; gets(str); str0=maxlong(str); puts(str0);}char*maxlong(char*str){ char*word,*str0; intt=0,i,max=0; for(i=0;*(str+i)!='\0';i++) { if(*(str+i)!='')t++;//t为单词字母个数// else { if(t>max)//比较t与之前最大的单词个数的大小// { word=(str+i-t); max=t; } t=0;//t初始化// } } if(t>max)//最后一个单词在循环中没有比较// { word=(str+i-t); max=t; } str0=(char*)malloc(max+1); for(i=0;i<max;i++) { *(str0+i)=*(word+i);//将最大的单词赋给str0// } *(str0+i)='\0'; return(str0);}7、编写一个函数ad(a,m,n)找出一个m行n列的二维数组a中的“鞍点”;在主函数中输入二维数组的值(假设数组中任意两个数都不相等),并将它作为实参调用ad函数。所谓“鞍点”是指该位置上的元素在该行上最大,在该列上最小;一个二维数组中可能没有鞍点。#include<stdio.h>#include<malloc.h>#include<string.h>#include<time.h>voidmain(){ int**input(intm,intn); voidprint(int**p,intm,intn); intad(int**p,intm,intn); int**p,m,n; while(!ad(p,m,n)){ printf("请输入行数:m,列数:n.\n"); m=n=7; p=input(m,n); print(p,m,n);}}intad(int**p,intm,intn){ inti,j,k,s,max,l,time=0; for(i=0;i<m;i++) { for(j=0;j<n;j++)//max为一行最大值// { if(j==0) { max=*(*(p+i)+j);l=j; } else { if(max<*(*(p+i)+j)) { max=*(*(p+i)+j);l=j; } } } s=0; for(k=0;k<m;k++) { if(max>*(*(p+k)+l)) { s=1;break; } } if(s==0) { printf("NO.%drowNO.%dline:%d\n",i+1,l+1,*(*(p+i)+l)); time++; } } return(time);}int**input(intm,intn)//建造一个m行,n列二维数组//{ int**p; inti,j; p=(int**)malloc(m*sizeof(int*)); for(i=0;i<m;i++) { *(p+i)=(int*)malloc(n*sizeof(int)); } srand(time(NULL));//// for(i=0;i<m;i++) { for(j=0;j<n;j++) { *(*(p+i)+j)=rand()%100;//给数组赋值// } } return(p);}voidprint(int**p,intm,intn){ inti,j; for(i=0;i<m;i++) { printf("第%d行为:\n",i+1); for(j=0;j<n;j++) printf("%4d",*(*(p+i)+j)); printf("\n"); }}8、编写主函数和两个递归函数sum(a,n)、max(a,n)。要求是:(1)函数sum(a,n)求数组a中前n个元素之和,并返回求得的和值。(2)函数max(a,n)求数组a中前n个元素中的最大值,并返回求得的最大值。(3)主函数:输入任意10个正整数给数组,调用sum函数求数组中的10个元素之和,并输出求得的和值;调用max函数求数组中10个元素的最大值,并输出求得的最大值。#include<stdio.h>#include<malloc.h>#include<time.h>voidmain(){ intsum(int*a,intn); int*input(intn); intmax(int*a,intn); int*s,n=10; s=input(n); printf("%5d,%5d\n",sum(s,n),max(s,n));}int*input(intn){ int*a,i; a=(int*)malloc(sizeof(int)*n); srand(time(NULL)); for(i=0;i<n;i++) { *(a+i)=rand()%100; printf("%4d",*(a+i)); } printf("\n"); return(a);}intmax(int*a,intn){ intm; if(n==1)return(*a); else { m=max(a,n-1); if(m>*(a+n-1))return(m); elsereturn(*(a+n-1)); }}intsum(int*a,intn){ if(n==1)return(*a); elsereturn(*(a+n-1)+sum(a,n-1));}9、编写一个递归程序,利用折半查找法在一个升序数组中查找一个数,如果查找成功,则输出它是第几个数,否则输出“NoFind.”。#include<stdio.h>#include<malloc.h>#include<time.h>voidmain(){ int*input(intn); voidprint(int*s,intn); voidsort(int*s,intn); intsearch(int*s,intn,intkey); int*s,n=10,key,d; s=input(n); print(s,n); sort(s,n); print(s,n); scanf("%d",&key); d=search(s,n,key); if(d!=0) printf("ThekeyisatNO.%d.\n",d); elseprintf("NOFIND\n");}intsearch(int*s,intn,intkey){ intm,d; if(n==1) { if(*s==key)return(1); elsereturn(0); } else { m=n/2; if(d=search(s,m,key))return(d); elseif(d=search(s+m,n-m,key))return(d+m); elsereturn(0); }}int*input(intn){ int*a,i; a=(int*)malloc(sizeof(int)*n); srand(time(NULL)); for(i=0;i<n;i++) { *(a+i)=rand()%100; } return(a);}voidprint(int*s,intn){ inti; for(i=0;i<n;i++)printf("%4d",*(s+i)); printf("\n");}voidsort(int*s,intn){ inti,j,temp; for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if(*(s+j)>*(s+j+1)) { temp=*(s+j); *(s+j)=*(s+j+1); *(s+j+1)=temp; } } }}10、用递归法实现:对于一个正整数n(n是一个不超过8位的任意正整数,由键盘输入),(1)顺序输出它的各位数;(2)判断它是一个几位数。如输入:56439;则输出:5,6,4,3,95要求:不允许使用数组;在递归函数中顺序输出该数的各位数,该数的位数则必须在主函数中输出。#include<stdio.h>#include<malloc.h>#include<string.h>voidmain(){ intf(intn); intn,d; scanf("%d",&n); d=f(n); printf("\n个数为%d\n",d);}intf(intn){ intd; if(n<10)d=1; elsed=f((int)n/10)+1; printf("%d",n%10); return(d);}11、输入一个日期(年、月、日),并输入该年的元旦(即1月1日)是星期几(星期一、星期二、…、星期六、星期日分别用数字1、2、…、6、7表示),计算该日期在本年中是第几天、星期几(注意润年问题)?要求写两个函数days和week,分别实现计算该日期在本年中是第几天和星期几。由主函数将日期传递给days函数,并将计算得到的结果返回给主函数输出;由主函数将日期及元旦的星期几传递给week函数,并将计算得到的结果返回给主函数输出。12、编写一个主函数以及一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论