摘要: 復(fù)習(xí)題1、給出每行之后quack的值Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> int quack = 2; quack +... 閱讀全文
復(fù)習(xí)題
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、您懷疑下面的程序里有一些錯誤。您能找出這些錯誤嗎?
第0行:應(yīng)該有#include <stdio.h>。
第3行:應(yīng)該以分號而不是逗號結(jié)尾。
第6行:while語句建立一個無限循環(huán)。因為i的值保持為1,所以它總是小于30。推測一下它的意思大概是要寫成while(i++ < 30)。
第6到8行:這樣的縮排說明我們想要使第7行和8行組成一個代碼塊,但是缺少了花括號會使while循環(huán)只包括第7行。應(yīng)該添加花括號。
第7行:因為1和i都是整數(shù),所以當i為1時除法運算的結(jié)果會是1,而當i為更大的數(shù)時結(jié)果為0。使用n = 1.0/i;會使i在進行除法運算之前先轉(zhuǎn)換為浮點數(shù),這樣就會產(chǎn)生非0的答案。
第8行:我們在控制語句中漏掉了換行符(\n),這會使數(shù)字只要可能就在一行中打印。
第10行:應(yīng)該是return 0;。
下面是一個正確的版本:
主要問題在于判斷語句(sec是否大于0?)和獲取sec值的scanf()語句之間的關(guān)系。具體地說,第一次進行判斷時,程序還沒有機會來獲得sec的值,這樣就會對碰巧處在那個內(nèi)存位置的一個垃圾值進行比較。一個比較笨拙的解決方法是對sec進行初始化,比如把它初始化為1,這樣就可以通過第一次判斷。但是還有一個問題,當最后輸入0來停止程序時,在循環(huán)結(jié)束之前不會檢查sec,因而0秒的結(jié)果也被打印出來。更好的方法是使scanf()語句在進行while判斷之前執(zhí)行。可以通過像下面這樣改變程序的讀取部分來做到這一點:
5、下面的程序?qū)⒋蛴∈裁矗?br />
%s! C is cool!
! C is cool!
11
11
12
11
6、下面的程序?qū)⒋蛴∈裁矗?br />
SOS: 4 4.00
7、下面的程序?qū)⒋蛴〕鍪裁矗?br />
1 2 3 4 5 6 7 8 9 10(注意:每個數(shù)字占據(jù)5列的寬度)
8、修改上一個程序,讓它打印從a到g的字母。
答:
a.
a.
1 2
b.
101
102
103
104
c.
stuvw
10、下面的程序?qū)⒋蛴∈裁矗?br />
這是一個構(gòu)造有缺陷的程序。因為while語句沒有使用花括號,只有printf()語句作為循環(huán)的一部分,所以程序無休止地打印消息COMPUTER BYTES DOG直到您強行關(guān)閉程序為止。
11、構(gòu)造完成下面功能(或者用一個術(shù)語來說,有下面的副作用)的語句:
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、構(gòu)造具有下面功能的語句:
a.把變量x的值減1
b.把n除以k所得的余數(shù)賦給m
c.用b減去a的差去除q,并將結(jié)果賦給p
d.用a與b的和除以c與d的乘積,并將結(jié)果賦給x
答:
a.x--; or --x; or x = x - 1;
b.m = n % k;
c.p = q / (b - a);
d.x = (a + b) / (c * d);
編程練習(xí)
1、
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 }
答: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行:應(yīng)該有#include <stdio.h>。
第3行:應(yīng)該以分號而不是逗號結(jié)尾。
第6行:while語句建立一個無限循環(huán)。因為i的值保持為1,所以它總是小于30。推測一下它的意思大概是要寫成while(i++ < 30)。
第6到8行:這樣的縮排說明我們想要使第7行和8行組成一個代碼塊,但是缺少了花括號會使while循環(huán)只包括第7行。應(yīng)該添加花括號。
第7行:因為1和i都是整數(shù),所以當i為1時除法運算的結(jié)果會是1,而當i為更大的數(shù)時結(jié)果為0。使用n = 1.0/i;會使i在進行除法運算之前先轉(zhuǎn)換為浮點數(shù),這樣就會產(chǎn)生非0的答案。
第8行:我們在控制語句中漏掉了換行符(\n),這會使數(shù)字只要可能就在一行中打印。
第10行:應(yīng)該是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的其他一種設(shè)計方法。表面上看,它使用了一個scanf()函數(shù)替代了程序清單5.9中的兩個scanf()。但是該程序不令人滿意。和程序清單5.9相比,它有什么缺點?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 }
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 }
答:(參考課后答案)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()語句之間的關(guān)系。具體地說,第一次進行判斷時,程序還沒有機會來獲得sec的值,這樣就會對碰巧處在那個內(nèi)存位置的一個垃圾值進行比較。一個比較笨拙的解決方法是對sec進行初始化,比如把它初始化為1,這樣就可以通過第一次判斷。但是還有一個問題,當最后輸入0來停止程序時,在循環(huán)結(jié)束之前不會檢查sec,因而0秒的結(jié)果也被打印出來。更好的方法是使scanf()語句在進行while判斷之前執(zhí)行。可以通過像下面這樣改變程序的讀取部分來做到這一點:
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 }
第一次獲取輸入使用循環(huán)外部的scanf(),以后就使用在循環(huán)結(jié)尾處(也即在循環(huán)再次執(zhí)行之前)的scanf()語句。這是處理這類問題的一個常用方法。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 }
5、下面的程序?qū)⒋蛴∈裁矗?br />
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 }
答: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、下面的程序?qū)⒋蛴∈裁矗?br />
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 }
答: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、下面的程序?qū)⒋蛴〕鍪裁矗?br />
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 }
答: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(注意:每個數(shù)字占據(jù)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、如果下面的片段是一個完整程序的一部分,它們將打印出什么?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 }
a.
1 int x = 0;
2 while(++x < 3)
3 printf("%4d", x);
b.(注意:使第二個printf()語句縮進并不能使它成為while循環(huán)的一部分。因此它只是在while循環(huán)結(jié)束之后被調(diào)用一次,我看成一個代碼塊了)2 while(++x < 3)
3 printf("%4d", x);
1 int x = 100;
2
3 while(x++ < 103)
4 printf("%4d\n", x);
5 printf("%4d\n", x);
c.2
3 while(x++ < 103)
4 printf("%4d\n", x);
5 printf("%4d\n", x);
1 char ch = 's';
2
3 while(ch < 'w')
4 {
5 printf("%c", ch);
6 ch++;
7 }
8 printf("%c\n", ch);
答: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、下面的程序?qū)⒋蛴∈裁矗?br />
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 }
答: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 }
這是一個構(gòu)造有缺陷的程序。因為while語句沒有使用花括號,只有printf()語句作為循環(huán)的一部分,所以程序無休止地打印消息COMPUTER BYTES DOG直到您強行關(guān)閉程序為止。
11、構(gòu)造完成下面功能(或者用一個術(shù)語來說,有下面的副作用)的語句:
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、構(gòu)造具有下面功能的語句:
a.把變量x的值減1
b.把n除以k所得的余數(shù)賦給m
c.用b減去a的差去除q,并將結(jié)果賦給p
d.用a與b的和除以c與d的乘積,并將結(jié)果賦給x
答:
a.x--; or --x; or x = x - 1;
b.m = n % k;
c.p = q / (b - a);
d.x = (a + b) / (c * d);
編程練習(xí)
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、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 }
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類似)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 }
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、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 }
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、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 }
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、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 }
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、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 }
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()函數(shù),還是用目前的知識弄不出來,啊!)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 }
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章 循環(huán)部分,原來可以這樣做,是我讀書太不用心了!
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章 循環(huán)部分,原來可以這樣做,是我讀書太不用心了!
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 }
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 }
復(fù)習(xí)題
1、再次運行程序清單4.1,但是在要求您輸入名字時,請輸入您的名字和姓氏。發(fā)生了什么?為什么?
答:
原因:(參考課后答案)程序不能正常工作。第一個scanf()語句只是讀入您的名而沒有讀入您的姓,您的姓依然存儲在輸入“緩沖區(qū)”(緩沖區(qū)只是一塊用來存放輸入的臨時存儲區(qū)域)中。當下一個scanf()語句想要讀入您的體重時,它從上次讀入結(jié)束的地方開始,這樣就試圖把您的姓作為體重來讀取。這會使scanf()失敗。一方面,如果您對姓名請求做出像Li 123這樣的響應(yīng),程序會使用123作為您的體重,雖然您是在程序請求體重之前輸入123的。
2、假定下列每個示例都是某個完整程序的一部分。它們的打印結(jié)果分別是什么?
a.He sold the painting for $234.50.
b.Hi!
c.His Hamlet was funny without being vulgar. (注意,與課后答案不一樣,是因為細看題目的話,此句末尾有一個空格,strlen()函數(shù)輸出字符串中字符(包括空格和標點符號)的準確數(shù)目)
答:
使用\"。示例如下:
下面是一個正確的版本:
a.一個字段寬度等于數(shù)字位數(shù)的十進制整數(shù)。
b.一個形如8A、字段寬度為4的十六進制整數(shù)。
c.一個形如232.346、字段寬度為10的浮點數(shù)。
d.一個形如2.33e+002、字段寬度為12的浮點數(shù)。
e.一個字段寬度為30、左對齊的字符串。
答:
a.%d
b.%4X
c.%10.3f
d.%12.2e
e.%-30s
對于浮點數(shù)來說,字段寬度包含了小數(shù)點右邊的數(shù)字的數(shù)目
7、您會使用哪個轉(zhuǎn)換說明來打印下列各項內(nèi)容?
a.一個字段寬度為15的unsigned long整數(shù)
b.一個形如0x8a、字段寬度為4的十六進制整數(shù)
c.一個形如2.33E+02、字段寬度為12、左對齊的浮點數(shù)
d.一個形如+232.346、字段寬度為10的浮點數(shù)
e.一個字符串的前8個字符,字段寬度為8字符
答:
a.%15lu
b.%#4x(字段寬度應(yīng)放在#和x之間)
c.%-12.2E("-"修飾符使浮點數(shù)左對齊輸出)
d.%+10.3f
e.%-8.8s("-"修飾符使文本左對齊輸出)
8、您會使用什么轉(zhuǎn)換說明來打印下列各項內(nèi)容?
a.一個字段寬度為6、最少有4位數(shù)字的十進制整數(shù)
b.一個字段寬度在參數(shù)列表中給定的八進制整數(shù)
c.一個字段寬度為2的字符
d.一個形如+3.13、字段寬度等于數(shù)字中字符個數(shù)的浮點數(shù)
e.一個字符串的前5個字符,字段寬度為7、左對齊
答:
a.%6.4d
b.%*o(此處為小寫字母o,而不是數(shù)字0)
c.%2c
d.%+.2f
e.%-7.5s
9、為下列每個輸入行提供一個對其進行讀取的scanf()語句,并聲明語句中用到的所有變量或數(shù)組。
a.101
b.22.32 8.34E-09
c.linguini
d.catch 22
e.catch 22(但是跳過catch)
答:
a.
答:
空白字符包括空格、制表符和換行符。C使用空白字符分隔各個語言符號;scanf()使用空白字符分隔相鄰的輸入項。
11、假設(shè)您想在程序中使用圓括號代替花括號。以下方法可以嗎?
#define ( {
#define ) }
答:
會發(fā)生替換。但不幸的是,預(yù)處理器不能區(qū)別哪些圓括號應(yīng)該被替換成花括號,哪些圓括號不應(yīng)該被替換成花括號。因此:
編程練習(xí)
1、
1、再次運行程序清單4.1,但是在要求您輸入名字時,請輸入您的名字和姓氏。發(fā)生了什么?為什么?
答:
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個字符的數(shù)組
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 }
如果輸入名字和姓氏,會輸出如下結(jié)果: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個字符的數(shù)組
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.
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.
2、假定下列每個示例都是某個完整程序的一部分。它們的打印結(jié)果分別是什么?
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);
答: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()函數(shù)輸出字符串中字符(包括空格和標點符號)的準確數(shù)目)
has 43 characters.
d.Is 1.20e+003 the same as 1201.00?
3、在問題2c中,應(yīng)進行哪些修改以使字符串Q引在雙引號中輸出?d.Is 1.20e+003 the same as 1201.00?
答:
使用\"。示例如下:
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 }
答: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、假設(shè)一個程序這樣開始: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 }
1 #define BOOK "War and Peace"
2 int main(void)
3 {
4 float cost = 12.99;
5 float precent = 80.0;
請構(gòu)造一個printf()語句,使用BOOK、cost和percent打印下列內(nèi)容:2 int main(void)
3 {
4 float cost = 12.99;
5 float precent = 80.0;
This copy of "War and Peace" sells for $12.99.
That is 80% of list.
答:That is 80% of list.
printf("This copy of \"%s\" sells for $%.2f.\nThat is %.0f%% of list.", BOOK, cost, percent);
6、您會使用什么轉(zhuǎn)換說明來打印下列各項內(nèi)容?a.一個字段寬度等于數(shù)字位數(shù)的十進制整數(shù)。
b.一個形如8A、字段寬度為4的十六進制整數(shù)。
c.一個形如232.346、字段寬度為10的浮點數(shù)。
d.一個形如2.33e+002、字段寬度為12的浮點數(shù)。
e.一個字段寬度為30、左對齊的字符串。
答:
a.%d
b.%4X
c.%10.3f
d.%12.2e
e.%-30s
對于浮點數(shù)來說,字段寬度包含了小數(shù)點右邊的數(shù)字的數(shù)目
7、您會使用哪個轉(zhuǎn)換說明來打印下列各項內(nèi)容?
a.一個字段寬度為15的unsigned long整數(shù)
b.一個形如0x8a、字段寬度為4的十六進制整數(shù)
c.一個形如2.33E+02、字段寬度為12、左對齊的浮點數(shù)
d.一個形如+232.346、字段寬度為10的浮點數(shù)
e.一個字符串的前8個字符,字段寬度為8字符
答:
a.%15lu
b.%#4x(字段寬度應(yīng)放在#和x之間)
c.%-12.2E("-"修飾符使浮點數(shù)左對齊輸出)
d.%+10.3f
e.%-8.8s("-"修飾符使文本左對齊輸出)
8、您會使用什么轉(zhuǎn)換說明來打印下列各項內(nèi)容?
a.一個字段寬度為6、最少有4位數(shù)字的十進制整數(shù)
b.一個字段寬度在參數(shù)列表中給定的八進制整數(shù)
c.一個字段寬度為2的字符
d.一個形如+3.13、字段寬度等于數(shù)字中字符個數(shù)的浮點數(shù)
e.一個字符串的前5個字符,字段寬度為7、左對齊
答:
a.%6.4d
b.%*o(此處為小寫字母o,而不是數(shù)字0)
c.%2c
d.%+.2f
e.%-7.5s
9、為下列每個輸入行提供一個對其進行讀取的scanf()語句,并聲明語句中用到的所有變量或數(shù)組。
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.2 scanf("%d", &num);
1 float kgs, share;
2 scanf("%f%f", &kgs, &share);
c.2 scanf("%f%f", &kgs, &share);
1 char str[40];
2 scanf("%s", str);
d.2 scanf("%s", str);
1 char str[40];
2 int number;
3 scanf("%s %d", str,&number);
e.2 int number;
3 scanf("%s %d", str,&number);
1 char str[40];
2 int number;
3 scanf("%s %d", str, &number);
10、什么是空白字符?2 int number;
3 scanf("%s %d", str, &number);
答:
空白字符包括空格、制表符和換行符。C使用空白字符分隔各個語言符號;scanf()使用空白字符分隔相鄰的輸入項。
11、假設(shè)您想在程序中使用圓括號代替花括號。以下方法可以嗎?
#define ( {
#define ) }
答:
會發(fā)生替換。但不幸的是,預(yù)處理器不能區(qū)別哪些圓括號應(yīng)該被替換成花括號,哪些圓括號不應(yīng)該被替換成花括號。因此:
1 #include <stdio.h>
2 #define ( {
3 #define ) }
4 int main(void)
5 (
6 printf("Hello World!\n");
7 return 0;
8 )
會變?yōu)椋?br />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 }
所有圓括號都要替換為花括號。2 int main{void}
3 {
4 printf{"Hello World!\n"};
5 return 0;
6 }
編程練習(xí)
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、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 }
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、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 }
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、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 }
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、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 }
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 }
結(jié)果為:(看起來有一點怪啊!!!)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
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好???)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 }
1 #include <stdio.h>
2 #define LITRE 3.785
3 #define KM 1.609
4 int main(void)
5 {
6 float mile; // 英里數(shù)
7 float gallon; // 加侖數(shù)
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 }
2 #define LITRE 3.785
3 #define KM 1.609
4 int main(void)
5 {
6 float mile; // 英里數(shù)
7 float gallon; // 加侖數(shù)
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 }
第3章 數(shù)據(jù)和C
復(fù)習(xí)題
1、對下面的各種數(shù)據(jù)使用合適的數(shù)據(jù)類型:
a.East Simpleton的人口
b.DVD影碟的價格
c.本章出現(xiàn)次數(shù)最多的字母
d.這個字母出現(xiàn)的次數(shù)
答:a.int類型,可以是short、unsigned或unsigned short;人口數(shù)是一個整數(shù)。
b.float類型;價格不太可能正好是一個整數(shù)(您也可以使用double,但實際上并不需要那么高的精度)。
c.char類型。
d.int類型,可以是unsigned。
2、需要用long類型變量代替int類型變量的原因是什么?
答:一個原因是在您的系統(tǒng)中l(wèi)ong可以容納比int類型更大的數(shù);一個原因是如果您確實需要處理更大的值,那么使用一種在所有系統(tǒng)上都能保證至少是32位的類型會使程序的可移植性更好。
3、獲得一個32位的有符號整數(shù),可以使用哪些可移植的數(shù)據(jù)類型?每種選擇的原因是什么?
答:要獲得正好是32位的數(shù),您可以使用int32_t(如果在您的系統(tǒng)上有這一定義的話)。要獲得可存儲至少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寫的下面這個程序中有很多錯誤,找出這些錯誤。
第2行:應(yīng)該是int main(void)
第3行:使用{,而不是(
第4行:在g和h之間應(yīng)該是逗號而不是分號
第5行:無錯誤
第6行:(空行)無錯誤
第7行:在e之前應(yīng)該至少有一個數(shù)字,.1e21或1.e21都是正確的,盡管這個數(shù)有點大。
第8行:無錯誤,至少在語法上沒有
第9行:使用},而不是)
缺少的行:首先,rate沒有被賦值。其次,變量h從來沒有被使用。而且程序永遠不會把它的計算結(jié)果通知給您。這些錯誤都不會阻止程序的運行(盡管可能會向您出示一個警告以說明變量沒有被使用),但是它們確實減弱了程序本來就不多的功能。而且在結(jié)尾處應(yīng)該有一個return語句。
下面是正確版本之一:
答:
7、指出下表中各常量的數(shù)據(jù)類型(在聲明語句中使用的數(shù)據(jù)類型)及其在printf()中的格式說明符,假設(shè)int類型為16位長。
答:
8、假設(shè)一個程序開始處有如下的聲明:
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、假設(shè)ch為char類型變量。使用轉(zhuǎn)義序列、十進制值、八進制字符常量以及十六進制字符常量等方法將其賦值為回車符(假設(shè)使用ASCII編碼)。
答:
b.反斜線字符
c.雙引號字符
d.制表字符
編程練習(xí)(如有錯誤,希望指正!!!)
1、
2、
復(fù)習(xí)題
1、對下面的各種數(shù)據(jù)使用合適的數(shù)據(jù)類型:
a.East Simpleton的人口
b.DVD影碟的價格
c.本章出現(xiàn)次數(shù)最多的字母
d.這個字母出現(xiàn)的次數(shù)
答:a.int類型,可以是short、unsigned或unsigned short;人口數(shù)是一個整數(shù)。
b.float類型;價格不太可能正好是一個整數(shù)(您也可以使用double,但實際上并不需要那么高的精度)。
c.char類型。
d.int類型,可以是unsigned。
2、需要用long類型變量代替int類型變量的原因是什么?
答:一個原因是在您的系統(tǒng)中l(wèi)ong可以容納比int類型更大的數(shù);一個原因是如果您確實需要處理更大的值,那么使用一種在所有系統(tǒng)上都能保證至少是32位的類型會使程序的可移植性更好。
3、獲得一個32位的有符號整數(shù),可以使用哪些可移植的數(shù)據(jù)類型?每種選擇的原因是什么?
答:要獲得正好是32位的數(shù),您可以使用int32_t(如果在您的系統(tǒng)上有這一定義的話)。要獲得可存儲至少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行:應(yīng)該是#include <stdio.h>2 main
3 (
4 float g; h;
5 float tax, rate;
6
7 g = e21;
8 tax = rate * g;
9 )
第2行:應(yīng)該是int main(void)
第3行:使用{,而不是(
第4行:在g和h之間應(yīng)該是逗號而不是分號
第5行:無錯誤
第6行:(空行)無錯誤
第7行:在e之前應(yīng)該至少有一個數(shù)字,.1e21或1.e21都是正確的,盡管這個數(shù)有點大。
第8行:無錯誤,至少在語法上沒有
第9行:使用},而不是)
缺少的行:首先,rate沒有被賦值。其次,變量h從來沒有被使用。而且程序永遠不會把它的計算結(jié)果通知給您。這些錯誤都不會阻止程序的運行(盡管可能會向您出示一個警告以說明變量沒有被使用),但是它們確實減弱了程序本來就不多的功能。而且在結(jié)尾處應(yīng)該有一個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、指出下表中各常量的數(shù)據(jù)類型(在聲明語句中使用的數(shù)據(jù)類型)及其在printf()中的格式說明符。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 }
常量 | 類型 | 說明符 | |
12 | |||
0x3 | |||
'C' | |||
2.34E07 | |||
'\040' | |||
7.0 | |||
6L | |||
6.0f |
答:
常量 | 類型 | 說明符 | |
12 | int | %d | |
0x3 | unsigned int | %#x | |
'C' | char | %c | |
2.34E07 | double | %f | |
'\040' | char | %c | |
7.0 | double | %f | |
6L | long | %ld | |
6.0f | float | %e |
7、指出下表中各常量的數(shù)據(jù)類型(在聲明語句中使用的數(shù)據(jù)類型)及其在printf()中的格式說明符,假設(shè)int類型為16位長。
常量 | 類型 | 說明符 | |
012 | |||
2.9e05L | |||
's' | |||
100000 | |||
'\n' | |||
20.0f | |||
0x44 | |||
答:
常量 | 類型 | 說明符 | |
012 | int | %#0 | |
2.9e05L | long double | %Le | |
's' | char | %c | |
100000 | long | %ld | |
'\n' | char | %c | |
20.0f | float | %f | |
0x44 | unsigned int | %#x | |
8、假設(shè)一個程序開始處有如下的聲明:
1 int imate = 2;
2 long shot = 53456;
3 char grade = 'A';
4 float log = 2.71828;
在下面printf()語句中添上合適的類型說明符:2 long shot = 53456;
3 char grade = 'A';
4 float log = 2.71828;
1 printf("The odds against the %___ were %___ to 1.\n", imate, shot);
2 printf("A score of %___ is not an %___ grade.\n", log, grade);
答: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、假設(shè)ch為char類型變量。使用轉(zhuǎn)義序列、十進制值、八進制字符常量以及十六進制字符常量等方法將其賦值為回車符(假設(shè)使用ASCII編碼)。
答:
1 char ch = '\r';
2 char ch = 13;
3 char ch = '\015';
4 char ch = '\xd';
10、改正下面程序(在C中/表示除法)。2 char ch = 13;
3 char ch = '\015';
4 char ch = '\xd';
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 }
答: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、指出下列轉(zhuǎn)義字符的含義: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 }
1 a.\n
2 b.\\
3 c.\"
4 d.\t
答:a.換行字符2 b.\\
3 c.\"
4 d.\t
b.反斜線字符
c.雙引號字符
d.制表字符
編程練習(xí)(如有錯誤,希望指正!!!)
1、
1 /* 整數(shù)上溢*/
2 #include <stdio.h>
3 int main(void)
4 {
5 int i = 2147483647;
6 unsigned int j = 4294967295;
7
8 /*
9 無符號整數(shù)j像一個汽車里程指示表(形容的太好了,可參考《計算機科學(xué)導(dǎo)論》第3章 數(shù)據(jù)存儲,有圖),
10 當達到最大值時,它將溢出到起始點。整數(shù)i也是同樣。它們的主要區(qū)別是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 }
運行結(jié)果:2 #include <stdio.h>
3 int main(void)
4 {
5 int i = 2147483647;
6 unsigned int j = 4294967295;
7
8 /*
9 無符號整數(shù)j像一個汽車里程指示表(形容的太好了,可參考《計算機科學(xué)導(dǎo)論》第3章 數(shù)據(jù)存儲,有圖),
10 當達到最大值時,它將溢出到起始點。整數(shù)i也是同樣。它們的主要區(qū)別是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
浮點數(shù)的上溢和下溢???(理解的不是很清楚,回頭再來寫)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、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 }
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、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 }
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、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 }
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、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 }
1 #include <stdio.h>
2 int main(void)
3 {
4 int num; // 夸脫數(shù)應(yīng)該為整數(shù)吧!!
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、2 int main(void)
3 {
4 int num; // 夸脫數(shù)應(yīng)該為整數(shù)吧!!
5 printf("Please enter water: ");
6 scanf("%d", &num);
7 printf("The water has %e ", num*950/3.0e-23);
8 return 0;
9 }
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 }
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 }
第2章 C語言概述
復(fù)習(xí)題
1、如何稱呼C程序的基本模塊?
答:它們被稱為函數(shù)。
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 已經(jīng)編好了下面的程序,并想征求你的意見。請幫助他評定。
第2行:使用(),而不是使用{};使用*/來結(jié)束注釋,而不是使用/*。
第3行:使用{,而不是(。
第4行:使用分號來結(jié)束語句。
第5行:Indiana使這一行(空白行)正確!
第6行:使用=,而不是使用:=進行賦值(顯然,Indiana 了解一些Pascal)。每年有52周而不是56周。
第7行:應(yīng)該是printf("There are %d weeks in a year.\n",s);
第9行:源程序沒有第9行,但是應(yīng)該有,它應(yīng)該包含一個結(jié)束花括號}。
在進行這些修改之后,代碼如下:
b.Begone!
0 creature of lard!(注意光標仍留在第2行結(jié)束處。)
c.What?
No/nBonzo?(注意斜線符號”/“沒有反斜線符號”\“所具有的作用,它只是簡單地作為斜線符號被打印出來。)
d.2 + 2 = 4
6、下面哪幾個是C的關(guān)鍵字?main,int,function,char,=
答:int,char(注意main只是一個函數(shù)名,函數(shù)是C中的一個技術(shù)術(shù)語。=是一個運算符)
7、如何以下面的格式輸出words和lines的值:"There were 3020 words and 350 lines"?這里,3020和350代表兩個變量的值。
答:
答:第7行之后,a為5,b為2。第8行之后,a為5,b為5。第9行之后,a為5,b為5。
編程練習(xí)(新手初學(xué),僅供參考!!!)
1、
復(fù)習(xí)題
1、如何稱呼C程序的基本模塊?
答:它們被稱為函數(shù)。
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 已經(jīng)編好了下面的程序,并想征求你的意見。請幫助他評定。
1 include studio.h
2 int main{void} /*該程序可顯示出一年中有多少周/*
3 (
4 int s
5
6 s: = 56;
7 print(There are s weeks in a year.);
8 return 0;
答:第1行:以一個#開始,拼寫出文件名stdio.h,然后把文件名放在一對尖括號中。2 int main{void} /*該程序可顯示出一年中有多少周/*
3 (
4 int s
5
6 s: = 56;
7 print(There are s weeks in a year.);
8 return 0;
第2行:使用(),而不是使用{};使用*/來結(jié)束注釋,而不是使用/*。
第3行:使用{,而不是(。
第4行:使用分號來結(jié)束語句。
第5行:Indiana使這一行(空白行)正確!
第6行:使用=,而不是使用:=進行賦值(顯然,Indiana 了解一些Pascal)。每年有52周而不是56周。
第7行:應(yīng)該是printf("There are %d weeks in a year.\n",s);
第9行:源程序沒有第9行,但是應(yīng)該有,它應(yīng)該包含一個結(jié)束花括號}。
在進行這些修改之后,代碼如下:
1 #include<stdio.h>
2 int main(void) /*該程序可顯示出一年中有多少周/*
3 {
4 int s;
5
6 s = 52;
7 printf("There are %d weeks in a year.\n",s);
8 return 0;
9 }
5、假設(shè)下面的每一個例子都是某個完整程序的一部分,它們每個將輸出什么結(jié)果?2 int main(void) /*該程序可顯示出一年中有多少周/*
3 {
4 int s;
5
6 s = 52;
7 printf("There are %d weeks in a year.\n",s);
8 return 0;
9 }
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?(注意:在句號之后沒有空格。)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);
b.Begone!
0 creature of lard!(注意光標仍留在第2行結(jié)束處。)
c.What?
No/nBonzo?(注意斜線符號”/“沒有反斜線符號”\“所具有的作用,它只是簡單地作為斜線符號被打印出來。)
d.2 + 2 = 4
6、下面哪幾個是C的關(guān)鍵字?main,int,function,char,=
答:int,char(注意main只是一個函數(shù)名,函數(shù)是C中的一個技術(shù)術(shù)語。=是一個運算符)
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、考慮下面的程序: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 }
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行之后程序的狀態(tài)分別是什么?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行之后,a為5,b為2。第8行之后,a為5,b為5。第9行之后,a為5,b為5。
編程練習(xí)(新手初學(xué),僅供參考!!!)
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、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 }
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、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 }
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、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 }
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、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 }
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、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 }
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、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 }
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 }
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 }
第1章 概覽
復(fù)習(xí)題
1、就編程而言,可移植性表示什么?
答:可移植性意味著在一個系統(tǒng)上編寫的C程序經(jīng)過很少改動或不經(jīng)修改就可以在其他系統(tǒng)上運行。如果修改是必要的,則通常只須改變伴隨主程序的一個頭文件(header)中的幾項內(nèi)容即可。
2、解釋源代碼文件、目標代碼文件和可執(zhí)行文件之間的區(qū)別。
答:源代碼文件中包含著程序員使用任何語言編寫的代碼。目標代碼文件包含著機器語言代碼,它并不需要是完整的程序代碼。可執(zhí)行文件包含著組成可執(zhí)行程序的全部機器語言代碼。
3、編程的7個主要步驟是什么?
答:第1步:定義程序目標
第2步:設(shè)計程序
第3步:編寫代碼
第4步:編譯
第5步:運行程序
第6步:調(diào)試
第7步:維護和修改程序
4、編譯器的任務(wù)是什么?
答:編譯器把源代碼(例如,用C語言寫成的代碼)轉(zhuǎn)換成機器語言代碼,也稱對象代碼。
5、鏈接器的任務(wù)是什么?
答:鏈接器把多個來源(例如,已編寫的源代碼、庫代碼和啟動代碼)的目標代碼連接成一個單獨的可執(zhí)行程序。
編程練習(xí)
1、
復(fù)習(xí)題
1、就編程而言,可移植性表示什么?
答:可移植性意味著在一個系統(tǒng)上編寫的C程序經(jīng)過很少改動或不經(jīng)修改就可以在其他系統(tǒng)上運行。如果修改是必要的,則通常只須改變伴隨主程序的一個頭文件(header)中的幾項內(nèi)容即可。
2、解釋源代碼文件、目標代碼文件和可執(zhí)行文件之間的區(qū)別。
答:源代碼文件中包含著程序員使用任何語言編寫的代碼。目標代碼文件包含著機器語言代碼,它并不需要是完整的程序代碼。可執(zhí)行文件包含著組成可執(zhí)行程序的全部機器語言代碼。
3、編程的7個主要步驟是什么?
答:第1步:定義程序目標
第2步:設(shè)計程序
第3步:編寫代碼
第4步:編譯
第5步:運行程序
第6步:調(diào)試
第7步:維護和修改程序
4、編譯器的任務(wù)是什么?
答:編譯器把源代碼(例如,用C語言寫成的代碼)轉(zhuǎn)換成機器語言代碼,也稱對象代碼。
5、鏈接器的任務(wù)是什么?
答:鏈接器把多個來源(例如,已編寫的源代碼、庫代碼和啟動代碼)的目標代碼連接成一個單獨的可執(zhí)行程序。
編程練習(xí)
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 }
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 }