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.熟悉测试用例

 

                                                                                                1001 害死人不偿命的(3n+1)猜想 (15 分)
 

卡拉兹(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取余为零则为偶数。

 

                                                                                                     1002 写出这个数 (20 分)
 

读入一个正整数 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,提交提示格式错误,后来上参考了别人的代码,才明白没有考虑最后一个汉字后面不能有空格,还有就是忘记写终止条件,导致死循环(如下图)。

 

 

                                                                                                   1006 换个格式输出整数 (15 分)
 让我们用字母 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,这三种情况分别写出来,最后提交只通过了一部分用例,还有一点就是我还把零考虑进去了,没有读清题目。


 

 

posted @ 2019-09-09 20:47  萍2樱释  阅读(174)  评论(1编辑  收藏  举报