第一题:成绩统计涉及输入输出,当时写的代码(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); } }
成功过验。
总结:学习程度还是比较低,和其他同学有挺大差距,继续努力吧,有些漏洞多写几次相同类型的题目可以形成思路掌握方法。多问多花时间多看看视频,下次爬起来。
写题时要把握好好时间,一定要每道题都去思考试验。