20190905-3 命令行和控制台编程
作业的要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/5523]
1.熟悉命令行和控制台
假设在当前目录下存在应用程序 a.exe 和 文件文件 b.txt,
请以数据流图并辅助以文字说明下述控制台命令的作用是什么。(5分)
a.exe < b.txt > c.txt
答:由b.txt文本输入重定向到应用程序a.exe程序中,再由a.exe程序运行出结果输出重定向到c.txt文本里。
请用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 a; int b; int c; scanf("a=%d b=%d c=%d", &a, &b, &c); printf("%d\n", a); printf("%d\n", b); printf("%d\n", c); return 0; }
2.熟悉测试用例
卡拉兹(Callatz)猜想:
对任何一个正整数 nnn,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1)(3n+1)(3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1n=1n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1)(3n+1)(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 nnn,简单地数一下,需要多少步(砍几下)才能得到 n=1n=1n=1?
输入格式:
每个测试输入包含 1 个测试用例,即给出正整数 nnn 的值。
输出格式:
输出从 nnn 计算到 1 需要的步数。
输入样例:
3
输出样例:
5
重要代码如下:
while(n>1){ if(n%2==0) n=n/2; else n=(3*n+1)/2; count++; }
本题没有难度,按照题目一步步来做就可以了,判断是否是偶数:如果一个数对2取余为零则为偶数。
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 1。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
for(i=0;i<longn;i++) //把各个数字相加 sum+=n[i]-'0'; for(j=0;sum!=0;j++){ shu[j]=sum%10; sum=sum/10; } while(j>1){ j--; switch(shu[j]){ case 0:printf("ling ");break; case 1:printf("yi ");break; case 2:printf("er ");break; case 3:printf("san ");break; case 4:printf("si ");break; case 5:printf("wu ");break; case 6:printf("liu ");break; case 7:printf("qi ");break; case 8:printf("ba ");break; case 9:printf("jiu ");break; } } //最后一次不能有空格 j--; switch(shu[j]){ case 0:printf("ling");break; case 1:printf("yi");break; case 2:printf("er");break; case 3:printf("san");break; case 4:printf("si");break; case 5:printf("wu");break; case 6:printf("liu");break; case 7:printf("qi");break; case 8:printf("ba");break; case 9:printf("jiu");break; }
本题需要注意是最后一个数变成汉字后,后面不能有空格,当时我就写了一个switch,提交提示格式错误,后来上参考了别人的代码,才明白没有考虑最后一个汉字后面不能有空格,还有就是忘记写终止条件,导致死循环(如下图)。
B
来表示“百”、字母 S
表示“十”,用 12...n
来表示不为零的个位数字 n
(<),换个格式来输出任一个不超过 3 位的正整数。例如 234
应该被输出为 BBSSS1234
,因为它有 2 个“百”、3 个“十”、以及个位的 4。输入格式:
每个测试输入包含 1 个测试用例,给出正整数 n(<)。
输出格式:
每个测试用例的输出占一行,用规定的格式输出 n。
输入样例 1:
234
输出样例 1:
BBSSS1234
输入样例 2:
23
输出样例 2:
SS123
重要代码如下:
h=n/100; m=n%10; n=n/10%10; for(i=1;i<=h;i++) printf("B"); for(i=1;i<=n;i++) printf("S"); for(i=1;i<=m;i++) printf("%d",i);
当时第一题写的就是这道题,感觉不难,可是耗时却是最长的,主要是我考虑的情况太复杂,把输入的数分成三种情况,大于9小于100,大于99小于1000,小于10,这三种情况分别写出来,最后提交只通过了一部分用例,还有一点就是我还把零考虑进去了,没有读清题目。