C语言上机题例.docx

上传人:b****7 文档编号:26334587 上传时间:2023-06-17 格式:DOCX 页数:17 大小:21.09KB
下载 相关 举报
C语言上机题例.docx_第1页
第1页 / 共17页
C语言上机题例.docx_第2页
第2页 / 共17页
C语言上机题例.docx_第3页
第3页 / 共17页
C语言上机题例.docx_第4页
第4页 / 共17页
C语言上机题例.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

C语言上机题例.docx

《C语言上机题例.docx》由会员分享,可在线阅读,更多相关《C语言上机题例.docx(17页珍藏版)》请在冰豆网上搜索。

C语言上机题例.docx

C语言上机题例

一、字符串类

1、假定输入的字符串中只包含字母和*号。

请编写函数fun,它的功能是:

除了字符串前导和尾部的*号之外,将串中其它*号全部删除。

形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。

在编写函数时,不得使用C语言提供的字符串函数。

例如,字符串中的内容为:

****A*BC*DEF*G********,删除后,字符串中的内容应当是:

****ABCDEFG********。

在编写函数时,不得使用C语言提供的字符串函数

解题思路:

先将原串中从首字符开始的连续*放到一字符串数组中,再将从第一个非*字符开始到串尾连续*之前的非*字符追加其后,接着将串尾的连续*后追加,最后将新串中的字符放到原串中覆盖原串

voidfun(char*a,char*h,char*p)

{charb[81],*x;

inti=0,j=0;

x=a;

while(x

while(h<=p)

if(*h!

='*'){b[j]=*h;j++;h++;}

elseh++;

p++;

while(*p){b[j]=*p;j++;p++;}

b[j]='\0';j=0;

while(b[j])

{a[i]=b[j];i++;j++;}

a[i]='\0';

}

3、请编写一个函数fun,它的功能是:

比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较长的字符串。

若两个字符串长度相同,则返回第一个字符串。

例如,输入beijingshanghai为回车键)

函数将返回shanghai。

解题思路:

先分别使用循环语句计算出各个字符串的长度,再对此长度进行比较来确定返回值

char*fun(char*s,char*t)

{

intfirst=0,second=0;

char*p,*q;

p=s;

q=t;

while(*p++!

='\0')/*判断是否到了字符串s的结尾*/

first++;

while(*q++!

='\0')/*判断是否到了字符串t的结尾*/

second++;

if(first==second)/*判断两个字符串的长度是否相等*/

returns;/*若上述条件成立,则返回第一个字符串*/

elseif(first>second)/*返回较长的字符串*/

returns;

else

returnt;

}

4、规定输入的字符串中只包含字母和*号。

请编写函数fun,它的功能是:

使字符串最前面连续的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。

例如,字符串中的内容为:

*******A*BC*DEF*G****,若n的值为4,删除后,字符串中的内容应当是:

****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍为:

*******A*BC*DEF*G****。

n的值在主函数中输入。

在编写函数时,不得使用C语言提供的字符串函数。

voidfun(char*a,intn)

