此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/5523]
1.熟悉命令行和控制台
假设在当前目录下存在应用程序a.exe和 文件文件b.txt,
请以数据流图并辅助以文字说明下述控制台命令的作用是
a.exe < b.txt > c.txt
答:“<”将输入重定向到文本b中,即将文本b中的内容作为程序a的输入,“>”将输出重定向到文本c中,即程序a经过运行得到的结果,被保存到文本c中。
数据流图如下:
请用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
答:代码:
#include<stdio.h> int main( int n,char *arrg[]) { int a,b,c; sscanf(arrg[1],"a=%d",&a); sscanf(arrg[2],"b=%d",&b); sscanf(arrg[3],"c=%d",&c); printf("%d\n\n",a); printf("%d\n\n",b); printf("%d",c); return 0; }
截图:
2.熟悉、测试用例
(2)完成题目截图
(3)1001害死人不偿命的(3n+1)猜想 要求:对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1,
输入一个正整数,计算需要多少步(砍几下)才能得到 n=1?
重难点:判断给定整数是奇数还是偶数;循环结束的条件
重要代码:
int sum=0; while(n!=1) { if(n%2==0) { n/=2; sum++; } else { n=n*3+1; n/=2; sum++; }
}
执行效果截图
1006换个格式输出整数 要求:让我们用字母 B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<10),
换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。
重难点:如何得到百位数字、十位数字和个位数字
重要代码:
int a=num%10; int b=(num/10)%10; int c=num/100; if(c!=0) for(int i=1;i<=c;i++) putchar('B'); if(b!=0) for(int i=1;i<=b;i++) putchar('S'); if(a!=0) for(int i=1;i<=a;i++) printf("%d",i);
执行效果截图:
1021个位数统计 要求:输入一个不超过1000位的正整数,统计里面个位数字出现的次数,将次数非0的按照“D:M”格式输出
重难点:如何存储接近1000位的正整数
重要代码:
char a[1001]; scanf("%s",a); int num[10],k; for(int i=0;i<=9;i++) num[i]=0; int l=strlen(a); for(int i=0;i<l;++i) { k=a[i]-48; num[k]++; } for(int i=0;i<10;++i) { if(num[i]!=0) printf("%d:%d\n",i,num[i]); }
执行效果截图:
(4)PSP
出现时间差的原因:
(1)1001害死人不偿命的(3n+1)猜想编码:长时间没有用c语言编程,对于它的输入输出还有一些基本的格式有很多遗忘,花时间补了一
些这方面的知识。
(2)1006换个格式输出整数编码:在输出字母这里,开始使用的printf,但忘记给字母加分号,编译时出现了错误,当时没想到加分号,又改成了putchar,还是基础知识有点薄弱。
(3)1021个位数统计编码:在编码时,我开始定义的变量是int类型,提交时提示部分错误,又改成了long类型,还是不行,后来思考了一下,对于位数极多的整数,还想统计每一个个位数字出现的个数,只能定义成字符数组的形式,用时再把字符转成整数,还是编程的经验不太够,思考不全面。