C程序设计笔记——导言

变量与算数表达式

C=(5/9)(F-32)华氏温度与摄氏温度对照表:
int main(int argc, char* argv[])
{
	int fahr,celsius;
	int lower,upper,step;

	lower=0;
	upper=300;
	step=20;

	fahr=lower;
	for(lower;fahr<=upper;fahr+=step)
	{
		celsius=5*(fahr-32)/9;
		printf("%d\t%d\n",fahr,celsius);
	}
	return 0;
}

运行结果:

0       -17
20      -6
40      4
60      15
80      26
100     37
120     48
140     60
160     71
180     82
200     93
220     104
240     115
260     126
280     137
300     148
celsius=5*(fahr-32)/9;

不能写成5/9,整数除法操作将执行舍位,结果中的小数部分都被舍掉,结果是0。

int main(int argc, char* argv[])
{
	float fahr,celsius;
	int lower,upper,step;

	lower=0;
	upper=300;
	step=20;

	fahr=lower;
	for(lower;fahr<=upper;fahr+=step)
	{
		celsius=(5.0/9.0)*(fahr-32);
		printf("%3.0f %6.1f\n",fahr,celsius);
	}
	return 0;
}
运行结果:

  0  -17.8
 20   -6.7
 40    4.4
 60   15.6
 80   26.7
100   37.8
120   48.9
140   60.0
160   71.1
180   82.2
200   93.3
220  104.4
240  115.6
260  126.7
280  137.8
300  148.9
%d       按照十进制整型数打印

%6d     按照十进制整型数打印,至少6个字符宽

%f        按照浮点数打印

%6f      按照浮点数打印,至少6个字符宽

%.2f    按照浮点数打印,小数点后有两位小数,但宽度没有限制

%6.2f  按照浮点数打印,至少6个字符宽,小数点后有两位小数

int main(int argc, char* argv[])
{
	int fahr;
	for(fahr=0;fahr<=300;fahr+=20)
	{
		printf("%3d %6.1f\n",fahr,(5.0/9.0)*(fahr-32));
	}
	return 0;
}

在程序中300,20等类似的“幻数”,并不是一个好习惯,无法向阅读程序的人提供什么信息,应当赋予他们有意义的名字。

#define LOWER   0
#define UPPER	300
#define STEP    20

int main(int argc, char* argv[])
{
	int fahr;
	for(fahr=LOWER;fahr<=UPPER;fahr+=STEP)
	{
		printf("%3d %6.1f\n",fahr,(5.0/9.0)*(fahr-32));
	}
	return 0;
}

字符输入/输出

1.文件复制

把输入一次一个字符的复制到输出,基本思路如下:

读一个字符

while(该字符不是文件结束指示符)

输出刚读入的字符

读下一个字符

int main(int argc, char* argv[])
{
	int c;
	c=getchar();
	while(c!=EOF)
	{
		putchar(c);
		c=getchar();
	}
	return 0;
}
需要解决如何区分文件中有效数据与输入结束符的问题。C语言采取的方法是:在没有输入时,getchar()函数返回一个特殊值,这个特殊值与任何实际字符都不同,这个值称为EOF(enf of file,文件结束符),我们在声明变量c的时候,必须让他大到足以存放getchar函数返回的任何值。这里不把c声明为char类型,是因为他必须足够大,除了能够存储任何可能的字符外还要能存储文件结束符EOF。因此,我们将c声明为int类型。EOF定义在头文件<stdio.h>中,是一个整数值。
2.字符计数

int main(int argc, char* argv[])
{
        double nc;
	for(nc=0;getchar()!=EOF;nc++)
	{
		NULL;
	}
	printf("%.0f\n",nc);
	return 0;
}
int main(int argc, char* argv[])
{        
        double nc;
	for(nc=0;getchar()!=EOF;nc++)
	{
		NULL;
	}
	printf("%.0f\n",nc);
	return 0;
}
运行结果:

sdf
asd^Z
^Z
7
Press any key to continue
说明回车也是一个char字符
3.行计数

int main(int argc, char* argv[])
{
        int c,nl;
	
	nl=0;
	while((c=getchar())!=EOF)
	{
		if(c=='\n')
		{
			nl++;
		}
	}
	printf("%d\n",nl);
	return 0;
}


单引号中的字符表示一个整型值,改值等于此字符在机器字符集中对应的数值,我们称之为字符常量。但是,他只不过是小的整型数的另一种写法而已。例如:‘A’是一个字符常量;在ASCII字符集中的值为65(即字符A的内部表示值为65)。但是,用‘A’要比用65好,因为‘A’的意义更清楚,且与特定的字符集没有关系。
字符串常量中使用的转义字符序列也是合法的字符常量,比如,'\n'代表换行符的值,在ASCII字符集中的值为10。'\n'是单个字符,在表达式中不过是一个整型数而已。

4.单词计数

统计行数、单词数与字符数

#define IN  1  /*在单词内*/
#define OUT 0  /*在单词外*/

int main(int argc, char* argv[])
{
	int c,nl,nw,nc,state;

	state=OUT;
	nl=nw=nc=0;
	while((c=getchar())!=EOF)
	{
		++nc;
		if(c=='\n')
		{
			++nl;
		}
		if(c==' '||c=='\n'||c=='\t')
		{
			state=OUT;
		}
		else if(state==OUT)//第一个单词的字一个字符
		{
			state=IN;
			++nw;
		}
	}
	printf("%d %d %d\n",nl,nw,nc);
	return 0;
}
当遇到单词的第一个字符,他就作为一个新单词加以统计。这里用符号常量IN和OUT,而没有用0和1,这样的程序更易读。
5.数组

统计各个数字、空白符和其他字符出现的次数

int main(int argc, char* argv[])
{      
        int c,i,nwhite,nother;
	int ndigit[10];

	nwhite=nother=0;
	for(i=0;i<10;i++)
	{
		ndigit[i]=0;
	}

	while((c=getchar())!=EOF)
	{
		if(c>='0'&&c<='9')
		{
			++ndigit[c-'0'];
		}
		else if(c==' '||c=='\n'||c=='\t')
		{
			++nwhite;
		}
		else
		{
			++nother;
		}
	}

	printf("digits: ");
	for(i=0;i<10;i++)
	{
		printf("  %d",ndigit[i]);
	}
	printf(",  white space=%d, other=%d\n",nwhite,nother);
	return 0;
}
所有的输入字符可以分成12类,因此可以用一个数组存放各个数字出现的次数,这样比用10个独立的变量更方便。





























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值