{charb[81];

inti=0,j=0,s=0,k;

while(a[i]=='*'){s++;i++;}

if(s>n)

{for(k=0;k

{b[j]='*';j++;}

while(a[i])

{b[j]=a[i];j++;i++;}

b[j]='\0';i=0;j=0;

while(b[j])

{a[i]=b[j];i++;j++;}

a[i]='\0';

}

}

二、多项式类

2、请编写一个函数fun,它的功能是:

根据以下公式求π的值(要求满足精度0.0005,即某项小于0.0005时停止迭代):

程序运行后,如果输入精度0.0005,则程序输出为3.140578。

解题思路:

通过循环语句判断公式中某项是否在精度范围之内,以控制迭代。

doublefun(doubleeps)

{

intn=0;

doubledown=1,up=1;

doubleone,pi=0;

one=(double)up/(double)down;

while(one>=eps){/*通过循环语句判断公式中某项是否在精度范围之内*/

pi+=one;

n++;

up=up*n;

down=down*(2*n+1);

one=(double)up/(double)down;

}

returnpi*2;

}

20、请编写函数fun,其功能是:

计算并输出下列多项式的值:

例如,在主函数中从键盘给n输入8后,输出为:

s=0.662872。

注意:

要求n的值大于1但不大于100。

解题思路:

该题考查的是数学上的一个数列,其通式为:

1/(2*n-1)-1/(2*n)。

在给出的参考程序中,由于函数要求的返回值为双精度型,所以将sum定义为双精度型,其初值为0.0,再判断输入的n是否符合条件,如果条件为真,则执行for循环,分别计算出1.0/(2*i-1)-1.0/(2*i)相应的每一个多项式的值,同时累加到变量sum中,并将该结果返回。

doublefun(intn)

{inti;

doublesum=0.0;/*定义sum为双精度型变量,并给其赋初值为0.0*/

if(n>1&&n<=100)

{for(i=1;i<=n;i++)

sum+=1.0/(2*i-1)-1.0/(2*i);/*计算出1.0/(2*i-1)-1.0/(2*i)相应的每一个多项式的值,同时累加到变量sum中*/

}

returnsum;/*返回计算结果*/

}

三、数组类

5、请编写一个函数fun,它的功能是:

计算n门课程的平均分,计算结果作为函数值返回。

例如:

若有5门课程的成绩是:

90.5,72,80,61.5,55,则函数的值为:

71.80

解题思路:

先使用循环语句对数组中的各个元素求和,然后用此和除以数组的元素总个数即得平均值。

然后使用return语句将此平均值作为函数的返回值返回。

floatfun(float*a,intn)

{

inti;

floataverage;

doublesum=0;

for(i=0;i

sum+=a[i];/*对数组中的各个元素求和*/

average=(float)sum/n;/*计算平均值*/

returnaverage;/*返回平均值*/

}

13、请编写一个函数unsignedfun(unsignedw),w是一个大于10的无符号整数,若w是n(n≥2)位的整数,函数求出w的低n-1位的数作为函数值返回。

例如:

w值为5923,则函数返回923;w值为923,则函数返回23

解法二:

/*注:

由于unsigned型整数在0-65535这间,只要它大于10000则对10000求余即得出后面4位,否则如果大于1000则对1000求余得出后3位数,这样一层一层往小的判断。

由于return的作用除了返回值以外,还有当执行到return时就跳出该程序,所以可以连续的用if()语句*/

unsignedfun(unsignedw)

{if(w>=10000)returnw%10000;

if(w>=1000)returnw%1000;

if(w>=100)returnw%100;

returnw%10;

}

14、请编写一个函数intfun(int*s,intt,int*k),用来求出数组的最大元素在数组中的下标,用k返回。

例如,输入如下整数:

876675896101301401980431451777

则输出结果为:

6,980

本题的考核点是求数组中的最大元素在数组中的下标。

解题思路:

1、定义变量max_integer,用以存放数组s[]中的最大元素;

2、建立循环,查找出数组s[]中的最大元素;

3、将查找到的最大元素的下标赋给k,并传回主函数。

intfun(int*s,intt,int*k)

{

intmax_integer=0;/*定义变量max_integer,用以存放数组s[]中的最大元素*/

inti=0;

max_integer=s[0];/*假定第一个数组元素为最大*/

for(i=0;i

{/*建立循环,查找出数组s[]中的最大元素*/

/*将查找到的最大元素的下标赋给k,并传回主函数*/

if(max_integer

{

max_integer=s[i];

*k=i;

}

}

return*k;

}

}

16、请编写一个函数fun,它的功能是:

求出1到m之内(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。

例如,若传送给m的值为50,则程序输出:

711142122283335424449

解题思路:

使用循环语句使循环变量依次从1递增到m,并将每个值与7和11进行取余比较,将符合条件的值存放入数组中,统计符合条件的值的个数并返回。

#include

#include

#defineM100

voidfun(intm,int*a,int*n)

{

inti,count=0;/*count用于计数*/

for(i=1;i<=m;i++){/*使用循环语句使循环变量依次从1递增到m*/

if(i%7==0||i%11==0){/*判断变量i是否能被7或者11整除*/

a[count++]=i;/*将符合条件的值存放入数组a中*/

}

}

*n=count;/*返回能被7或者11整除的数的个数*/

}

17、请编写一个函数fun,它的功能是:

找出一维整型数组元素中最大的值和它所在的下标,最大的值和它所在的下标通过形参传回。

数组元素中的值已在主函数中赋予。

主函数中x是数组名,n是x中的数据个数,max存放最大值,index存放最大值所在元素的下标

解题思路:

先取出数组中的第一个元素,然后通过循环语句依次用数组中的其他元素与其作比较,如果大于第一个元素则交换两者的值,并记录此数组元素的下标,直到数组中的元素都比较完为止。

voidfun(inta[],intn,int*max,int*d)

{

inti,base,subscript;

base=a[0];/*假定第一个元素的值最大*/

subscript=0;/*subscript用于存放数组下标*/

for(i=1;i

if(a[i]>base){/*将数组中的其他元素与变量base作比较,如果大于它则交换两者的值*/

subscript=i;

base=a[i];

}

}

*max=base;/*将最大值元素的值赋给*max*/

*d=subscript;/*将最大值元素的下标赋给*d*/

}

四、结构体

7、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:

把高于等于平均分的学生数据放在h所指的数组中,高于等于平均分的学生人数通过形参传回,平均分通过函数值返回

解题思路:

先求出平均分,然后再将学生成绩与平均分作比较,将高于等于平均分的学生数据放在另一数组中,并统计人数的个数。

doublefun(STREC*a,STREC*b,int*n)

{inti,j;

doubleaver=0;

*n=0;

for(i=0;i

aver=aver+a[i].s;/*求和*/

aver=aver/N;/*计算平均分*/

for(i=0;i

if(a[i].s>=aver)

{b[*n].s=a[i].s;/*将高于等于平均分的学生数据放在另一数组b中*/

for(j=0;j<10;j++)

b[*n].num[j]=a[i].num[j];

*n=*n+1;/*统计高于等于平均分的学生人数*/

}

return(aver);/*返回平均分*/

}

8、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:

按分数的高低排列学生的记录,高分在前。

voidfun(STRECa[])

{inti,j,p,t,k;

charh;

for(i=0;i

{p=i;

for(j=i+1;j

if(a[p].s

if(p!

=i)

{

t=a[p].s;a[p].s=a[i].s;a[i].s=t;

for(k=0;k<10;k++)

{h=a[p].num[k];

a[p].num[k]=a[i].num[k];

a[i].num[k]=h;

}

}

}

}

10、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:

函数返回指定学号的学生数据,指定的学号在主函数中输入。

若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回。

(用于字符串比较的函数是strcmp

解题思路:

通过字符串比较函数将指定的学号与每一个学生的学号进行比较,若相同,则返回指定的学生数据;若没有一个相同的,则给学号置空串,成绩置-1并返回。

STRECfun(STREC*a,char*b)

{inti,f=0;

STRECp;/*定义结构体变量*/

p=a[0];

for(i=0;i

if(strcmp(a[i].num,b)==0){p=a[i];f=1;}/*通过字符串比较函数将指定的学号与每一个学生的学号进行比较,若相同,则返回指定的学生数据*/

if(f==0)/*判断是否找到指定学号*/

{p.num[0]='\0';/*若没找到指定学号,在结构体变量中给学号置空串*/

p.s=-1;/*若没找到指定学号,在结构体变量中给成绩置-1*/

}

returnp;/*返回学号和成绩*/

}

五、循环类

51、编写函数fun,它的功能是:

求Fibonacci数列中大于s的最小的一个数,结果由函数返回。

其中Fibonacci数列F(n)的定义为:

F(0)=0,F

(1)=1

F(n)=F(n-1)+F(n-2)

例如:

当s=1000时,函数值为:

1597

解题思路:

在Fibonacci数列中,每一项的值都是前两项之和。

设置一个中间变量m,用来置放推出的最小数,所以可以用递推法求出大于s的最小的一个数。

intfun(ints)

{

intx1=0,x2=1,m=0;

/*假如当前项的值小于指定值s,但是下一项的值又大于指定值s,即下一项值即为大于s的最小的一个数*/

while(s>m)

{

m=x1+x2;

x1=x2;

x2=m;

}

returnm;

}

六、按位置取整类

3、函数fun的功能是:

将a、b中的两个两位正整数合并形成一个新的整数放在c中。

合并的方式是:

将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。

例如,当a=45,b=12。

调用该函数后,c=1425

解题思路:

可用整除和求余的运算求取整数各位上的数值。

方法是整除相应位上的位权值,再对其求余,余数即为相应位上的数值。

voidfun(inta,intb,long*c)

{

inta_up,a_low,b_up,b_low;

a_up=a/10;/*求正整数a的十位数*/

a_low=a%10;/*求正整数a的个位数*/

b_up=b/10;/*求正整数b的十位数*/

b_low=b%10;/*求正整数b的个位数*/

*c=b_up*1000+a_up*100+b_low*10+a_low;/*将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的千位和十位上*/

}

9、函数fun的功能是:

将两个两位数的正整数a、b合并形成一个整数放在c中。

合并的方式是:

将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上。

例如,当a=45,b=12。

调用该函数后,c=2415。

解题思路:

可用整除和求余的运算求取整数各位上的数值。

方法是整除相应位上的位权值,再对其求余,余数即为相应位上的数值。

voidfun(inta,intb,long*c)

{

inta_up,a_low,b_up,b_low;

a_up=a/10;/*求正整数a的十位数*/

a_low=a%10;/*求正整数a的个位数*/

b_up=b/10;/*求正整数b的十位数*/

b_low=b%10;/*求正整数b的个位数*/

*c=b_low*1000+a_up*100+b_up*10+a_low;/*将a数的十位和个位数依次放在c数的百位和个位上,b数的十位和个位数依次放在c数的十位和千位上*/

七、素数类

24、请编写函数fun,其功能是:

计算并输出3到n之间所有素数的平方根之和。

例如,在主函数中从键盘给n输入100后,

输出为:

sum=148.874270

解题思路:

从3到指定数n,找出所有的素数,素数的判断方法是:

只能被1和其自身整除,而不能被其它任何数整除的数;sqrt(x)函数是计算x的平方根。

doublefun(intn)

{

inti,j=0;/*定义两个整型变量*/

doubles=0;/*定义变量s为双精度型*/

for(i=3;i<=n;i++)

{for(j=2;j

if(i%j==0)break;/*如果i能被j整除就说明i不是素数,继而退出循环体*/

if(j==i)s=s+sqrt(i);/*sqrt(i)函数是计算i的平方根*/

}

returns;/*返回结果*/

}

28、编写函数intfun(intlim,intaa[MAX]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回求出素数的个数。

解题思路:

从2到指定数lim,找出所有的素数,素数的判断方法是:

只能被1和其自身整除,而不能被其它任何数整除的数。

intfun(intlim,intaa[MAX])

{inti,j=0,k=0;

for(i=2;i<=lim;i++)/*判断i是否小于或等于lim,如果i小于等于lim执行循环*/

{for(j=2;j

if(i%j==0)break;/*假如i能被整除,则退出该层循环*/

if(j==i)aa[k++]=i;/*假如i不能被比它小的整数整除,则将i存入aa数组中*/

}

returnk;

}

34、请编写函数fun,函数的功能是:

将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k传回。

例如,若输入:

17,则应输出:

9和46891012141516。

本题的考核点是求2到m-1之间的非素数算法。

解题思路:

非素数的判断方法与素数的判断方法正好相反,它除了能被1和自身整除外,还可被其它的数整除。

用求余的方法来判断整除。

voidfun(intm,int*k,intxx[])

{inti,j;*k=0;

for(i=2;i

{for(j=2;j

if(i%j==0)break;

if(j

}

八、链表

12、N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。

请编写函数fun,它的功能是:

求出平均分,由函数值返回。

例如,若学生的成绩是:

85,76,69,85,91,72,64,87;则平均分应当是:

78.625

解题思路:

从链表首结点开始,累计成绩之和,再除以学生人数,得出平均值并返回。

doublefun(STREC*h)

{STREC*p;

doubleaver=0;

p=h->next;

while(p!

=0)

{aver=aver+p->s;/*从链表首结点开始累计成绩之和*/

p=p->next;/*p后移一个结点*/

}

aver=aver/N;/*求成绩的平均值aver*/

returnaver;/*返回结果*/

}

其他类

某学生的记录由学号、8门课程成绩和平均分组成,学号和8门课程的成绩已在主函数中给出。

请编写函数fun,它的功能是:

求出该学生的平均分放在记录的ave成员中。

请自己定义正确的形参。

例如,学生的成绩是:

85.5,76,69.5,85,91,72,64.5,87.5,他的平均分应当是:

78.875

解题思路:

先统计8门课程的总分数,然后再除8,求学生的平均分。

voidfun(STREC*p)

{inti;

doubleaver=0;/*将平均分赋初值0*/

for(i=0;i

{aver=aver+(*p).s[i];}/*求和*/

(*p).ave=aver/N;/*计算平均值*/

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1