此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/5523
1.1假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
a.exe < b.txt > c.txt
答:该命令是将b文件中的内容输入到a程序中,a程序运行处理后将所得结果输出保存到c文件中。数据流图如下:
1.2请用C言开发应用程序d.exe,从控制台指令读入命令行参数,并在控制台分别打印出a、b、c的值。运行效果形如下面的示例(6分)
d.exe a=1 b=2 c=3
1
2
3
d.exe a=11 b=22 c=33
11
22
33
代码如下:
1 #include<stdio.h>
2 int main(){
3 int a,b,c;
4 scanf("a=%d b=%d c=%d",&a,&b,&c);
5 printf("%d
%d
%d
",a,b,c);
6 return 0;
7 }
运行截图如下:
2.1请在网站 [https://pintia.cn/]注册账号。(0分)
答:已注册。
2.2在题目集 PAT (Basic Level) Practice (中文)中任选3道题目完成。截图如下,要求包括1.红色对号、2.标号、3.用户名(此例中为 Young)。(30分)
2.3代码解读。(20分)
(1)1001 卡拉兹(Callatz)猜想:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 ( 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
本题目比较简单,格式要求也不是很严格,完成的比较顺利。
代码如下:
int n=0,i; scanf("%d",&n); for(i=0;n!=1;i++){ if(n%2==0){ n=n/2; } else{ n=(3*n+1)/2; } } printf("%d",i);
运行截图如下:
(2)1006 让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
本题目难度也不大,只要注意输出的要求和格式就可以了,其中的个位按格式输出时要注意从1开始,这一点与前两个for循环有区别。
代码如下
int n=0,i,bai,shi,ge; while(scanf("%d",&n)!=EOF){ bai=n/100; shi=n/10%10; ge=n%10; for(i=0;i<bai;i++){ printf("B"); } for(i=0;i<shi;i++){ printf("S"); } for(i=1;i<=ge;i++){ printf("%d",i); } }
运行截图如下:
(3)1023 给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最小的数就是 10015558。现给定数字,请编写程序输出能够组成的最小的数。
本题目比较麻烦,要注意的点比较多。首先要求给定的数必须全部使用,而且0不能做首位,在保证这两点的基础上要组成最小数。
代码如下:
int a[10],i,b[50],j=1; for(i=0;i<10;i++){ scanf("%d",&a[i]); } for(i=1;i<10;i++){//找一个除0以外最小的数做最高位 if(a[i]!=0){ b[0]=i; a[i]--; break; } } for(i=0;i<10;i++){//把数字按大小顺序和个数写到b数组中 while(a[i]){ b[j]=i; j++; a[i]--; } } for(i=0;i<j;i++){ printf("%d",b[i]); } return 0;
运行截图如下:
2.4在同一篇博客中,参照教材第35页表2-2和表2-3,为上述3个题目制作PSP阶段表格。PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。
PSP阶段 | 预计花费时间 | 实际花费时间 | 时间差 | 原因 |
1001编程 | 10min | 6min | 4min |
原以为一段时间没有编写c语言程序 会比较生疏,但实际上还比较顺利 |
1001测试 | 1min | 1min | 0min | 输入格式没有特定的要求,比较简单 |
1006编程 | 8min | 10min | 2min |
第一次编程时没注意到个位是 从1开始,for循环中i的初值写错了 |
1006测试 | 1min | 1min | 0min | 只需输入一个三位数即可 |
1023编程 | 15min | 17min | 2min | 其中需要注意的问题比较多,考虑的要全面一些 |
1023测试 | 1min | 3min | 2min |
输入的格式比较麻烦,每个数中间要有空格 ,而且要数好自己输入的数字的个数 |