接下来的所有The C Program Language 第二版 课后习题 以及所有读书心得都会保存在这里。
希望对想我一样的新手有帮助;也欢迎高手们指正。
我会慢慢的往上传的,评论后也是可以修改的。
练习1-1 在你自己的系统中运行“hello, world”程序。再有意去掉程序中的部分
内容,看看会得到什么出错信息。
//即使是这么小的程序有时候也会出问题,搞懂这道题我明白了一件事:不要自以为是,要认真。
#include <stdio.h>
void main()
{
printf("hello,world!\n");
getchar();
}
总结:首先编译时报错,因为main根本不应该 返回void ,这是在论坛发帖子时某高手指出了。
个人认为1-2没太大意义,所以没做
练习1-3 修改温度转换程序,使之能在转换表的顶部打印一个标题
#include <stdio.h>
/* 当fahr是0、20、40,...,300时,分别打印华氏温度与
摄氏温度的对照表,华氏温度对摄氏温度转换公式为:
C为摄氏温度 F为华氏温度 C=5/9(F-32) */
void main()
{
float fahr,celsius;
float lower,upper,step;
lower=0; /* lower 是下限 */
upper=300; /* upper是上限 */
step=20; /* step是步长 */
fahr=lower;
printf("\t\t 华氏温度--摄氏温度\n\n");
while(fahr<=upper)
{celsius=5*(fahr-32)/9; /*这里不完全按照公式是因为
5/9的到的结果是0,所有结果都会是0*/
printf("\t\t\t%3.0f\t%6.2f\n",fahr,celsius);
fahr=fahr+step;
}
getchar();
}
//练习1-3 主要是打程序,没太大难度,不怎么需要解释,主要可以加些练习格式改动-使看上去更规范
练习1-4 编写一个程序打印摄氏温度转换为相应华氏温度的转换表。
#include <stdio.h>
/* 当fahr是0、20、40,...,300时,分别打印华氏温度与
摄氏温度的对照表,华氏温度对摄氏温度转换公式为:
C为摄氏温度 F为华氏温度 C=5/9(F-32) */
void main()
{
float fahr,celsius;
float lower,upper,step;
lower=0; /* lower 是下限 */
upper=300; /* upper是上限 */
step=20; /* step是步长 */
celsius=lower;
printf("\t\t 摄氏温度--华氏温度\n\n");
while(celsius<=upper)
{fahr=celsius*9/5+32; /*这里不完全按照公式是因为
5/9的到的结果是0,所有结果都会是0*/
printf("\t\t\t%3.0f\t%6.2f\n",celsius,fahr);
celsius=celsius+step;
}
getchar();
}
//怎么说呢,这个还是挺有意思的,主要是照着公式写换算那部分需要注意 类型转换方面的事,不懂没关系,看到后面类型转换就可以知道什么意思了,这里不懂可以跳过,
也可以自己改变下看看结果
练习1-5 修改温度转换程序,要求以逆序(即按照从300 度到0 度的顺序)打印温
度转换表。
#include <stdio.h>
/* 当fahr是0、20、40,...,300时,分别打印华氏温度与
摄氏温度的对照表,华氏温度对摄氏温度转换公式为:
C为摄氏温度 F为华氏温度 C=5/9(F-32) */
#define lower 0.00 /* lower 是下限 */
#define upper 300.00 /* upper是上限 */
#define step 20 /* step是步长 */
void main()
{
float fahr,celsius;
printf("\t\t 摄氏温度--华氏温度\n\n");
for(celsius=upper;celsius>=lower;celsius=celsius-step)
/*这里不完全按照公式是因为5/9的到的结果是0,
所有结果都会是0*/
printf("\t\t\t%3.0f\t%6.0f\n",celsius,celsius*9/5+32);
getchar();
}
另::1-5节书上的程序,好奇想验证点东西
/*getchar与putchar读写输入输出联系,主要看看 打一个字符是马上输出一个还是 打很多字符后一起输出,-
输入到哪里(或者说输入什么字符转去输出)? 结果是:输入N多字符后+回车后,转去输出N多字符(N的字符数目相同)*/
#include <stdio.h>
/* copy input to output;1st version*/
int main()
{ int c;
c=getchar();
while(c!=EOF){
putchar(c);
c=getchar();
}
}
//只要有一定的C基础,应该没难度,呵呵,倒是书里面的1-5节源程序有点意思
练习1-6 验证表达式getchar() != EOF的值是0还是1。
这个是1-6练习的答案,以前发过帖子:
http://topic.csdn.net/u/20110123/13/2d36178d-4b17-4d57-b76c-a9f9566ce401.html
#include <stdio.h>
/* 将每一个输入的字符直接输出显示*/
int main()
{ int c;
printf("(getchar()!=EOF)=%d\n",c=getchar()!=EOF);
scanf("%d",&c);
}
//写着程序倒没什么难度,可是郁闷的是编译总是通不过,后来在论坛上提问来着,最后才发现又是我自己粗心,将文件存成.CPP的C++文件了,所以程序总报错
····························11年07月04日21:04,今天就写到这里了,前面的都是以前写完成很长时间的程序。 北京的天儿真热,早点洗洗睡吧。··················································
练习1-21 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词
之间的间隔不变。假设制表符终止位的位置与练习1-20 的detab程序的情况相同。当使用一
个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪一种替换字符比较好?
跨度有点大
#include <stdio.h>
#define N 10
#define TABbit 8
void entab(int spN,int chN);
main()
{ int i,j,chN;
char c;
i=j=chN=0;
while((c=getchar())!=EOF)
{
if(chN%N==0&&!i&&!j&&chN) printf("\\"); //防止entab()返回后而chN%N==0时,每计数一个空白符
//就会输出一个‘\‘,没有i==0和j==0时就会出现这种情况
if(c==' '|| c=='\t')
if(c==' ') i++;
else j++;
else if(i==0&&j==0)
{ printf("%c",c);chN++;}
else {entab(i+j*TABbit,chN);chN+=i+j*TABbit;
printf("%c",c); chN++;i=j=0;}
if(!(c-'\n')) chN=0;
}
}
void entab(int spN,int chN)
{
int s=0; // s计数连续空格数,直到达到TABbit个空格,这时输出 'tab'
while(spN--) //最开始用--spN 时结果总是错误的
{if(!(++s%TABbit))
{printf("ItisaTAB");s=0;} //'tab'看不出来结果是TAB还是空格,用8个字符'ItisaTAB'表示 'tab'
if(!(++chN%N)&&chN)
{if(s>0) for(;s>0;--s) printf(" "); //达到制表符终止位,将小于TABbit个空格输出,--s使s 值 置0,
//表示到制表符终止位,重新计数 s
printf("\\");
}
}
if(s) for(;s>0;s--) printf(" "); //当传来的spN小于TABbit时,而chN+spN的数目没有跨过制表符终止位时,就输出s个空格;
// 或chN+spN的 数目跨过了制表符终止位时,输出制表符终止位后面没有处理的空格数。
//总之,上面while语句没处理完的空格,根据s的个数输出空格。
}
这个程序折磨我好几天,必须贴上来解恨