Java教程

阶段一上机报告、错题修改

本文主要是介绍阶段一上机报告、错题修改,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
 

第一题:成绩统计涉及输入输出,当时写的代码(No.1)其实运行下来看起来和样例一致,但pta上就出现了“格式错误”的字样;我看了半天,从简化的代码变成这种长的眼烦的码,都不知道格式错在哪里;

           问题在于 printf 的那些数字格式,把空格和数字本身的长度加起来再输出,(No.2)才能得到符合pta 要求的答案,其实光用眼睛看起来真的一样。

 

          

-----------------------------------------(手动分割线)--------------------------------------------------------------------------------------------------------------------

 

 R7-4 求某月的天数 (20 分)  

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

输入格式:

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

输出格式:

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

输入样例:

2020 2
2020 4
 

输出样例:

29
30

 这是我测试时写的代码,在我的设想里,“1、3、5、7、8、10、12”都是31天/月;“4、6、9、11”为30天/月;2月比较特殊,闰年29天,非闰年28天;

#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);//a为年,b为月 

    if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
        printf("31");
    }
     if(b==4||b==6||b==9||b==11){
        printf("30");
    }if(b==2){
        if(a%4!=0){printf("28");
        }
        else
        printf("29");
    }
    
    
    
}
    

而根据我上述代码来看,只能运行一次,我思考 “测试数据有多组,处理到文件尾“    加上while(scanf(”%d %d “,&a,&b)!=EOF) 后会有何变化,结果可以多行输出但显示答案错误。

 

 所以又是哪里出了问题呢?仔细看题目对闰年的定义,发现自己的代码中对闰年的条件没写对,再进行改进一下,才正确了。代码如下

#include<stdio.h>
int main()
{
    int a,b;
    //a为年,b为月 
    while(scanf("%d %d",&a,&b)!=EOF) {
    
    if(b==1||b==3||b==5||b==7||b==8||b==10||b==12){
        printf("31\n");
    }
     if(b==4||b==6||b==9||b==11){
        printf("30\n");
    }if(b==2){
        if(a%4==0&&a%100!=0||a%400==0){printf("29\n");
        }
        else
        printf("28\n");
    }
}
    
    
}
    

 

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

同样需要用到while(scanf   !=EOF)的题目是测试中的沙漏图形题如下

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

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

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

输入样例:
5
输出样例:
*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********

我写的代码其实主题是正确的,但是在测试过程中一直是“ 答案错误”提示,显然我有没有考虑输入终止的问题,以下是原来错误的代码,以及修改后正确的代码,只需要加上 !=EOF 终止即可

#include<stdio.h>

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF&&n<20&&n>1) 
{
        int a,j,i;
    for(a=1;a<=n;a++) 
    {
        for(i=1;i<a;i++){
            printf(" ");
        }
        for(j=0;j<2*n-2*i+1;j++){
            printf("*");
        }printf("\n");
     } 
     
    for(a=0;a<n-1;a++){
        for(i=1;i<n-a-1;i++){
            printf(" ");
        }
        for(j=0;j<=2*n-2*i;j++){
            printf("*");
        }printf("\n");
    }
}
}
    

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

相似图形补题

7-8 交替字符倒三角形 (20 分)
根据读入的高,画出一个ST字符交替的倒三角形。

输入格式:
输入数据含有不超过50个正整数n(1≤n≤30)。 以键盘输入^Z或遇到文件结束符时结束数据输入。

输出格式:
输出以n为高的ST字符交替的倒三角形,画出每个三角形时都应另起一行。

输入样例:
3 10
结尾无空行
输出样例:
STSTS
 STS
  S
STSTSTSTSTSTSTSTSTS
 STSTSTSTSTSTSTSTS
  STSTSTSTSTSTSTS
   STSTSTSTSTSTS
    STSTSTSTSTS
     STSTSTSTS
      STSTSTS
       STSTS
        STS
         S

上述题目是在补题集的最后一题中输出图形字符,依然假设输入数字n有n行,设 i 为每行所在的行数 i 起始为1 最高不超过n行,设 j 为每行的空格数,起始为0格,小于 i-1 格;设x为字符数,当字符为偶数时输出T,单数时输出S,代码如下

#include<stdio.h>
int main()
{
    int n;
    int i,j,x;
    while(scanf("%d",&n)!=EOF&&1<=n&&n<=30){
        for(i=1;i<=n;i++)//行数
        {
            for (j=0;j<i-1;j++)//空格数
            {
                printf(" ");
             } 
            for(x=1;x<=2*n-2*i+1;x++){
                if(x%2==0){
//一行有几个字符,当字符为双数上输出T,单数位输出S 
                    printf("T");
                }
                else printf("S");
            }
            printf("\n");
         } 
        
    }
    
}
    

倒三角就成功过验了。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

7-5 位运算应用 (20 分)

现有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

输入样例:

1 2 3
-2

输出样例:

Error

输入样例:

1 2 3
10

输出样例:

ua=1,ub=2,uc=1027

看到这题,我意识到我知识点又短缺了,于是当时没写,事后再去翻看了慕课李戈的位运算视频

按照题目给的信息,我们要在tag位上二进制数置1,当我们把tag输入为10的时候,意味着需要指定右边起数第10位上的数置1,此时试写代码

int main()
{
    unsigned int ua,ub,uc;
    scanf("%u %u %u",&ua,&ub,&uc);
    int tag;
    scanf("%d",&tag);
    if(tag<0||tag>95){
        printf("Error");
    }
    else {
    if(tag>=64&&tag<=95){
        ua|=1<<(tag-64); 
    }
    else if(tag<=63&&tag>=32){
        ub|=1<<(tag-32);
    }
    else uc|=1<<tag;
    printf("ua=%u,ub=%u,uc=%u",ua,ub,uc);
}
}

成功过验。

 

 

 

总结:学习程度还是比较低,和其他同学有挺大差距,继续努力吧,有些漏洞多写几次相同类型的题目可以形成思路掌握方法。多问多花时间多看看视频,下次爬起来。

写题时要把握好好时间,一定要每道题都去思考试验。

 

这篇关于阶段一上机报告、错题修改的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!