C语言上机练习题完整 828701982.docx
《C语言上机练习题完整 828701982.docx》由会员分享,可在线阅读,更多相关《C语言上机练习题完整 828701982.docx(17页珍藏版)》请在冰豆网上搜索。
C语言上机练习题完整828701982
C语言上机考试练习题
(1)
说明:
我们已经学习完成了基本数据类型、基本控制语句,以及数组、函数这些知识了,请同学们看看附件中的这些题目是否能够快速编写出来?
可能有个别题目与过去的练习有些重复,请尽量不要去参考过去的答案。
如果现在编写起来困难还很多,那你就要加倍努力了。
1、编写一个程序,判定一个字符串是否是另一个字符串的子串,若是,返回子串在主串中的位置。
要求:
(1)在主函数中输入两个字符串,调用子函数cmpsubstr()判断,并在主函数输出结果。
(2)子函数的返回值为-1表示未找到,否则返回子串的位置(起始下标)。
#include
#include
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
#include
voidmain()
{
intsearch(char*str,int*sum);
charstr[100];
intd,sum[20],i;
gets(str);
d=search(str,sum);
for(i=0;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
#include
#include
#include
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{
*(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
#include
#include
#include
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;jt=0;
len1--;
}
}
sum++;//最后一个单词转移到ch2上//
*(ch2+len1)='';
len1=len1-t;
for(j=0;j*(ch2+len)='\0';
return(sum);
}
6、编写一个主函数以及一个函数maxlong(str)。
要求是:
(1)函数maxlong(str)找出字符串str中包含的第一个最长单词(用字符数组进行存储),并返回主调函数。
(2)在主函数中输入一个字符串,假定输入字符串中只含字母和空格,空格用来分割不同单词;以该字符串作为参数调用maxlong函数,并输出返回的结果。
#include
#include
#include
#include
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{
*(str0+i)=*(word+i);//将最大的单词赋给str0//
}
*(str0+i)='\0';
return(str0);
}
7、编写一个函数ad(a,m,n)找出一个m行n列的二维数组a中的“鞍点”;在主函数中输入二维数组的值(假设数组中任意两个数都不相等),并将它作为实参调用ad函数。
所谓“鞍点”是指该位置上的元素在该行上最大,在该列上最小;一个二维数组中可能没有鞍点。
#include
#include
#include
#include
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{
for(j=0;j{
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{
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{
*(p+i)=(int*)malloc(n*sizeof(int));
}
srand(time(NULL));////
for(i=0;i{
for(j=0;j{
*(*(p+i)+j)=rand()%100;//给数组赋值//
}
}
return(p);
}
voidprint(int**p,intm,intn)
{
inti,j;
for(i=0;i{
printf("第%d行为:
\n",i+1);
for(j=0;jprintf("%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
#include
#include
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{
*(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
#include
#include
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{
*(a+i)=rand()%100;
}
return(a);
}
voidprint(int*s,intn)
{
inti;
for(i=0;iprintf("\n");
}
voidsort(int*s,intn)
{
inti,j,temp;
for(i=0;i{
for(j=0;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,9
5
要求:
不允许使用数组;在递归函数中顺序输出该数的各位数,该数的位数则必须在主函数中输出。
#include
#include
#include
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、编写一个主函数以及一个函数merge。
要求是:
(1)函数merge对两个已是升序的数组a、b进行归并,归并后的结果仍然是升序的,并将归并结果返回给主调函数。
(2)主函数:
定义长度为5的数组a,并升序初始化;定义长度为8的数组b,并升序初始化;调用merge函数对数组a、b进行归并,并输出归并后返回的结果。
13、编写一个子函数求两个正整数的最大公约数和一个子函数求两个数的最小公倍数。
再写一个主函数,在主函数中输入两个正整数,在调用子函数求最大公约数和最小公倍数。
#include
voidmain()
{
intm,n;
intmax(intm,intn);
intmin(intm,intn);
scanf("%d,%d",&m,&n);
printf("%d,%d\n",max(m,n),min(m,n));
}
intmin(intm,intn)
{
inttemp;
if(m>n)
{
temp=n;
n=m;
m=temp;
}
while(m!
=0)
{
temp=n%m;
n=m;
m=temp;
}
return(n);
}
intmax(intm,intn)
{
intmin(intm,intn);
return(m*n/min(m,n));
}
14、编写一个排序子函数sort,和折半查找子函数find。
主函数的功能是:
输入组数后,调用sort排序,输出数组;再输入一个数给key,在调用find查找,并输出查找结果。
15、编写一个索引排序函数index。
主函数的功能呢个是:
输入未排序的原始数组A,调用index进行索引,index函数将按照从小到大排好序的索引数组B返回给主函数,在主函数中分别输出数组A与B。
索引数组B保存原始数组A的下标,经过索引,不改变数组A,只改变数组B,就可以完成对A的排序。
如图所示: