您的位置:首页 > 其它

The C Program Language 第二版 专题(·1)

2011-07-03 12:25 295 查看
接下来的所有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的个数输出空格。

}

这个程序折磨我好几天,必须贴上来解恨
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: