东北大学C语言期末考试题练习
东北大学C语言题库来自于moon的整理以及各种有价购买和无价白嫖,另外附上我的理解和代码
可能有错误和没考虑到的,考完东大C语言后也不会再更新,嗯,是的,如果有大佬想续写的话可以申请转载然后续写,整成一个大型题库,福泽同学。【doge】
一共三道题
难度递增
第一题
1.根据下面的函数关系,输入 X,计算 Y,要求输出结果保留两位小数。
(1)当 x 小于 5 时,y=0
(2)当 x 大于 5 且小于等于 10 时,y=sin(x)
(3)当 x 大于 10 时,y=cos(x)+sin(x)
#include <stdio.h>
#include <math.h>
int main() {
float X;
double Y;
scanf("%f",&X);
if(X<5)
Y=0;
else if(X>5&&X<10)
Y=sin(X);
else if(X>10)
Y=cos(X)+sin(X);
printf("%.2f",Y);
return 0;
}
2.根据下面的函数关系,输入 X,计算 Y,要求输出结果保留两位小数。
(1)当 x 小于 6 时,y 等于(1+x)
(2)当 x 大于等于 6 且小于 10 时,y 等于(x-2)的平方加 1
(3)当 x 大于等于 10 时,y 等于 sin(x)+2x
#include <stdio.h>
#include <math.h>
int main() {
double X;
double Y;
scanf("%lf",&X);
if(X<6)
Y=1+X;
else if(X>=6&&X<10)
Y=(X-2)*(X-2)+1;
else if(X>=10)
Y=sin(X)+2*X;
printf("%.2f",Y);
return 0;
}
3.从键盘输入三个整数,找处其最大和最小的数,并输出。
#include <stdio.h>
#include <math.h>
int main() {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
int max=x;
int min=x;
if(max<y)
max=y;
if(max<z)
max=z;
if(min>y)
min=y;
if(min>z)
min=z;
printf("max is %d\n",max);
printf("min is %d\n",min);
return 0;
}
4.输入一个 3 位的正整数,判定该正整数是否为一个回文数。(所谓回文数是指正读和反
读都相同的数,例如 131)。
#include <stdio.h>
//#include <math.h>
int main()
{
int num,n,nn=0;
scanf("%d",&num);
n=num;
while(n){
nn=nn*10+n%10;
n=n/10;
}
if(nn==num)
printf("this num is huiwenshu");
else
printf("no");
return 0;
}
感谢ysc同学提供的另外方法
#include <stdio.h>
int main()
{
int flag=1;
int i=0,c=0;
char ns[10];
gets(ns);
while(ns[i])
{i++;c++;printf("%c",ns[i]);}
//1 2 3 4
//i=4,c=4
i--;
//i=3
for(;i>0;i--)
if(ns[i]!=ns[c-i-1])
flag=0;
if(flag)
printf("yes");
else
printf("no");
return 0;
}
5.从键盘输入任意一个字母,如果其为大写字母,则转为小写字母;如果其为小写字母,
请转换为大写字母;其他情况保持不变,计算并输出。
#include <stdio.h>
//#include <math.h>
int main()
{
char al;
scanf("%c",&al);
if(al>='A'&&al<='Z'){
al=al+('a'-'A');
//printf("%c\n",al);
}
else if(al>='a'&&al<='z')//you must use else if ,compared if
al=al-('a'-'A');
printf("al has been change into %c\n",al);
return 0;
}
6.从键盘读入一个实数,对其进行四舍五入处理,要求精确到到小数点后两位。例如输入12.345,其结果为 12.35;输入 12.341,其结果为 12.34
#include <stdio.h>
//#include <math.h>
int main()
{
float num;
scanf("%f",&num);
printf("%.2f",num);
return 0;
}
补充这题有标答
void main()
{
float x;
printf("请输入 x 的值:");
scanf("%f",&x);
x=x*100+0.5;
x=(int)x;
x=x/100;
printf("y=%0.2f",x);
}
7.从键盘输入一个三位整数,计算其上下边界,例如 123,其下边界为 100,上边界为 199,
依此类推
#include <stdio.h>
int main()
{
int num,bo,to;
scanf("%d",&num);
bo=num;
to=num;
while(bo/100==num/100)
bo--;
bo++;
while(to/100==num/100)
to++;
to--;
printf("the top is %d\nthe bottle is %d",to,bo);
return 0;
}
标答:
void main()
{
int x;
int max,min;
printf("请输入三位数 x:");
scanf("%d",&x);
x=x/100;
min=(int)x;
min=min*100;
max=min+99;
...
8.从键盘输入一个三位纯小数,计算其上下边界,例如 0.123,其下边界为 0.100,上边界为 0.199,依此类推
#include <stdio.h>
int main()
{
float num,min,max;
int x;
scanf("%f",&num);
num=num*10;
x=(int)num;
min=(x*100)/1000.0;
max=(x*100+99)/1000.0;
printf("bottle is %.3f\ntop is %.3f",min,max);
return 0;
}
还不错
9.根据下面的函数关系,对输入的每个 x 值,计算出相应的 y 值并输出结果。
(1)当 x 小于 1 时,y 等于 2+cos(x)
(2)当 x 大于等于 1 且 x 小于 2 时,y 等于 x 的平方加上 sin(x)
(3)当 x 大于等于 2 时,y 等于(x-2)的平方根;
要求:按格式输出 x 和 y 的值,要求小数点后保留 2 位。
#include <stdio.h>
#include <math.h>
int main()
{
double x,y;
scanf("%lf",&x);
if(x<1)
y=2+cos(x);
if(x>=1&&x<2)
y=pow(x,2)+sin(x);
if(x>=2)
y=pow((x-2),0.5);
//值得注意de是:当if之后x发生变化则需要用else if 这就是与多if的区别
printf("x is %.2f\ny is %.2f\n",x,y);
return 0;
}
10.从键盘输入国际货币表示的商品价格,请转换为人民币。要求:仅仅考虑美元($)和欧元€,汇率分别 6 和 8。例如输入$100,输出 600,输入 E100,输出 800
#include <stdio.h>
//#include <math.h>
int main()
{
int rmb,money;
char id;
scanf("%c%d",&id,&money);
if(id=='$')
rmb=money*6;
else if(id=='E')
rmb=money*8;
printf("rmb is %d",rmb);
return 0;
}
11.从键盘读入一个自然数,判定其是否为素数,如果是,输出 Yes,否则输出 No
#include <stdio.h>
//#include <math.h>
int main()
{
int num;
int flag=1;//直接判定2是素数
scanf("%d",&num);
for(int i=2;i<num;i++)
{
if(num%i==0){
flag=0;break;}
}
if(flag==1)
printf("yes");
else
printf("no");
return 0;
}
12.输出公元 1000 至今的所有闰年的数量
#include <stdio.h>
//#include <math.h>
int main()
{
int year;
scanf("%d",&year);
if(year%400==0||(year%4==0&&year%100!=0))
printf("yes");
else
printf("no");
return 0;
}
13.从键盘输入一个自然数,判定其是否为完数,如果是,输出 Yes,否则输出 No。完数是指一个整数的所有因子之和等于其自身的数,例如 6=1+2+3。
#include <stdio.h>
int main()
{
int num;
int sum=0;
scanf("%d",&num);
for(int i=1;i<num;i++)
if(num%i==0)
sum+=i;
if(sum==num)
printf("yes");
else
printf("no");
return 0;
}
14.由 x,y 二个数字组成二位数 xx 和 yz,且 xy+yz=124。如果有解,输出所有解,否则输出无解
#include <stdio.h>
int main()
{
int flag=0;
for(int x=1;x<10;x++)
for(int y=1;y<10;y++)
for(int z=0;z<10;z++)
if(x*10+y+y*10+z==124)
{printf("%d%d+%d%d=124\n",x,y,y,z);
flag=1;}
if(flag==0)
printf("无解!!!");
return 0;
}
第二题
1.计算 1-1/2+1/3-1/4+…+1/n 的和,在主函数输入 n,计算输出结果。
#include <stdio.h>
float cal(int n);
int main()
{
int n;
float result;
scanf("%d",&n);
result = cal(n);
printf("%f",result);
return 0;
}
float cal(int n)
{
float sum=0;
for(int i=1;i<=n;i++)
{
if(i%2!=0)
sum+=1.0/i;//很实用的技巧
else
sum-=1.0/i;
}
return sum;
}
2.计算分数序列:2/1,-3/2,5/3,-8/5,13/8,-21/13,…,的前 10 项之和并输出。
#include <stdio.h>
int main()
{
float fm=1.0;
float fz=2.0,t;
float sum=0;
for(int i=0;i<10;i++)
{
if(i%2==0)
{
sum+=fz/fm;
}
else
sum-=fz/fm;
t=fz;
fz=fz+fm;
fm=t;
}
printf("%f",sum);
return 0;
}
3.计算 Fibonacci 数列中前 5 项的和。提示:Fibonacci 数列 F(n)的定义为:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)。
#include <stdio.h>
int F(int n);
int main()
{
int n,sum;
scanf("%d",&n);//n=5
for(int i=0;i<n;i++)
sum+=F(i);
printf("%d",sum);
return 0;
}
int F(int n)
{
if(n==0)
return 0;
else if(n==1)
return 1;
else
return F(n-1)+F(n-2);
}
4.计算全部水仙花数的和(提示:“水仙花” 数是指一个三位数,其各位数字的立方和
等于该数本身,例如:153).
#include <stdio.h>
int F(int n);
int main()
{
int sum=0;
for(int i=100;i<1000;i++)
sum+=F(i);
printf("the totle is %d",sum);
return 0;
}
int F(int n)
{
int a,b,c;
a=n/100;
c=n%10;
b=(n%100-c)/10;
if(a*a*a+b*b*b+c*c*c==n)
return n;
else
return 0;
}
5.计算 1/1+1/(1+2)+1/(1+2+3)+…+1/(1+2+…n)的,要求小数点后保留 6 位
#include <stdio.h>
int main()
{
float sum=0;
int fm=1;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
sum+=1.0/fm;
fm+=i+2;
}
printf("%.6f",sum);
}
6.编写函数int fun(int n),判定n是否为十位数字为1,个位数字为3或7的数。若是,函数返回1,否则返回0。(提示:例如:13、17、113、317都是这样的数。)
要求:在主函数中调用fun函数,并在主函数中输出1000之间的所有十位数字为1,个位数字为3或7的数。
#include<stdio.h>
int fun(int n)
{
int g,s;
g=n%10;
s=(n%100-g)/10;
if(s==1&&(g==3||g==7))
return 1;
else
return 0;
}
void main()
{
int n;
scanf("%d",&n);
printf("%d",fun(n));
}
第三题
1.编写函数 astrcat(char *t,char *s)将字符串 s 中的全部大写字符连接到字符串 t 的尾部,要求在主函数中定义数组存储字符串信息,调用函数实现链接后,输出结果。
#include <stdio.h>
void astrcat(char *t,char *s)
{
while(*t)
t++;
for(;*s;s++)
if(*s>='A'&&*s<='Z')
{
*t=*s;
t++;
}
}
int main()
{
char tt[50],*t;
char ss[50],*s;
gets(tt);
gets(ss);
t=tt;
s=ss;
astrcat(t,s);
for(;*t;t++)
printf("%c",*t);
}
2.已知一有序序列 1,2,4,6,12,14,要求从键盘输入一个整数,将此整数插入到此有序序列中。要求输出原始数组和插入之后的数组。要求编制函数 insert(int *p,int d)实现此功能,在主函数调用此函数。
提示:例如输入整数位 7,首先要找到 7 在整个序列中的位置,然后将 7 插入到当前位置。
三种方式:1.数组2.指针将d放到最后进行冒泡排序3.迭代挪位置4.打印就好,不存储(最简单),2,3都得知道数据个数。麻烦
方法二:
#include <stdio.h>
void insert(int *a,int num);
int main()
{
int b[10]={1,12,2,6,4,14};
int *a,num;
a=b;
scanf("%d",&num);
insert(a,num);
for(;*a;a++)
{
printf("%d ",*a);
}
return 0;
}
void insert(int *a,int num)
{
int c=1,t,k,j;
*(--a)='\0';
a++;//诡异的发现num的地址在这放着 呜呜呜呜
while(*a)
{
c++; //c=7
a++;
}
*a=num;
for(k=0;k<c;k++)
{
for(j=0;j<c-k;j++)
{
if(*(a-j-1)>*(a-j))
{
t=*(a-j);
*(a-j)=*(a-j-1);
*(a-j-1)=t;
}
}
}
}
方法三:我觉得这是根据提示来说最像答案的一种方法
#include <stdio.h>
void insert(int *p,int d)
{
int i,j;
for(i=0;i<6;i++)
{
if(d>*p&&d<*(p+1))
break;
p++;
}
j=7-i;
if(i<6)
{
for(j;j>1;j--)
*(p+j-1)=*(p+j-2);
*(p+1)=d;
}
}
int main()
{
int a[100]={1,2,4,6,12,14};
int d,i=0,*p;
p=a;
printf("原始数组:\n");
for(i=0;i<6;i++)
printf("%5d",a[i]);
printf("\n");
printf("请输入整数 d:");
scanf("%d",&d);
insert(p,d);
printf("处理后数组:\n");
i=0;
for(i=0;i<7;i++)
printf("%5d",a[i]);
}
方法四:
#include <stdio.h>
void insert(int *p,int d)
{
while(*p<d){
printf("%d ",*p);
p++;
}
p--;
printf("%d ",d);
p++;
while(*p){
printf("%d ",*p);//*p++ 等于 *(p++),用完地址都不知道去哪了
p++;
}
}
int main()
{
int s[10]={1,2,4,6,12,14};
int *p,d;
scanf("%d",&d);
p=s;
insert(p,d);
return 0;
}
3.从键盘读入一整数,判断其在数组 3,23,-7,8,9,10 中是否存在,假设此数组中不存在重复的数字。若存在,则删除此数;否则,提示此数不存在。要求:编制函数remove(double *p,double d)实现数据的清理工作,并输出原始数据和删除后的数据。
#include <stdio.h>
int remov(int *p,int d)
{
while(*p)
{
if(*p==d){
while(*p)
{
*(p)=*(p+1);
p++;
}
p-=2;
*p='\0';
return 1;
}
p++;
}
return 0;
}
int main()
{
int d,*p,s;
int ns[6]={3,23,-7,8,9,10};
scanf("%d",&d);
p=ns;
s=remov(p,d);
if(s==0)
printf("no exised");
else
while(*p)
printf("%d ",*p++);
return 0;
}
4.从键盘读入一字符 c,判断其在字符串"English"中是否存在,假设此数组中不存在重复的字符。若存在,则删除此数;否则,提示此数不存在。要求:编制函数 del(char *p,char c)实现数据的清理工作,并输出原始数据和删除后的数据。
只写了一部分,需要自己补充提示不存在的那个,懒得写了
#include <stdio.h>
void del(char *p,char c)
{
while(*p!=c&&*p)
p++;
for(int i=0;i<20;i++)
*(p+i)=*(p+i+1);
}
int main()
{
char op[20]="English",*p;
char c;
printf("origin:");
puts(op);
p=op;
scanf("%c",&c);
del(p,c);
printf("\nlater:");
puts(op);
return 0;
}
有空了更新下
#include <stdio.h>
#include <string.h>
void del(char *p,char c)
{
char *t=p;
while(*p)
{
if (*p!=c)
{
*t=*p;
t++;
}
p++;
}
if(strlen(t)==strlen(p))
printf("该字符不存在!");
*t=0;
}
int main()
{
char s[100]="English",*p,c;
p=s;
printf("输入字符:");
scanf("%c",&c);
del(p,c);
printf("\n 执行 clean 后的结果:%s",s);
fflush(stdin);
}
5.编写函数 mstrcpy(char *t,char *s,int m)字符串 s 中的第 m 个字符开始的全部字符复制成另一个字符串 t。要求在主函数中初始化字符串 s,从键盘读入 m 的值,输出字符串 s 和复制的字符串 t。
#include <stdio.h>
#include <string.h>
void mstrcpy(char *t,char *s,int m)
{
//abcd
//m=2
s+=(m-1);
while(*s)
{
*t++=*s++;
//t++;s++;
}
}
int main()
{
int m;
char ss[50]="FSABFRBKfwfwfwfwfwf";
char tt[50];
char *t,*s;
s=ss;
t=tt;
scanf("%d",&m);
mstrcpy(t,s,m);
for(;*t;t++)
printf("%c",*t);
}
6.编写函数 clear(char *s)将字符串 s 中的全部英文字母删除,要求在主函数中定义数组存储字符串信息,调用函数实现链接后,输出结果。
//123HSIOAHFOANfwfwffwfw48093tur09
#include <stdio.h>
void clear(char *s)
{
while(*s)
{
if((*s>='A'&&*s<='Z')||(*s>='a'&&*s<='z'))
{
for(int j=0;j<50;j++)
{
*(s+j)=*(s+j+1);
}
s--;
}
s++;
}
}
int main()
{
char ss[50];
gets(ss);
char *s;
s=ss;
clear(s);
puts(ss);
return 0;
}
7.在物理实验中,获得 5 个数据{0.89,0.78,0.0009,0.67,0.56},其中有一个数据小于0.001,此数据无效,将此无效数据删除。要求编制函数 cleandata(double *p)实现数据的清理工作,并在主函数输出删除之前的数组和删除之后的数组。
#include <stdio.h>
void cleandata(double *p)
{
for(int i=0;i<5;i++)
{
if(*p<0.001)
{
for(int j=0;j<5;j++)
*(p+j)=*(p+j+1);
p--;
}
p++;
}
*p='\0';
for(int i=5;i>1;i--)
printf("%lf ",*(p-i+1));
}
int main()
{
int i;
double ss[5]={0.89,0.78,0.0009,0.67,0.56},*p;
p=ss;
for(i=0;i<5;i++)
printf("%lf ",*(p+i));
printf("\n after clean \n");
cleandata(p);
}
8.编写函数 nstrcat(char *t,char *s)将字符串 s 中的全部数字字符连接到字符串 t 的尾部。
#include <stdio.h>
int nstrcat(char *t,char *s)
{
while(*t)
t++;
while(*s)
{
if(*s>='0'&&*s<='9')
{
*t=*s;
t++;
}
s++;
}
}
int main()
{
char s1[100],t1[100],*s,*t;
s=s1;
t=t1;
printf("请输入字符串 s:");
gets(s1);
printf("请输入字符串 t:");
gets(t1);
nstrcat(t,s);
printf("连接后的结果:%s",t1);
}
The end
都看到这里了,点个赞吧,支持原创。。。