BeautifulMan

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  16 随笔 :: 0 文章 :: 0 评论 :: 0 Trackbacks

#

     摘要: 复习题1、给出每行之后quack的值Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->    int quack = 2;    quack +...  阅读全文
posted @ 2015-11-19 14:04 李阿昀 阅读(600) | 评论 (0)编辑 收藏

复习题
1、假定所有的变量都是int类型。找出下面每一个变量的值:
a.x = (2 + 3) * 6;
b.x = (12 + 6) / 2 * 3;
c.y = x = (2 + 3) / 4;
d.y = 3 + 2 * (x = 7 / 2);
答:
a.
x = 30
b.
x = 27
c.
x = 1
y = 1
d.
x = 3
y = 9
2、假定所有的变量都是int类型。找出下面每一个变量的值:
a.x = (int) 3.8 + 3.3;
b.x = (2 + 3) * 10.5;
c.x = 3 / 5 * 22.0;
d.x = 22.0 * 3 /5;
答:
a.
x = 6
b.
x = 52
c.
x = 0
d.
x = 13
3、您怀疑下面的程序里有一些错误。您能找出这些错误吗?
 1 int main(void)
 2 {
 3     int i = 1,
 4     float n;
 5     printf("Watch out! Here come a bunch of fractions!\n");
 6     while(i < 30)
 7         n = 1/i;
 8         printf("%f", n);
 9     printf("That's all, folks!\n");
10     return;
11 }
答:
第0行:应该有#include <stdio.h>。
第3行:应该以分号而不是逗号结尾。
第6行:while语句建立一个无限循环。因为i的值保持为1,所以它总是小于30。推测一下它的意思大概是要写成while(i++ < 30)。
第6到8行:这样的缩排说明我们想要使第7行和8行组成一个代码块,但是缺少了花括号会使while循环只包括第7行。应该添加花括号。
第7行:因为1和i都是整数,所以当i为1时除法运算的结果会是1,而当i为更大的数时结果为0。使用n = 1.0/i;会使i在进行除法运算之前先转换为浮点数,这样就会产生非0的答案。
第8行:我们在控制语句中漏掉了换行符(\n),这会使数字只要可能就在一行中打印。
第10行:应该是return 0;。
下面是一个正确的版本:
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int i = 1;
 5     float n;
 6     printf("Watch out! Here come a bunch of fractions!\n");
 7     while(i++ < 30)
 8     {
 9         n = 1.0/i;
10         printf("%f\n", n);
11     }
12     printf("That's all, folks!\n");
13     return 0;
14 }
4、这是程序清单5.9的其他一种设计方法。表面上看,它使用了一个scanf()函数替代了程序清单5.9中的两个scanf()。但是该程序不令人满意。和程序清单5.9相比,它有什么缺点?
 1 #include <stdio.h>
 2 #define S_TO_M 60
 3 int main(void)
 4 {
 5     int sec, min, left;
 6     printf("This program converts seconds to minutes and ");
 7     printf("seconds.\n");
 8     printf("Just enter the number of seconds.\n");
 9     printf("Enter 0 to end the program.\n");
10     while(sec > 0)
11     {
12         scanf("%d", &sec);
13         min = sec / S_TO_M;
14         left = sec % S_TO_M;
15         printf("%d sec is %d min, %d sec.\n", sec, min, left);
16         printf("Next input?\n");
17     }
18     printf("Bye!\n");
19     return 0;
20 }
答:(参考课后答案)
主要问题在于判断语句(sec是否大于0?)和获取sec值的scanf()语句之间的关系。具体地说,第一次进行判断时,程序还没有机会来获得sec的值,这样就会对碰巧处在那个内存位置的一个垃圾值进行比较。一个比较笨拙的解决方法是对sec进行初始化,比如把它初始化为1,这样就可以通过第一次判断。但是还有一个问题,当最后输入0来停止程序时,在循环结束之前不会检查sec,因而0秒的结果也被打印出来。更好的方法是使scanf()语句在进行while判断之前执行。可以通过像下面这样改变程序的读取部分来做到这一点:
1 scanf("%d", &sec);
2 while(sec > 0)
3 {
4      min = sec / S_TO_M;
5      left = sec % S_TO_M;
6      printf("%d sec is %d min, %d sec.\n", sec, min, left);
7      printf("Next input?\n");
8      scanf("%d", &sec);
9 }
第一次获取输入使用循环外部的scanf(),以后就使用在循环结尾处(也即在循环再次执行之前)的scanf()语句。这是处理这类问题的一个常用方法。
5、下面的程序将打印什么?
 1 #include <stdio.h>
 2 #define FORMAT "%s! C is cool!\n"
 3 int main(void)
 4 {
 5     int num = 10;
 6 
 7     printf(FORMAT, FORMAT);
 8     printf("%d\n", ++num);
 9     printf("%d\n", num++);
10     printf("%d\n", num--);
11     printf("%d\n", num);
12     return 0;
13 }
答:
%s! C is cool!
! C is cool!
11
11
12
11
6、下面的程序将打印什么?
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     char c1, c2;
 5     int diff;
 6     float num;
 7 
 8     c1 = 'S';
 9     c2 = 'O';
10     diff = c1 - c2;
11     num = diff;
12     printf("%c%c%c: %d %3.2f\n", c1, c2,c1, diff, num);
13     return 0;
14 }
答:
SOS: 4 4.00
7、下面的程序将打印出什么?
 1 #include <stdio.h>
 2 #define TEN 10
 3 int main(void)
 4 {
 5     int n = 0;
 6     while(n++ < TEN)
 7         printf("%5d", n);
 8     printf("\n");
 9     return 0;
10 }
答:
   1   2   3   4   5   6   7   8   9   10(注意:每个数字占据5列的宽度)  
8、修改上一个程序,让它打印从a到g的字母。
答:
 1 #include <stdio.h>
 2 #define CHARACTER 'g'
 3 int main(void)
 4 {
 5     char ch = 'a' - 1;
 6     while(ch++ < CHARACTER)
 7         printf("%3c", ch);
 8     printf("\n");
 9     return 0;
10 }
9、如果下面的片段是一个完整程序的一部分,它们将打印出什么?
a.
1 int x = 0;
2 while(++x < 3)
3    printf("%4d", x);
b.(注意:使第二个printf()语句缩进并不能使它成为while循环的一部分。因此它只是在while循环结束之后被调用一次,我看成一个代码块了)
1 int x = 100;
2 
3 while(x++ < 103)
4    printf("%4d\n", x);
5    printf("%4d\n", x);
c.
1 char ch = 's';
2 
3 while(ch < 'w')
4 {
5     printf("%c", ch);
6     ch++;
7 }
8 printf("%c\n", ch);
答:
a.
   1   2
b.
 101
 102
 103
 104
c.
stuvw
10、下面的程序将打印什么?
 1 #define MESG "COMPUTER BYTES DOG"
 2 #include <stdio.h>
 3 int main(void)
 4 {
 5     int n = 0;
 6 
 7     while(n < 5)
 8         printf("%s\n", MESG);
 9         n++;
10     printf("That's all.\n");
11     return 0;
12 }
答:
这是一个构造有缺陷的程序。因为while语句没有使用花括号,只有printf()语句作为循环的一部分,所以程序无休止地打印消息COMPUTER BYTES DOG直到您强行关闭程序为止。
11、构造完成下面功能(或者用一个术语来说,有下面的副作用)的语句:
a.把变量x的值增加10
b.把变量x的值增加1
c.将a与b之和的两倍赋给c
d.将a与两倍的b之和赋给c
答:
a.x = x + 10;
b.x++; or ++x; or x = x + 1;
c.c = (a + b) * 2;
d.c = a + 2 * b;
12、构造具有下面功能的语句:
a.把变量x的值减1
b.把n除以k所得的余数赋给m
c.用b减去a的差去除q,并将结果赋给p
d.用a与b的和除以c与d的乘积,并将结果赋给x
答:
a.x--; or --x; or x = x - 1;
b.m = n % k;
c.p = q / (b - a);
d.x = (a + b) / (c * d);
编程练习
1、
 1 #include <stdio.h>
 2 const int PARAM = 60;
 3 int main(void)
 4 {
 5     int min, hour, left;
 6 
 7     printf("Convert minutes to hours and minutes!\n");
 8     printf("Enter the number of minutes (<=0 to quit):\n");
 9     scanf("%d", &min);
10     while(min > 0)
11     {
12         hour = min / PARAM;
13         left = min % PARAM;
14         printf("%d minutes is %d hours, %d minutes.\n", min, hour, left);
15         printf("Enter next value (<=0 to quit): \n");
16         scanf("%d", &min);
17     }
18     printf("Done!\n");
19     return 0;
20 }
2、
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int number, maxnum;
 5     printf("Please enter a int number:\n");
 6     scanf("%d", &number);
 7     maxnum = number + 10;
 8     while(number <= maxnum)
 9     {
10         printf("%5d", number++);
11     }
12     printf("\n");
13     return 0;
14 }
3、(与题目1类似)
 1  #include <stdio.h>
 2  const int PARAM = 7;
 3  int main(void)
 4  {
 5      int day, week, left;
 6 
 7      printf("Convert days to weeks and days!\n");
 8      printf("Enter the number of days (<=0 to quit):\n");
 9      scanf("%d", &day);
10      while(day > 0)
11      {
12          week = day / PARAM;
13          left = day % PARAM;
14          printf("%d days are %d weeks, %d days.\n", day, week, left);
15          printf("Enter next value (<=0 to quit): \n");
16          scanf("%d", &day);
17      }
18      printf("Done!\n");
19      return 0;
20 }
4、
 1  #include <stdio.h>
 2  #define CM_PER_INCH 0.3937
 3  #define FEET_PER_INCH 12
 4  int main(void)
 5  {
 6      float cm, inch, left;
 7      int feet;
 8 
 9      printf("Enter a height in centimeters: ");
10      scanf("%f", &cm);
11      while(cm > 0)
12      {
13          inch = cm * CM_PER_INCH;
14          feet = inch / FEET_PER_INCH;
15          left = (inch / FEET_PER_INCH - feet) * FEET_PER_INCH ;
16          printf("%.1f cm = %d feet, %.1f inches.\n", cm, feet, left);
17          printf("Enter a height in centimeters (<=0 to quit): ");
18          scanf("%f", &cm);
19      }
20      printf("bye\n");
21      return 0;
22 }
5、
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int count, sum, limit;
 5     count = 0;
 6     sum = 0;
 7 
 8     printf("Please enter a limit number: ");
 9     scanf("%d", &limit);
