学习-《C程序设计语言》第一章

      今天在学习《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");
	 
}
唯一就是最后的两排……为了格式的好看(强迫症) 实验了半天囧;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值