首页 > 技术文章 > 第一次上机考试补题报告

lavendery 2021-10-24 22:39 原文

 

 

 R7-4 求某月的天数

          题目:

                         输入年份year、月份month,判断该月的天数。闰年:能被4整除但不能被100整除或者能被400整除的年份是闰年。

           输入格式:

                         测试数据有多组,处理到文件尾。对于每组测试,输入两个整数,表示年份year和月份month。

           输出格式:

                         对于每组测试,输出对应年月的天数。

 

            考试时的代码:

#include<stdio.h>
int main()
{
    int year=0,month=0;
    do
    {
    scanf("%d %d",&year,&month);
    if((year%4==0&&year%100!=0)||year%400==0)
    {
        if(month==2)
        {
            printf("29\n",month);
        }else if(month==4||month==6||month==9||month==11)
        {
            printf("30\n");
        }else
        {
            printf("31\n");
        }
    }else
    {
        if(month==2)
        {
            printf("28\n",month);
        }else if(month==4||month==6||month==9||month==11)
        {
            printf("30\n");
        }else
        {
            printf("31\n");
        }
    }
    }while(month>0&&month<=12);
        return 0;
}

         可以发现该代码未能完成题目中读取到文件尾的要求,加入while(scanf()!=EOF)就能完成题目要求。

         改后代码:

#include<stdio.h>
int main()
{
    int year=0,month=0;
    while(scanf("%d %d",&year,&month)!=EOF)
    {
        if((year%4==0&&year%100!=0)||year%400==0)
        {
            if(month==2)
            {
                printf("29\n",month);
            }else if(month==4||month==6||month==9||month==11)
            {
                printf("30\n");
            }else
            {
                printf("31\n");
            }
        }else
        {
            if(month==2)
            {
                printf("28\n",month);
            }else if(month==4||month==6||month==9||month==11)
            {
                printf("30\n");
            }else
            {
                printf("31\n");
            }
        }
    }
        return 0;
}

R7-6 打印沙漏

         题目:

                       当n=5时,沙漏图形如输出样例所示。请观察并明确沙漏图形的规律。要求输入一个整数n,输出满足规律的沙漏图形。

          输入:

                      测试数据有多组,处理到文件尾。每组测试输入一个整数n(1<n<20)。

          输出:

                      对于每组测试,输出满足规律的沙漏图形。

 

            考试时代码:

#include<stdio.h>
int main()
{
  int n=2,f=0,i=0,a=0,t=0;
    while(n>1&&n<20)
  {
    scanf("%d",&n);
        if(n<=1||n>=20)
        {
            break;
        }
    f=2*n-1;
    for(i=1;i<=n;i++)
    {
        for(t=1;t<=i;t++)
        {
            if(i!=n)
            printf(" ");
        }
        for(a=1;a<=f-(i-1)*2;a++)
        {
            if(i!=n)
            {
            printf("*");
            }
        }
        if(i!=n)
            printf("\n");
    }
    for(i=n;i>=1;i--)
    {
        for(t=i;t>=1;t--)
        {
            printf(" ");
        }
        for(a=f-(i-1)*2;a>=1;a--)
        {
            printf("*");
        }
        printf("\n");
    }
  }
    return 0;
}

            可以发现该代码不能读取到文件尾,因此也需要同上一题一样加上while(scanf()!=EOF),且该代码输出图形为:

 

 

            观察可发现:该图形每行都多了一个空格

            因此代码可以改成:

#include<stdio.h>
int main()
{
  int n=2,f=0,i=0,a=0,t=0;
  while(scanf("%d",&n)!=EOF)
  {
        if(n<=1||n>=20)
        {
            break;
        }
        f=2*n-1;
        for(i=1;i<=n;i++)
        {
        for(t=1;t<i;t++)
        {
            if(i!=n)
            printf(" ");
        }
        for(a=1;a<=f-(i-1)*2;a++)
        {
            if(i!=n)
            {
            printf("*");
            }
        }
        if(i!=n)
        { 
            printf("\n");
        } 
    }
    for(i=n;i>=1;i--)
    {
        for(t=i;t>1;t--)
        {
            printf(" ");
        }
        for(a=f-(i-1)*2;a>=1;a--)
        {
            printf("*");
        }
        printf("\n");
    }
  }
    return 0;
}

R7-5 位运算应用

         题目:

                       现有96个端口状态,用3个无符号整型ua(95~64),ub(63~32),uc(31~0)组合起来的96位二进制数来表示,每位二进制数的1、0表示其正常和故障状态。

                       输入一个tag位,将tag位上二进制数置1.

                       tag位表示其在96位中所处的位数(在96位中从低向高从0至95)

          输入格式:

                       第一行输入三个无符号整数,表示ua,ub,uc

                       第二行输入一个整数tag。

 

          输出格式:

                       若tag值不在0到95之间,则输出Error,否则输出转换后的ua,ub,uc

 

           考试时没太看懂题目,考完之后写了一下代码

#include<bits/stdc++.h>
int main()
{
    unsigned int ua,ub,uc;
    int tag;
    
    scanf("%u %u %u",&ua,&ub,&uc);
    scanf("%d",&tag);
    if(tag<0||tag>95)
    {
    printf("Error");
    }
    else
    {
    switch(tag/32)
    {
        case 0:uc|=(unsigned int)1<<tag%32;break; 
        case 1:ub|=(unsigned int)1<<tag%32;break; 
        case 2:ua|=(unsigned int)1<<tag%32;break; 
    }
    printf("ua=%u,ub=%u,uc=%u",ua,ub,uc);
    }
    return 0;
 } 

 

推荐阅读