10     while(count++ < limit)
11     {
12         sum = sum + count;
13     }
14     printf("sum = %d\n", sum);
15     return 0;
16 }
6、
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int count, sum, limit;
 5     count = 0;
 6     sum = 0;
 7 
 8     printf("Please enter a limit number: ");
 9     scanf("%d", &limit);
10     while(count++ < limit)
11     {
12         sum = sum + count * count;
13     }
14     printf("sum = %d\n", sum);
15     return 0;
16 }
7、
 1 #include <stdio.h>
 2 float cube(float num);
 3 int main(void)
 4 {
 5     float number;
 6     printf("Please enter a number: ");
 7     scanf("%f", &number);
 8     printf("The cube of the %.2f is %.2f", number, cube(number));
 9     return 0;
10 }
11 float cube(float num)
12 {
13     return num * num * num;
14 }
8、(注意:我用到了<string.h>头文件中的getchar()函数,还是用目前的知识弄不出来,啊!
 1 #include <stdio.h>
 2 #include <string.h>
 3 const float ONE_PARAM = 1.8;
 4 const float TWO_PARAM = 32.0;
 5 const float THREE_PARAM = 273.16;
 6 void temperatures(double fahrenheit);
 7 int main(void)
 8 {
 9     float number;
10     while(1==1)
11     {
12         printf("Please again enter a fahrenheit's temperature: ");
13         scanf("%f", &number);
14         if(getchar() == 'q')
15         {
16             break;
17         }
18         temperatures(number);
19     }
20     printf("Done!\n");
21     return 0;
22 }
23 void temperatures(double fahrenheit)
24 {
25     float celsius, kelvin;
26     celsius = ONE_PARAM * fahrenheit + 32.0;
27     kelvin = celsius + 273.16;
28     printf("fahrenheit is %.2f, celsius is %.2f, kelvin is %.2f.\n", fahrenheit, celsius, kelvin);
29 }
今天看到第6章 循环部分,原来可以这样做,是我读书太不用心了!
 1  #include <stdio.h>
 2  #include <string.h>
 3  const float ONE_PARAM = 1.8;
 4  const float TWO_PARAM = 32.0;
 5  const float THREE_PARAM = 273.16;
 6  void temperatures(double fahrenheit);
 7  int main(void)
 8  {
 9     float number;
10 
11     printf("Please again enter a fahrenheit's temperature: ");
12     while(scanf("%f", &number) == 1)
13     {
14         temperatures(number);
15         printf("Please again enter a fahrenheit's temperature: ");
16     }
17     printf("Done!\n");
18     return 0;
19 }
20 void temperatures(double fahrenheit)
21 {
22     float celsius, kelvin;
23     celsius = ONE_PARAM * fahrenheit + 32.0;
24     kelvin = celsius + 273.16;
25     printf("fahrenheit is %.2f, celsius is %.2f, kelvin is %.2f.\n", fahrenheit, celsius, kelvin);
26 }
posted @ 2015-11-14 16:33 李阿昀 阅读(474) | 评论 (0)编辑 收藏

复习题
1、再次运行程序清单4.1,但是在要求您输入名字时,请输入您的名字和姓氏。发生了什么?为什么?
答:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define DENSITY 62.4
 4 int main(void)
 5 {
 6     float weight, volume;
 7     int size, letters;
 8     char name[40]; // name是一个有40个字符的数组
 9 
10     printf("Hi! What's your first name?\n");
11     scanf("%s", name);
12     printf("%s, what's your weight in pounds?\n", name);
13     scanf("%f", &weight);
14     size = sizeof(name);
15     letters = strlen(name);
16     volume = weight / DENSITY;
17     printf("Well, %s, your volume is %2.2f cubic feet.\n", name, volume);
18     printf("Also, your first name has %d letters, \n", letters);
19     printf("and we have %d bytes to store it in.\n", size);
20     return 0;
21 }
如果输入名字和姓氏,会输出如下结果:
Hi! What's your first name?
Li Ayun
Li, what's your weight in pounds?
Well, Li, your volume is 0.00 cubic feet.
Also, your first name has 2 letters,
and we have 40 bytes to store it in.
原因:(参考课后答案)程序不能正常工作。第一个scanf()语句只是读入您的名而没有读入您的姓,您的姓依然存储在输入“缓冲区”(缓冲区只是一块用来存放输入的临时存储区域)中。当下一个scanf()语句想要读入您的体重时,它从上次读入结束的地方开始,这样就试图把您的姓作为体重来读取。这会使scanf()失败。一方面,如果您对姓名请求做出像Li 123这样的响应,程序会使用123作为您的体重,虽然您是在程序请求体重之前输入123的。
2、假定下列每个示例都是某个完整程序的一部分。它们的打印结果分别是什么?
a.printf("He sold the painting for $%2.2f.\n", 2.345e2);
b.printf("%c%c%c\n", 'H', 105, '\41');
c.#define Q "His Hamlet was funny without being vulgar. "
         printf("%s\nhas %d characters.\n", Q, strlen(Q));
d.printf("Is %2.2e the same as %2.2f?\n", 1201.0, 1201.0);
答:
a.He sold the painting for $234.50.
b.Hi!
c.His Hamlet was funny without being vulgar. (注意,与课后答案不一样,是因为细看题目的话,此句末尾有一个空格,strlen()函数输出字符串中字符(包括空格和标点符号)的准确数目)
   has 43 characters.
d.Is 1.20e+003 the same as 1201.00?
3、在问题2c中,应进行哪些修改以使字符串Q引在双引号中输出?
答:
使用\"。示例如下:
printf("\"%s\"\nhas %d characters.\n", Q, strlen(Q));
4、找出下列程序中的错误。
 1 define B booboo
 2 define X 10
 3 main(int)
 4 {
 5     int age;
 6     char name;
 7 
 8     printf("Please enter your first name. ");
 9     scanf("%s", name);
10     printf("All right, %c, what's your age?\n", name);
11     scanf("%f", age);
12     xp = age + X;
13     printf("That's a %s! You must be at least %d.\n", B, xp);
14     rerun 0;
15 }
答:
下面是一个正确的版本:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define B "booboo"
 4 #define X 10
 5 int main(void)
 6 {
 7     int age;
 8     int xp;
 9 
10     char name[40];
11 
12     printf("Please enter your first name. \n");
13     scanf("%s", name);
14     printf("All right, %s, what's your age?\n", name);
15     scanf("%d", &age);
16     xp = age + X;
17     printf("That's a %s! You must be at least %d.\n", B, xp);
18     return 0;
19 }
5、假设一个程序这样开始:
1 #define BOOK "War and Peace"
2 int main(void)
3 {
4     float cost = 12.99;
5     float precent = 80.0;
请构造一个printf()语句,使用BOOK、cost和percent打印下列内容:
This copy of "War and Peace" sells for $12.99.
That is 80% of list.
答:
printf("This copy of \"%s\" sells for $%.2f.\nThat is %.0f%% of list.", BOOK, cost, percent);
6、您会使用什么转换说明来打印下列各项内容?
a.一个字段宽度等于数字位数的十进制整数。
b.一个形如8A、字段宽度为4的十六进制整数。
c.一个形如232.346、字段宽度为10的浮点数。
d.一个形如2.33e+002、字段宽度为12的浮点数。
e.一个字段宽度为30、左对齐的字符串。
答:
a.%d
b.%4X
c.%10.3f
d.%12.2e
e.%-30s
对于浮点数来说,字段宽度包含了小数点右边的数字的数目
7、您会使用哪个转换说明来打印下列各项内容?
a.一个字段宽度为15的unsigned long整数
b.一个形如0x8a、字段宽度为4的十六进制整数
c.一个形如2.33E+02、字段宽度为12、左对齐的浮点数
d.一个形如+232.346、字段宽度为10的浮点数
e.一个字符串的前8个字符,字段宽度为8字符
答:
a.%15lu
b.%#4x(字段宽度应放在#和x之间)
c.%-12.2E("-"修饰符使浮点数左对齐输出)
d.%+10.3f
e.%-8.8s("-"修饰符使文本左对齐输出)
8、您会使用什么转换说明来打印下列各项内容?
a.一个字段宽度为6、最少有4位数字的十进制整数
b.一个字段宽度在参数列表中给定的八进制整数
c.一个字段宽度为2的字符
d.一个形如+3.13、字段宽度等于数字中字符个数的浮点数
e.一个字符串的前5个字符,字段宽度为7、左对齐
答:
a.%6.4d
b.%*o(此处为小写字母o,而不是数字0)
c.%2c
d.%+.2f
e.%-7.5s
9、为下列每个输入行提供一个对其进行读取的scanf()语句,并声明语句中用到的所有变量或数组。
a.101
b.22.32 8.34E-09
c.linguini
d.catch 22
e.catch 22(但是跳过catch)
答:
a.
1 int num;
2 scanf("%d", &num);
b.
1 float kgs, share;
2 scanf("%f%f", &kgs, &share);
c.
1 char str[40];
2 scanf("%s", str);
d.
1 char str[40];
2 int number;
3 scanf("%s %d", str,&number);
e.
1 char str[40];
2 int number;
3 scanf("%s %d", str, &number);
10、什么是空白字符?
答:
空白字符包括空格、制表符和换行符。C使用空白字符分隔各个语言符号;scanf()使用空白字符分隔相邻的输入项。
11、假设您想在程序中使用圆括号代替花括号。以下方法可以吗?
#define ( {
#define ) }
答:
会发生替换。但不幸的是,预处理器不能区别哪些圆括号应该被替换成花括号,哪些圆括号不应该被替换成花括号。因此:
1 #include <stdio.h>
2 #define ( {
3 #define ) }
4 int main(void)
5 (
6     printf("Hello World!\n");
7     return 0;
8 )
会变为:
1 #include <stdio.h>
2 int main{void}
3 {
4     printf{"Hello World!\n"};
5     return 0;
6 }
所有圆括号都要替换为花括号。
编程练习
1、
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     char name[40]; // 名字
 5     char surname[40]; // 姓氏
 6 
 7     printf("Please enter your name and surname: \n");
 8     scanf("%s%s", name, surname);
 9     printf("%s,%s", surname, name);
10     return 0;
11 }
2、
 1 #include <stdio.h>
 2 #include <string.h>
 3 int main(void)
 4 {
 5     char name[40]; // 名字
 6 
 7     printf("Please enter your name: \n");
 8     scanf("%s", name);
 9     printf("\"%s\"\n", name);
10     printf("\"%20s\"\n", name);
11     printf("\"%-20s\"\n", name);
12     printf("%*s\n", strlen(name)+3, name);
13     return 0;
14 }
3、
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     float number;
 5 
 6     printf("Please enter a float number: \n");
 7     scanf("%f", &number);
 8     printf("The input is %.1f or %.1e\n", number, number);
 9     printf("The input is %+.3f or %.3E\n", number, number);
10     return 0;
11 }
4、
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     /* 以厘米为单位输入身高,并以米为单位进行显示 */
 5     float weight;
 6     char name[40];
 7 
 8     printf("Please enter your weight(cm): \n");
 9     scanf("%f", &weight);
10     printf("Please enter your name: \n");
11     scanf("%s", name);
12     printf("%s, you are %.2f meter tall\n", name, weight/100);
13     return 0;
14 }
5、
 1 #include <stdio.h>
 2 #include <string.h>
 3 int main(void)
 4 {
 5     char name[40]; // 名字
 6     char surname[40]; // 姓氏
 7 
 8     printf("Please enter your name: \n");
 9     scanf("%s", name);
10     printf("Please enter your surname: \n");
11     scanf("%s", surname);
12     printf("%10s %10s\n", surname, name);
13     printf("%10d %10d\n", strlen(surname), strlen(name));
14     printf("%-10s %-10s\n", surname, name);
15     printf("%-10d %-10d\n", strlen(surname), strlen(name));
16     return 0;
17 }
结果为:(看起来有一点怪啊!!!)
Please enter your name:
Ayun
Please enter your surname:
li
        li       Ayun
         2           4
li         Ayun
2         4
6、
 1 #include <stdio.h>
 2 #include <float.h>
 3 int main(void)
 4 {
 5     double dblnum = 1.0/3.0;
 6     float fltnum = 1.0/3.0;
 7 
 8     printf("%.4f\n", dblnum);
 9     printf("%.12f\n", dblnum);
10     printf("%.16f\n", dblnum);
11     printf("%.4f\n", fltnum);
12     printf("%.12f\n", fltnum);
13     printf("%.16f\n", fltnum);
14     printf("double precision = %d digits\n", DBL_DIG);
15     printf("float precision = %d digits\n", FLT_DIG);
16     return 0;
17 }
7、(定义浮点类型的时候是使用float,还是double好???)
 1 #include <stdio.h>
 2 #define LITRE 3.785
 3 #define KM 1.609
 4 int main(void)
 5 {
 6     float mile; // 英里数
 7     float gallon; // 加仑数
 8 
 9     printf("Please enter your mile: \n");
10     scanf("%f", &mile);
11     printf("Please enter your gallon: \n");
12     scanf("%f", &gallon);
13     printf("Miles per gallon of gasoline: %.1f\n", mile/gallon);
14     printf("Liters per 100 kilometers: %.1f\n", gallon*LITRE*100/(mile*KM));
15     return 0;
16 }
posted @ 2015-11-14 02:01 李阿昀 阅读(806) | 评论 (0)编辑 收藏

第3章  数据和C
复习题
1、对下面的各种数据使用合适的数据类型:
     a.East Simpleton的人口
     b.DVD影碟的价格
     c.本章出现次数最多的字母
     d.这个字母出现的次数
答:a.int类型,可以是short、unsigned或unsigned short;人口数是一个整数。
      b.float类型;价格不太可能正好是一个整数(您也可以使用double,但实际上并不需要那么高的精度)。
      c.char类型。
      d.int类型,可以是unsigned。
2、需要用long类型变量代替int类型变量的原因是什么?
答:一个原因是在您的系统中long可以容纳比int类型更大的数;一个原因是如果您确实需要处理更大的值,那么使用一种在所有系统上都能保证至少是32位的类型会使程序的可移植性更好。
3、获得一个32位的有符号整数,可以使用哪些可移植的数据类型?每种选择的原因是什么?
答:要获得正好是32位的数,您可以使用int32_t(如果在您的系统上有这一定义的话)。要获得可存储至少32位的最小类型,可以使用int_least32_t。如果要在32位的类型中获得提供最快计算速度的类型,可以选择int_fast32_t。(参考
3.4.5  可移植的类型:inttypes.h,理解的不是很清楚!!!)
4、指出下列常量的类型和意义(如果有的话):
     a.'\b'
     b.1066
     c.99.44
     d.0XAA
     e.2.0e30
