吉林大学 中国大学MOOC 高级语言程序设计 期末考试——编程题(2022级)

本人能力有限,发出只为帮助有需要的人。

建议同学们自己写完后再进行讨论。

1数字三角阵(15分)

问题描述:按规律根据输入的整数 N,打印 NN 列的数字三角阵。

输入:输入一个正整数 N (≤100)

输出:输出由数字 0~9构成的 NN 列的数字三角矩阵:其中第一列有1个数,第二列有2个数,第 N 列有 N 个数,从上至下、从左至右依次蛇形排列,每个数字占用2个字符空间;整个数字三角阵,除必要的空格、数字、换行符,无多余符号,最后一行最后一个数字后无其他字符。

样例

输入:

11

输出

吉林大学 中国大学MOOC 高级语言程序设计 期末考试——编程题(2022级)_第1张图片

时间限制:500ms内存限制:32000kb

#include
int main(void)
{
    int i,j,n,tem=0,sum=1,a[100];
    scanf("%d",&n);
    for(i=0;in-j)
                printf(" %d",a[i]);
        }
        printf("\n");
        j--;
    }
    return 0;
}

2英文翻译自然数(15分)

问题描述:按常规英文输出1000以内自然数的英文读法。

输入:每个测试输入包含 1 个测试用例,给出正整数 n(0<=n <1000)

输出:输出占一行:如果 0<=n <1000 用规定的格式输出 n,所有英文单词小写,最后一个单词后无字符;否则输出 ERR

样例1:输入 123 输出:one hundred and twenty-three

样例2:输入 100 输出:one hundred

时间限制:500ms内存限制:32000kb

此题为超星慕课的作业原题

