东北大学C语言期末题题

东北大学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
都看到这里了,点个赞吧,支持原创。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值