答:a.char常量(但以int类型存储)
      b.int常量
      c.double常量
      d.unsigned int常量,十六进制格式
      e.double常量
5、Dottie Cawm写的下面这个程序中有很多错误,找出这些错误。
1 include <stdio.h>
2 main
3 (
4     float g; h;
5     float tax, rate;
6 
7     g = e21;
8     tax = rate * g;
9 )
答:第1行:应该是#include <stdio.h>
      第2行:应该是int main(void)
      第3行:使用{,而不是(
      第4行:在g和h之间应该是逗号而不是分号
      第5行:无错误
      第6行:(空行)无错误
      第7行:在e之前应该至少有一个数字,.1e21或1.e21都是正确的,尽管这个数有点大。
      第8行:无错误,至少在语法上没有
      第9行:使用},而不是)
缺少的行:首先,rate没有被赋值。其次,变量h从来没有被使用。而且程序永远不会把它的计算结果通知给您。这些错误都不会阻止程序的运行(尽管可能会向您出示一个警告以说明变量没有被使用),但是它们确实减弱了程序本来就不多的功能。而且在结尾处应该有一个return语句。
   下面是正确版本之一:  
 
 1 #include <stdio.h>
 2
 int main(void)
 3 {
 4     float g, h;
 5     float tax, rate;
 6     rate = 0.08;
 7     g = 1.0e5;
 8 
 9     tax = rate * g;
10     h = g + tax;
11     printf("You owe $%f plus $%f in taxes for a total of $%f.\n", g, tax, h);
12     return 0;
13 }
6、指出下表中各常量的数据类型(在声明语句中使用的数据类型)及其在printf()中的格式说明符。
          常量         类型        说明符     

12

0x3
  'C'  
  2.34E07  
 '\040'   
 7.0   
 6L   
 6.0f   













答:
          常量           类型           说明符     

12int%d

0x3unsigned int%#x
  'C'char %c 
  2.34E07double  %f
 '\040' char  %c
 7.0 double  %f
 6L long  %ld
 6.0f float %e 












7、
指出下表中各常量的数据类型(在声明语句中使用的数据类型)及其在printf()中的格式说明符,假设int类型为16位长。
          常量         类型        说明符     

012

2.9e05L
  's'  
  100000  
 '\n'   
 20.0f   
 0x44   
















答:
          常量           类型           说明符     

012int%#0

2.9e05Llong double%Le
  's'char %c 
  100000long %ld 
 '\n' char%c 
 20.0f float %f 
 0x44 unsigned int %#x 
















8、假设一个程序开始处有如下的声明:
1 int imate = 2;
2 long shot = 53456;
3 char grade = 'A';
4 float log = 2.71828;
在下面printf()语句中添上合适的类型说明符:
1 printf("The odds against the %___ were %___ to 1.\n", imate, shot);
2 printf("A score of %___ is not an %___ grade.\n", log, grade);
答:
1 printf("The odds against the %d were %ld to 1.\n", imate, shot);
2 printf("A score of %f is not an %c grade.\n", log, grade);
9、假设ch为char类型变量。使用转义序列、十进制值、八进制字符常量以及十六进制字符常量等方法将其赋值为回车符(假设使用ASCII编码)。
答:
1 char ch = '\r';
2 char ch = 13;
3 char ch = '\015';
4 char ch = '\xd';
10、改正下面程序(在C中/表示除法)。
1 void main(int) / this progarm is perfect /
2 {
3    cows, legs integer;
4    printf("How many cow legs did you count?\n);
5    scanf("%c", legs);
6    cows = legs / 4;
7    printf("That implies there are %f cows.\n", cows)
8 }
答:
 1 #include <stdio.h>
 2 int main(void/* this progarm is perfect */
 3 {
 4    int cows, legs;
 5    printf("How many cow legs did you count?\n");
 6    scanf("%d", &legs);
 7    cows = legs / 4;
 8    printf("That implies there are %d cows.\n", cows);
 9    return 0;
10 }
11、指出下列转义字符的含义:
1 a.\n
2 b.\\
3 c.\"
4 d.\t
答:a.换行字符
      b.反斜线字符
      c.双引号字符
      d.制表字符
编程练习(如有错误,希望指正!!!)
1、
 1 /* 整数上溢*/
 2 #include <stdio.h>
 3 int main(void)
 4 {
 5     int i = 2147483647;
 6     unsigned int j = 4294967295;
 7 
 8     /*
 9         无符号整数j像一个汽车里程指示表(形容的太好了,可参考《计算机科学导论》第3章 数据存储,有图),
10        当达到最大值时,它将溢出到起始点。整数i也是同样。它们的主要区别是unsigned int变量j的起始点是0(正像里程
11        指示表那样),而int变量i的起始点则是-2147483648。——参考《C Primer Plus》
12     */
13     printf("%d %d %d\n", i, i+1, i+2);
14     printf("%u %u %u\n", j, j+1, j+2);
15     return 0;
16 }
运行结果:
2147483647 -2147483648 -2147483647
4294967295 0 1
浮点数的上溢和下溢???(理解的不是很清楚,回头再来写)
2、
1 #include <stdio.h>
2 int main(void)
3 {
4     int asc;
5     printf("Please enter an ASCII value: ");
6     scanf("%d", &asc);
7     printf("The code is %c.\n", asc);
8     return 0;
9 }
3、
1 #include <stdio.h>
2 int main(void)
3 {
4     printf("\aStartled by the sudden sound, Sally shouted, ");
5     printf("\"By the Great Pumpkin,what was that!\"\n");
6     return 0;
7 }
4、
1 #include <stdio.h>
2 int main(void)
3 {
4     float number;
5     printf("Please enter a float value: ");
6     scanf("%f", &number);
7     printf("The input is %f or %e", number, number);
8     return 0;
9 }
5、
1 #include <stdio.h>
2 int main(void)
3 {
4     int age;
5     printf("Please enter your age: ");
6     scanf("%d", &age);
7     printf("Your age has %e s", age*3.156e7);
8     return 0;
9 }
6、
1 #include <stdio.h>
2 int main(void)
3 {
4     int num; // 夸脱数应该为整数吧!!
5     printf("Please enter water: ");
6     scanf("%d", &num);
7     printf("The water has %e ", num*950/3.0e-23);
8     return 0;
9 }
7、
1 #include <stdio.h>
2 int main(void)
3 {
4     float height;
5     printf("Please enter your height: ");
6     scanf("%f", &height);
7     printf("Your height is %.2f cm.\n", height*2.54);
8     return 0;
9 }
posted @ 2015-10-31 22:22 李阿昀 阅读(1406) | 评论 (0)编辑 收藏

第2章 C语言概述
复习题
1、如何称呼C程序的基本模块?
答:它们被称为函数。
2、什么是语法错误?给出它的一个英语例子和C语言例子。 
答:C的语法错误是指把正确的C符号放在了错误的位置。这是英语中的一个例子:"Me speak English good.";这是C语言的一个例子:printf "Where are the parentheses?";
3、什么是语义错误?给出它的一个英语例子和C语言例子。
答:语义错误就是在意思上的错误。这是英语中的一个例子:"The sentence is excellent Italian.";这是C语言中的一个例子:thrice_n = 3 + n;
4、Indiana Sloth 已经编好了下面的程序,并想征求你的意见。请帮助他评定。
1 include studio.h
int main{void/*该程序可显示出一年中有多少周/*
3 (
4 int s

6 s: = 56;
7 print(There are s weeks in a year.);
8 return 0;
答:第1行:以一个#开始,拼写出文件名stdio.h,然后把文件名放在一对尖括号中。
     第2行:使用(),而不是使用{};使用*/来结束注释,而不是使用/*。
     第3行:使用{,而不是(。
     第4行:使用分号来结束语句。
     第5行:Indiana使这一行(空白行)正确!
     第6行:使用=,而不是使用:=进行赋值(显然,Indiana 了解一些Pascal)。每年有52周而不是56周。
     第7行:应该是printf("There are %d weeks in a year.\n",s);
     第9行:源程序没有第9行,但是应该有,它应该包含一个结束花括号}。
在进行这些修改之后,代码如下:
1 #include<stdio.h>
int main(void/*该程序可显示出一年中有多少周/*
3 {
4 int s;

6 s = 52;
7 printf("There are %d weeks in a year.\n",s);
8 return 0;
9 }
5、假设下面的每一个例子都是某个完整程序的一部分,它们每个将输出什么结果?
a.printf("Baa Baa Black Sheep.");
   printf("Have you any wool?\n");
b.printf("Begone!\n0 creature of lard!");
c.printf("What?\nNo/nBonzo?\n");
d.int num;

  num = 2;
  printf("%d + %d = %d",num,num,num + num);
答:a.Baa Baa Black Sheep.Have you any wool?(注意:在句号之后没有空格。)
     b.Begone!
        0 creature of lard!(注意光标仍留在第2行结束处。)
     c.What?
        No/nBonzo?(注意斜线符号”/“没有反斜线符号”\“所具有的作用,它只是简单地作为斜线符号被打印出来。)
     d.2 + 2 = 4
6、下面哪几个是C的关键字?main,int,function,char,=
答:int,char(注意main只是一个函数名,函数是C中的一个技术术语。=是一个运算符)
7、如何以下面的格式输出words和lines的值:"There were 3020 words and 350 lines"?这里,3020和350代表两个变量的值。
答: 
 1 #include <stdio.h>
 2
 int main(void)
 3 {
 4     int num1,num2;
 5     num1 = 3020;
 6     num2 = 350;
 7 
 8     printf("There were %d words and %d lines\n",num1,num2);
 9     return 0;
10 }
8、考虑下面的程序:
 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int a, b;
 5 
 6     a = 5;
 7     b = 2; /*第7行*/
 8     b = a; /*第8行*/
 9     a = b; /*第9行*/
10     printf("%d %d\n", b, a);
11     return 0;
12 }
请问在第7行、第8行和第9行之后程序的状态分别是什么?
答:第7行之后,a为5,b为2。第8行之后,a为5,b为5。第9行之后,a为5,b为5。
编程练习(新手初学,仅供参考!!!)
1、
1 #include <stdio.h>
2 int main(void)
3 {
4     printf("Li Ayun\n");
5     printf("Li\nAyun\n");
6     printf("Li ");
7     printf("Ayun\n");
8     return 0;
9 }
2、
1 #include <stdio.h>
2 int main(void)
3 {
4     printf("My name is Li Ayun!\n");
5     printf("I live in BeiJing now!\n");
6     return 0;
7 }
3、
1 #include <stdio.h>
2 int main(void)
3 {
4     int age;
5     age = 23;
6     printf("age = %d, days = %d\n", age, age * 365);
7     return 0;
8 }
4、
 1 #include <stdio.h>
 2 void show(void);
 3 void end(void);
 4 int main(void)
 5 {
 6     show();
 7     show();
 8     show();
 9     end();
10     return 0;
11 }
12 void show(void)
13 {
14    printf("For he's a jolly good fellow!\n");
15 }
16 void end(void)
17 {
18     printf("Which nobody can deny!\n");
19 }
5、
1 #include <stdio.h>
2 int main(void)
3 {
4     int toes;
5     toes = 10;
6 
7     printf("toes = %d\ntoes + toes = %d\ntoes * toes = %d", toes, toes + toes, toes * toes);
8     return 0;
9 }
6、
 1 #include <stdio.h>
 2 void showSmile(void);
 3 int main(void)
 4 {
 5     showSmile();
 6     showSmile();
 7     showSmile();
 8     printf("\n");
 9     showSmile();
10     showSmile();
11     printf("\n");
12     showSmile();
13     return 0;
14 }
15 void showSmile(void)
16 {
17     printf("Smile!");
18 }
7、
 1 #include <stdio.h>
 2 void one_three(void);
 3 void two(void);
 4 int main(void)
 5 {
 6     printf("starting now:\n");
 7     one_three();
 8     two();
 9     printf("done!");
10     return 0;
11 }
12 void one_three(void)
13 {
14     printf("one\n");
15 }
16 void two(void)
17 {
18     printf("two\nthree\n");
19 }

posted @ 2015-10-28 20:22 李阿昀 阅读(386) | 评论 (0)编辑 收藏

第1章  概览
   复习题
   1、就编程而言,可移植性表示什么?
   答:可移植性意味着在一个系统上编写的C程序经过很少改动或不经修改就可以在其他系统上运行。如果修改是必要的,则通常只须改变伴随主程序的一个头文件(header)中的几项内容即可。
   2、解释源代码文件、目标代码文件和可执行文件之间的区别。
   答:源代码文件中包含着程序员使用任何语言编写的代码。目标代码文件包含着机器语言代码,它并不需要是完整的程序代码。可执行文件包含着组成可执行程序的全部机器语言代码。
   3、编程的7个主要步骤是什么?
   答:第1步:定义程序目标
         第2步:设计程序
         第3步:编写代码
         第4步:编译
         第5步:运行程序
         第6步:调试 
         第7步:维护和修改程序
   4、编译器的任务是什么?
   答:编译器把源代码(例如,用C语言写成的代码)转换成机器语言代码,也称对象代码。
   5、链接器的任务是什么?
   答:链接器把多个来源(例如,已编写的源代码、库代码和启动代码)的目标代码连接成一个单独的可执行程序。
   编程练习
   1、
 1 #include <stdio.h>
 2
 int main(void)
 3 {
 4     float feet,cm;
 5 
 6     printf("Please enter your feet:");
 7     scanf("%f",&feet);
 8     cm = feet * 2.54;
 9     printf("So you have %.2f cm!\n",cm);
10    return 0;
11 }
posted @ 2015-10-28 19:39 李阿昀 阅读(261) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2