《C程序设计语言(K&R)》习题记录 第一章 引言

第一章 引言

练习1-9:编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替

  1. 很自然的,我们希望首先输入一个字符,然后判断它是否是空格,如果是,那么继续输入下一个字符并且判断其是否为空格。因为考虑可能有多个空格,那么需要一个循环,循环的条件设置为“首先输入为空格”。这样一来,在循环当中输入,每一个空格都用后面的字符覆盖,直到遇到一个非空格的字符,输出并且退出循环。如果开始的字符并非空格,输出即可。从而有以下代码:
/*复制输入,将多个空格转换成一个空格*/
#include<stdio.h>
int main(void)
{
	char ch;
	while((ch=getchar())!=EOF)
	{
		if(ch==' ')
		{
			printf("%c",ch);
			while(ch==' ')
				ch=getchar();
			printf("%c",ch);
		}
		else 
			printf("%c",ch);
	}
	return 0;
 } 
  1. 另外一个想法是,设置两个变量,一个负责实时的输入,另一个则负责记录上一个字符。如果输入了空格,那么将上一个字符与空格比较,如果不是,则输出。无论是不是,都需要将这个值赋值给上一个(空格则不影响),且继续开始循环。代码如下:
#include<stdio.h>
int main()
{
	int ch,lastc;
	lastc='a';
	while((ch=getchar())!=EOF)
	{
		if(ch!=' ')
			putchar(ch);
		if(ch==' ')
			if(lastc!=' ')
				putchar(ch);
		lastc=ch;
	}
	return 0;
}

练习1-1x:关于字符输入计数的相关问题
1、统计单词数量
想法:将单词视为连续的字母(只有一个字母并不无影响)。从而可以使用while循环来进行不断地输入。如果遇到了非字母的字符,循环结束,此时计数变量递增即可。这种想法和书上的不一样,但是是可行的。代码如下:

/*统计单词数*/ 
#include<stdio.h>
int main(void)
{
	int ch,num;
	while((ch=getchar())!=EOF)
	{
		if(ch!=' '&&ch!='\n'&&ch!='\t')
		{
			while((ch=getchar())!=' '&&(ch!='\n')&&ch!='\t')
					;
			++num;
		}
	}
	printf("%d",num);
	return 0;
}

2、以每行一个单词的形式打印输入
事实上这只需要在前面计数程序的基础上做一点点改动即可:在每次while循环前和循环内部打印输入,在循环结束时打印换行符即可。代码如下:

/*以每行一个单词的形式打印输入*/
#include<stdio.h>
int main()
{
	int ch;
	while((ch=getchar())!=EOF)
	{
		if(ch!=' '&&ch!='\n'&&ch!='\t')
		{
			putchar(ch);
			while((ch=getchar())!=' '&&(ch!='\n')&&ch!='\t')
					putchar(ch);
			putchar('\n');
		}
	}
	
	return 0;
 }

3、打印输入中单词长度的直方图

不太理解最终需要达到的效果······那么就按照我的想法去做了!

  • 效果1:在每一行打印一个单词,同时在固定的字段宽度之后打印星号,星号数等于单词长度。代码如下:
#include<stdio.h>
#define length 30 
int main()
{
	int ch,m,n,size;
	//m,n用于循环,size为单词长度 
	m=n=size=0; 
	while((ch=getchar())!=EOF)
	{
		if(ch!=' '&&ch!='\n'&&ch!='\t')
		{
			putchar(ch);
			++size;
			while((ch=getchar())!=' '&&(ch!='\n')&&ch!='\t')
					{
						putchar(ch);	
						++size;
					}
			//printf("%d",size);//测试输出 
			for(m=0;m<length-size;m++)
				putchar(' ');
			putchar(':');
			for(n=0;n<size;n++)
				putchar('*');
			putchar('\n');
		
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值