#include
#include
int main(void)
{
    int n,x1,x2,x3,flag=0,i;
    char *ToNineteen[20]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventy","eighteen","nineteen"};
    char *ToNinety[8]={"twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
    scanf("%d",&n);
    if(n==0)//0的情况最好单独提出
        printf("zero");
    else if(n%100==0)
    {
        x1=n/100;
        flag=1;//flag控制空格
        printf("%s",ToNineteen[x1]);
        printf(" hundred");
    }
    else if(n>100)
    {
        x1=n/100;
        n%=100;
        flag=1;
        printf("%s",ToNineteen[x1]);
        printf(" hundred and");//注意and的运用
    }
    if(n<=19&&n>0)//排除0的情况
    {
        if(flag)
            printf(" ");
        printf("%s",ToNineteen[n]);
    }
    else if(n>19&&n<100)
    {
        if(n%10==0)
        {
            x2=n/10;
            if(flag)
                printf(" ");
            printf("%s",ToNinety[x2-2]);//ToNinety的char数组中没有0和10
        }
        else
        {
            x3=n%10;
            x2=(n-x3)/10;
            if(flag)
                printf(" ");
            if(x3==0)
                printf("%s",ToNinety[x2-2]);//ToNinety的char数组中没有0和10
            else
            {
                printf("%s-",ToNinety[x2-2]);//注意十位和个位之间的-
                printf("%s",ToNineteen[x3]);
            }
        }
    }
    return 0;
}

3特定规则的括号匹配(20分)

问题描述:

`{}`、`[]`、`()`又称大括号、中括号和小括号;括号匹配除了必要的同类型括号左右成对儿且不交叉的规定;还增加如下规则:大括号内能包含大、中、小括号,中括号内只能包含中、小括号,小括号内只能包含小括号。请编写程序判断从键盘输入的以`#`结束的字符串(可能包含空格、回车、换行和制表等符号,字符串长度不限),其中的`{}`、`[]`、`()`是否按照上述规则匹配。如果匹配成功,则输出提示信息`MATCHED`和匹配的括号对的数目;如果匹配不成功,则输出提示信息`ERR`,以及在出现第一个错误前、已经匹配的括号对的数目(提示信息和括号对数目的中间,以一个西文空格间隔)。匹配括号对的数目不超过int型可表示范围,且括号嵌套层数不超过100层。

输入:以`#`结束的任意长度字符串;其中匹配括号对的数目不超过int型可表示范围,且括号嵌套层数不超过100层。

输出:如果按上述规则大、中、小括号匹配成功,则输出提示信息`MATCHED`和匹配的括号对的数目;如果匹配不成功,则输出提示信息`ERR`,以及在出现第一个错误前,已经匹配的括号对的数目(提示信息和括号对数目的中间,以一个西文空格间隔),除此之外无其它字符。

样例1:

输入programming#

输出 MATCHED 0

样例2:

输入 o{n[lin(e j)udgem]e}{[[()]]}nt#

输出 MATCHED 7

样例3:

输入 {}[[[()]({})]]#

输出 ERR 3

样例3的括号匹配错误出现在最后一个`(`,此前已经匹配成功的括号有3对:{}[()]。

时间限制:500ms内存限制:32000kb

此题是超星慕课的作业,稍微修改了一下规则。

#include
#include
#define SIZE 100
char stack[SIZE],ch,out;
int top,flag=0,num=0,tem=0,i;
int push(char x);
char pop(void);
void check(char x,char y);
int main(void)
{
    top=0;
    push('#');//栈的第一个元素
    ch=getchar();
    while(ch!='#')
    {
        switch(ch)//筛选所有括号入栈
        {
            case'(':
            case'[':
            case'{':push(ch);break;//switch的break用法
            case')':out=pop();check(out,'(');break;
            case']':out=pop();check(out,'[');break;
            case'}':out=pop();check(out,'{');break;
        }
        ch=getchar();//检测下一个char
    }
    if(flag==0)//检测flag是否被改变
        printf("MATCHED %d",num);
    else
        printf("ERR %d",num);
    return 0;
}
int push(char x)//压入
{
    for(i=0;iSIZE-1)//栈的输入大于等于SIZE
        return 0;
    else
    {
        stack[top]=x;
        top+=1;
        return 1;
    }
}
char pop(void)//弹出
{
    if(top<1)//栈为空的情况
        return 0;
    else
    {
        top-=1;
        out=stack[top];
        return out;
    }
}

void check(char x,char y)//检测左右括号
{
    if(x=='#'||x=='\0')//检测栈是否弹出结束
        flag=1;
    else if(y!=x)//检测括号没有交叉
        flag=1;
    else
        if(!flag)//flag表示有错
            num++;
}

4生成有序序列(20分)

问题描述:设整数集合 M 定义如下:1∈M;若x∈M , 则2x+1∈M , 3x+1∈M;没有别的整数属于集合 M。编程序按递增顺序生成并输出集合M的无重复的前n(n<50)项。
输入:一个整数n
输出:n个无重复的递增整数,整数之间以一个西文空格间隔,最后一个整数后无多余字符。
样例:输入3  输出1 3 4

时间限制:500ms内存限制:32000kb

此题为超星慕课上的作业原题

#include
int main(void)//此方法使用除法
{

    int a[1000],n,i,j,k,l,m,x,y,flag=0;//数组要开大一些,分配多些内存
    scanf("%d",&n);
    a[0]=1;
    printf("1");
    k=1;
    for(i=3;i<7*n;i++)
    {
        j=i;x=0;y=0;
        if((i-1)%2==0)//分别考虑*2+1和*3+1的情况
            x=(i-1)/2;
        if((i-1)%3==0)
            y=(i-1)/3;
        for(m=0;m

5十六进制大整数加法(20分)

问题描述:编写程序,从键盘读入形如X + Y=的表达式计算结果,其中X和Y都是合法且长度不超过64位的十六进制非负整数,结果中所有字符均大写且无多余的零。

样例1:输入 1234+1234=输出0X2468

样例2:输入 0000+12A= 输出0X12A

样例3:输入 12ff+1= 输出 0X1300

时间限制:500ms内存限制:32000kb

通常的思路是将十六进制数转化成十进制数,相加后再将十进制数转换成十六进制。但此题在题目里写明了计算的整数很大,所以转换成十进制整数后会超过long long的范围。以下为此思路代码(一个测试点有误)

#include 
#include 
#include 
long long hex(char *m);
void printHex(long long n)//输出十六进制数的递归写法
{
    if(n)
    {
        printHex(n/16);
        if(n%16>=10)
            printf("%c",n%16-10+'A');
        else
            printf("%d",n%16);
    }
}
int main(void)
{
    char a[200]={0},b[100]={0},c[100]={0};
    char *p,*q;
    long long n0,n1,n2,i,intb,intc,result;
    scanf("%s",a);//输入一个字符串
    p=a;
    while(*p!='+')//使指针p指向+
        p++;
    n1=p-a;//获得第一个十六进制数的长度
    q=p+1;//指针q为第二个十六进制数的初指针
    while(*q!='=')
        q++;
    n2=q-p-1;//获得第二个十六进制数的长度
    for(i=0;i='A'&&*(m+i)<='F')
            sum+=(*(m+i)-'A'+10)*pow(16,tem-i-1);
        else if(*(m+i)>='a'&&*(m+i)<='f')
            sum+=(*(m+i)-'a'+10)*pow(16,tem-i-1);
        else
            sum+=(*(m+i)-'0')*pow(16,tem-i-1);
    }
    return sum;
}

事实上,c语言可以直接输入输出十六进制数(其本质与上面代码相同),但也无法满足此题要求。代码如下。

#include 
#include 

int main()
{
    long long a,b;//本质也是将十六进制转换成十进制,导致大整数溢出
    scanf("%llx %llx",&a,&b);//此处大小写都可以十六进制输入
    printf("0X%llX",a+b);//%llX为大写双精度十六进制格式
    return 0;
}

转化思路,将十六进制数看成字符串,将每一位字符转化成十进制存入整型数组,再将两整型数组按位相加,便可以计算大整数。代码如下。

#include 
#include 
#include 
int max(int x,int y)//取两个整数中大的那个
{
    int result=x;
    if(x='A'&&*(a+i)<='F')
            b[i]=(*(a+i)-'A'+10);
        else if(*(a+i)>='a'&&*(a+i)<='f')
            b[i]=(*(a+i)-'a'+10);
        else
            b[i]=(*(a+i)-'0');
    }
    for(i=0;i='A'&&*(p+1+i)<='F')
            c[i]=(*(p+1+i)-'A'+10);
        else if(*(p+1+i)>='a'&&*(p+1+i)<='f')
            c[i]=(*(p+1+i)-'a'+10);
        else
            c[i]=(*(p+1+i)-'0');
    }
    n3=max(n1,n2);//相加数组的位数为两个数组中大的那个
    for(i=n3;i>0;i--)//得到十六进制数组相加的按位表示
    {
        if(n1>0&&n2>0)
            intres[i-1]=b[n1-1]+c[n2-1];//之前此处有数组越界,感谢Rake449的提醒
        else if(n1>0&&n2<=0)
            intres[i-1]=b[n1-1];
        else if(n1<=0&&n2>0)
            intres[i-1]=c[n2-1];
        n1--;n2--;
    }
    for(i=n3;i>0;i--)
    {
        tem=(intres[i-1]+flag);//flag为进位
        if(tem>=16)
        {
            tem=tem%16;
            if(tem>=10)
                res[i-1]=tem-10+'A';
            else
                res[i-1]=tem+'0';
            flag=1;
        }
        else
        {
            if(tem>=10)
                res[i-1]=tem-10+'A';
            else
                res[i-1]=tem+'0';
            flag=0;
        }
    }
    if(flag)//最高位有进位的情况
        printf("0X1%s",res);
    else
        printf("0X%s",res);
    return 0;
}

你可能感兴趣的:(c语言)