变量与算数表达式
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 148celsius=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等类似的“幻数”,并不是一个好习惯,无法向阅读程序的人提供什么信息,应当赋予他们有意义的名字。
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个独立的变量更方便。