復(fù)習(xí)題1、再次運(yùn)行程序清單4.1,但是在要求您輸入名字時(shí),請(qǐng)輸入您的名字和姓氏。發(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是一個(gè)有40個(gè)字符的數(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 }
如果輸入名字和姓氏,會(huì)輸出如下結(jié)果:
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.
原因:(參考課后答案)程序不能正常工作。第一個(gè)scanf()語句只是讀入您的名而沒有讀入您的姓,您的姓依然存儲(chǔ)在輸入“緩沖區(qū)”(緩沖區(qū)只是一塊用來存放輸入的臨時(shí)存儲(chǔ)區(qū)域)中。當(dāng)下一個(gè)scanf()語句想要讀入您的體重時(shí),它從上次讀入結(jié)束的地方開始,這樣就試圖把您的姓作為體重來讀取。這會(huì)使scanf()失敗。一方面,如果您對(duì)姓名請(qǐng)求做出像Li 123這樣的響應(yīng),程序會(huì)使用123作為您的體重,雖然您是在程序請(qǐng)求體重之前輸入123的。
2、假定下列每個(gè)示例都是某個(gè)完整程序的一部分。它們的打印結(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);
答:
a.He sold the painting for $234.50.
b.Hi!
c.His Hamlet was funny without being vulgar. (注意,與課后答案不一樣,是因?yàn)榧?xì)看題目的話,此句末尾有一個(gè)空格,
strlen()函數(shù)輸出字符串中字符(包括空格和標(biāo)點(diǎn)符號(hào))的準(zhǔn)確數(shù)目) has 43 characters.
d.Is 1.20e+003 the same as 1201.00?
3、在問題2c中,應(yīng)進(jìn)行哪些修改以使字符串Q引在雙引號(hào)中輸出?
答:
使用\"。示例如下:
printf("\"%s\"\nhas %d characters.\n", Q, strlen(Q));
4、找出下列程序中的錯(cuò)誤。
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 }
答:
下面是一個(gè)正確的版本:
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è)一個(gè)程序這樣開始:
1 #define BOOK "War and Peace"
2 int main(void)
3 {
4 float cost = 12.99;
5 float precent = 80.0;
請(qǐng)構(gòu)造一個(gè)printf()語句,使用BOOK、cost和percent打印下列內(nèi)容:
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、您會(huì)使用什么轉(zhuǎn)換說明來打印下列各項(xiàng)內(nèi)容?
a.一個(gè)字段寬度等于數(shù)字位數(shù)的十進(jìn)制整數(shù)。
b.一個(gè)形如8A、字段寬度為4的十六進(jìn)制整數(shù)。
c.一個(gè)形如232.346、字段寬度為10的浮點(diǎn)數(shù)。
d.一個(gè)形如2.33e+002、字段寬度為12的浮點(diǎn)數(shù)。
e.一個(gè)字段寬度為30、左對(duì)齊的字符串。
答:
a.%d
b.%4X
c.%10.3f
d.%12.2e
e.%-30s
對(duì)于浮點(diǎn)數(shù)來說,字段寬度包含了小數(shù)點(diǎn)右邊的數(shù)字的數(shù)目7、您會(huì)使用哪個(gè)轉(zhuǎn)換說明來打印下列各項(xiàng)內(nèi)容?
a.一個(gè)字段寬度為15的unsigned long整數(shù)
b.一個(gè)形如0x8a、字段寬度為4的十六進(jìn)制整數(shù)
c.一個(gè)形如2.33E+02、字段寬度為12、左對(duì)齊的浮點(diǎn)數(shù)
d.一個(gè)形如+232.346、字段寬度為10的浮點(diǎn)數(shù)
e.一個(gè)字符串的前8個(gè)字符,字段寬度為8字符
答:
a.%15lu
b.%#4x(
字段寬度應(yīng)放在#和x之間)c.%-12.2E("-"修飾符使浮點(diǎn)數(shù)左對(duì)齊輸出)
d.%+10.3f
e.%-8.8s("-"修飾符使文本左對(duì)齊輸出)
8、您會(huì)使用什么轉(zhuǎn)換說明來打印下列各項(xiàng)內(nèi)容?
a.一個(gè)字段寬度為6、最少有4位數(shù)字的十進(jìn)制整數(shù)
b.一個(gè)字段寬度在參數(shù)列表中給定的八進(jìn)制整數(shù)
c.一個(gè)字段寬度為2的字符
d.一個(gè)形如+3.13、字段寬度等于數(shù)字中字符個(gè)數(shù)的浮點(diǎn)數(shù)
e.一個(gè)字符串的前5個(gè)字符,字段寬度為7、左對(duì)齊
答:
a.%6.4d
b.%*o(
此處為小寫字母o,而不是數(shù)字0)c.%2c
d.%+.2f
e.%-7.5s
9、為下列每個(gè)輸入行提供一個(gè)對(duì)其進(jìn)行讀取的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.
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使用空白字符分隔各個(gè)語言符號(hào);scanf()使用空白字符分隔相鄰的輸入項(xiàng)。
11、假設(shè)您想在程序中使用圓括號(hào)代替花括號(hào)。以下方法可以嗎?
#define ( {
#define ) }
答:
會(huì)發(fā)生替換。但不幸的是,預(yù)處理器不能區(qū)別哪些圓括號(hào)應(yīng)該被替換成花括號(hào),哪些圓括號(hào)不應(yīng)該被替換成花括號(hào)。因此:
1 #include <stdio.h>
2 #define ( {
3 #define ) }
4 int main(void)
5 (
6 printf("Hello World!\n");
7 return 0;
8 )
會(huì)變?yōu)椋?br />
1 #include <stdio.h>
2 int main{void}
3 {
4 printf{"Hello World!\n"};
5 return 0;
6 }
所有圓括號(hào)都要替換為花括號(hào)。
編程練習(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、
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 /* 以厘米為單位輸入身高,并以米為單位進(jìn)行顯示 */
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 }
結(jié)果為:(看起來有一點(diǎn)怪啊!!!)
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、(
定義浮點(diǎn)類型的時(shí)候是使用float,還是double好???) 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 }