今天在学习《C程序设计语言》第一章时,做了其中的习题,在参阅过答案后对其中部分习题有了一些感悟,遂书于此\(^o^)/~
【1-9】 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
首先说一下思路: 刚刚看到题目的时候,我的想法是:利用getchar来获得输入,检验到空格之后,若下一字符仍为空格则不输出,当其下一个不是空格时,再进行输出。但是利用getchar输入,得到下一个字符暂时还不知道怎么实现(笑 。 于是换一个想法,既然检测后面的字符不行,可以转为①检测输出字符前面的字符,如果前面的字符不是空格,那么输出空格。在这里能得到的启示就是当一种思路解决不了的时候,试试将这种思路反向实现.
之后在实现之后参阅了答案,还有这样几种思路②利用标志space,未出现空格时,space = 0,当出现空格且space == 0时输出空格,并该space = 1; ③ 当出现第一个空格之后,利用循环,对于出现在其后的空格不进行操作。
实际上,第一种思路和第二种思路本质相同,都是利用了一个标志,标志的改变相当于开关来控制是否进行输出。
当然,做这个题最让我无语的地方就是= =!第一次写的时候居然把c == ' '给写成了'\0' 简直了!太久没接触C(以前底子也很差)就是这样的结果∑q|゚Д゚|p 非好好学习不可了(严肃脸
【1-12】编写一个程序,以每行一个单词的形式打印其输入
刚看到这个题目的时候我觉得,真是异常的简单啊,当遇到'\n', ' ', '\t'的时候直接换行不就完了,于是,我写出了以下的程序
#include<stdio.h>
main()
{
int c;
while((c = getchar()) != EOF)
{
if(c == '\n' || c == ' ' || c == '\t')
putchar('\n');
putchar(c);
}
}
结果,跑出来的这啥玩意
∑q|゚Д゚|p !?
为啥空格没消掉还在最后换了两行?
仔细一想,似乎判断,换行之后直接输出了
∑q|゚Д゚|p ,于是在putchar(c)前面加上了else整个程序就像话了。
【1-13】编写一个程序,打印输入中单词长度的直方图。(A vertical orientation is more challenging.)
读到题目的时候觉得打印水平方向的确实很简单,思路是:1.用数组来储存不同长度字母的个数 2.利用getchar()来获取输入流 3,得到输入之后判断是否为单词结束符,不是->标识+1,是->数组对应数+1 4.输出的时候直接有多少输出多少*然后换行就ok
至于垂直的直方图,其实也不难 1. getchar(),存入数组 2. 找出最大值max 3. i = max,用两层循环a i--循环 b 数组循环, a循环一次i自减一次,数组对于数小于i输出空,否则输出*
#include<stdio.h>
void main()
{
int i = 0, j, max;
int num[10] = {0};
while((j = getchar()) != EOF)
{
if(j == ' ' || j == '\n' || j == '\t')
{
++num[i];
i = 0;
}
else
++i;
} //输入字符,并将每个长度存入数组
for(i = 0; i < 10; i++)
printf("%d ", num[i]);
printf("\n");
max = num[1];
for(i = 2; i < 10; i++)
{
if(num[i] > max)
max = num[i];
}
for(i = max; i > 0; i--)
{
printf("%2d|", i);
for(j = 1; j < 10; j++)
{
if(num[j] < i)
printf(" ");
else
printf(" *");
}
printf("\n");
}
printf("_________________________\n");
printf(" 1 2 3 4 5 6 7 8 9 \n");
}
唯一就是最后的两排……为了格式的好看(强迫症) 实验了半天囧;