变量与算数表达式
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个独立的变量更方便。