此作业的要求参见https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11185
问题1.熟悉命令行和控制台/标准输入和标准输出
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,
请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
a.exe < b.txt > c.txt
解答:
数据流图如下图所示,这条控制台命令的作用是,首先用a程序获取b文件中的数据,在经过处理之后,再把处理之后数据输出到c文件中。
问题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 { 4 int a, b, c; 5 scanf("a=%d b=%d c=%d", &a, &b, &c); 6 printf("%d %d %d ", a, b, c); 7 return 0; 8 }
控制台运行截图如下
问题3:熟悉 测试用例
(1)请在网站 [https://pintia.cn/]注册账号。(0分)
(2)在题目集 PAT (Basic Level) Practice (中文) 中任选3道题目完成。截图如下,要求包括1.红色对号、2.标号、3.用户名(此例中为 Young)。(30分)
(3)代码解读 (20分)
发表博客,介绍上述3个题目代码中重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。
解答:(2)PAT截图如下
解答:(3)代码解读
①1001害死人不偿命的(3n+1)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。
对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
重难点分析:我认为本题难点在于,在对n进行处理之后,要注意应该更新n的数值,不然会一直对n的初始值进行处理。
重点代码片段如下
1 #include "stdio.h" 2 int main() 3 { 4 int n; 5 int k = 0; 6 scanf("%d", &n); 7 while (n != 1) 8 { 9 if (n % 2 == 0) //当n为偶数时 10 { 11 n = n / 2; 12 k++; 13 } 14 else //当n为奇数时 15 { 16 n = n * 3 + 1; 17 n = n / 2; 18 k++; 19 } 20 } 21 printf("%d ", k); 22 return 0; 23 }
执行效果截图如下
②1004 成绩排名
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
其中姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
重难点分析:本体重点我认为在于数组的应用,一维字符数组无法存储姓名学号这两种字符串数据,应该使用二维数组来解决这个问题。
重点代码片段如下
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int main() 5 { 6 int a; 7 char name[200][11]; 8 char number[200][11]; 9 int grade[200]; 10 int i = 0, k = 0; 11 int max = 0,min = 0; 12 scanf("%d", &a); 13 for (i = 0; i < a; i++) 14 { 15 scanf("%s %s %d",name[i],number[i],&grade[i]); //输入学生信息 16 17 } 18 for (k = 0; k < a; k++) 19 { 20 if (grade[k] > grade[max]) //记录分数最高学生 21 max = k; 22 if (grade[k] < grade[min]) //记录分数最低学生 23 min = k; 24 } 25 printf("%s %s ", name[max], number[max]); 26 printf("%s %s ", name[min], number[min]); 27 28 return 0; 29 }
执行效果截图如下
③1006 换个格式输出整数
让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),换个格式来输出任一个不超过 3 位的正整数。
例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
重难点分析:我认为本题重难点在于获取输入数据的个位十位和百位的数字。
重点代码片段如下
1 #include "stdio.h" 2 int main() 3 { 4 int a,i,b,c,k,j,d; 5 scanf("%d", &a); 6 b = a / 100; //判断数字是否为三位数 7 if(b!=0) //当输入数据为三位数时 8 { 9 for (i = 0; i < b; i++) 10 { 11 printf("B"); 12 } 13 c =( a % 100)/10; 14 for (k = 0; k < c; k++) 15 { 16 printf("S"); 17 } 18 d = a % 10; 19 for (j = 1; j <= d; j++) 20 { 21 printf("%d", j); 22 } 23 } 24 else //当输入数据为两位数时 25 { 26 c = a / 10; 27 for (k = 0; k < c; k++) 28 { 29 printf("S"); 30 } 31 d = a % 10; 32 for (j = 1; j <= d; j++) 33 { 34 printf("%d", j); 35 } 36 } 37 }
执行效果截图如下
问题四:PSP(8分)
在同一篇博客中,参照教材第35页表2-2和表2-3,为上述3个题目制作PSP阶段表格。
PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。
要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求2中每项时间花费的差距,分析原因。
解答:
时间差原因:
1:C语言基础知识遗忘,基本语法在编程过程当中也会出错。
2:编程能力不足,编程基础太差。
3:编译器在运行过程当中出现了许多问题,比如vs中"scanf is unsafe"的问题,通过查资料和询问同学,得到了两种解决办法,在代码的最顶行写入#
可以让之后使用scanf时不出现警告。还可以使用scanf_s,控制读取字符的数量这种方法让问题得到解决。