摘要: 復習題1、將下列十進制數轉換為二進制形式:a. 3b. 13c. 59d. 119答:a. 11b. 1101c. 111011d. 11101112、將下列二進制值轉換為十進制、八進制和十六進制形式:a. 00010101b. 01010101c. 01001100d. 10011101答:a. 21, 025, 0x15b. 85, 0125, 0x55c. 76, 0114, 0x4Cd. ... 閱讀全文
2015年11月14日 #
這是王爽老師的《匯編語言(第3版)》,經知友推薦確實是一本極好的書!
實驗4 [bx]和loop的使用
(1)、(2)assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,64
s:mov [bx],bl ;這里必須是mov [bx],bl,而不能是mov [bx],bx,否則會出現類型不匹配
inc bl
loop s
mov ax,4c00h
int 21h
code ends
end
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,64
s:mov [bx],bl ;這里必須是mov [bx],bl,而不能是mov [bx],bx,否則會出現類型不匹配
inc bl
loop s
mov ax,4c00h
int 21h
code ends
end
摘要: 復習題1、以下模板有什么錯誤?Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->structure { char itable; int&nb... 閱讀全文
摘要: 書中的一個例子,我也是想了半天了!!!有點難度!!!Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/* 把多個文件的內容追加到一個文件中 */#include <stdio.h>#include &... 閱讀全文
摘要: 復習題1、哪一存儲類生成的變量對于包含他們的函數來說是局部變量?答:自動存儲類、寄存器存儲類和靜態空鏈接存儲類2、哪一存儲類的變量在包含它們的程序運行時期內一直存在?答:靜態空鏈接存儲類、靜態內部鏈接存儲類和靜態外部鏈接存儲類3、哪一存儲類的變量可以在多個文件中使用?哪一存儲類的變量只限于在一個文件中使用?答:靜態外部鏈接存儲類和靜態內部鏈接存儲類4、代碼塊作用域變量具有哪種鏈接?答:空鏈接5、關... 閱讀全文
摘要: 今天學到了一個新知識——選擇排序算法核心思想:(查找和放置)選擇剩余最大值的一個辦法就是比較剩余數組的第一和第二個元素。如果第二個元素大,就交換這兩個數據。現在比較第一個和第三個元素。如果第三個大,就交換這兩個數據。每次交換都把大的元素移到上面。繼續這種方法,直到比較第一個和最后一個元素。完成以后,最大的數就在剩余數組的第一個元素中。此時第一個元素已經排好了序,但是數組中的... 閱讀全文
摘要: 這一章感覺好難啊!!!學習筆記:(關于指針和多維數組)Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// 多維數組和指針#include <stdio.h>int main(void){  ... 閱讀全文
問題:編寫一個函數將一個整數轉換成二進制形式?(擴展請移步編程練習9)
1、實際參數和形式參量有何不同?
答:
形式參量(也被稱為形式參數)是一個變量,它在被調函數中進行定義。實際參數是在函數調用中出現的值,它被賦值給形式參量。可以把實際參數認為是在函數被調用時用來初始化形式參量的值。
2、寫出下面所描述的各個函數的ANSI函數頭。注意:只寫出函數頭即可,不需要實現。
a.donut()接受一個int類型的參數,然后輸出若干個0,輸出0的數目等于參數的值。
b.gear()接受兩個int類型的參數并返回int類型的值。
c.stuff_it()的參數包括一個double類型的值以及一個double類型變量的地址,功能是把第一個數值存放到指定的地址中。
答:
a.n_to_char()接受一個int類型的參數并返回一個char類型的值。
b.digits()接受的參數是一個double類型的數值和一個int類型的數值,返回值類型是int。
c.random()不接受參數,返回int類型的數值。
答:
答:
答:
答:(注意:下面這種寫法是錯誤的!!!)
有錯誤。num應該在salami()的參數列表中而不是在花括號之后聲明,而且應該是count++而不是num++。
8、編寫一個函數,使其返回3個整數參數中的最大值。
答:
Please choose one of the following:
1)copy files 2)move files
3)remove files 4)quit
Enter the number of your choice:
a.用一個函數實現菜單的顯示,且該菜單有4個用數字編號的選項并要求你選擇其中之一(輸出應該如題中所示)。
b.編寫一個函數,該函數接受兩個int類型的參數:一個上界和一個下界。在函數中,首先從輸入終端讀取一個整數,如果該整數不在上下界規定的范圍內,則函數重新顯示菜單(使用本題目a部分中的函數)以再次提醒用戶輸入新值。如果輸入數值在規定的范圍內,那么函數應該將數值返回給調用函數。
c.使用本題目a和b部分中的函數編寫一個最小的程序。最小的意思是該程序不需要實現菜單中所描述的功能;它只需要顯示這些選項并能獲取正確的響應即可。
答:(參考課后答案)
1、
#include <stdio.h>
void to_binary(unsigned long n);
int main(void)
{
unsigned long number;
printf("Enter an integer (q to quit): \n");
while(scanf("%lu", &number) == 1)
{
printf("Binary equivalent: ");
to_binary(number);
putchar('\n');
printf("Enter an integer (q to quit): \n");
}
printf("Done!\n");
return 0;
}
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if(n >= 2)
to_binary(n / 2);
putchar('0' + r);
return;
}
復習題void to_binary(unsigned long n);
int main(void)
{
unsigned long number;
printf("Enter an integer (q to quit): \n");
while(scanf("%lu", &number) == 1)
{
printf("Binary equivalent: ");
to_binary(number);
putchar('\n');
printf("Enter an integer (q to quit): \n");
}
printf("Done!\n");
return 0;
}
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if(n >= 2)
to_binary(n / 2);
putchar('0' + r);
return;
}
1、實際參數和形式參量有何不同?
答:
形式參量(也被稱為形式參數)是一個變量,它在被調函數中進行定義。實際參數是在函數調用中出現的值,它被賦值給形式參量。可以把實際參數認為是在函數被調用時用來初始化形式參量的值。
2、寫出下面所描述的各個函數的ANSI函數頭。注意:只寫出函數頭即可,不需要實現。
a.donut()接受一個int類型的參數,然后輸出若干個0,輸出0的數目等于參數的值。
b.gear()接受兩個int類型的參數并返回int類型的值。
c.stuff_it()的參數包括一個double類型的值以及一個double類型變量的地址,功能是把第一個數值存放到指定的地址中。
答:
a.void donut(int n)
b.int gear(int n, int m)
c.void stuff_it(double n, double * d)
3、只寫出下列函數的ANSI C函數頭,不需要實現函數。b.int gear(int n, int m)
c.void stuff_it(double n, double * d)
a.n_to_char()接受一個int類型的參數并返回一個char類型的值。
b.digits()接受的參數是一個double類型的數值和一個int類型的數值,返回值類型是int。
c.random()不接受參數,返回int類型的數值。
答:
a.char n_to_char(int n)
b.int digits(double n, int m)
c.int random(void)
4、設計一個實現兩整數相加并將結果返回的函數。b.int digits(double n, int m)
c.int random(void)
答:
int plus(int n, int m)
{
return n + m;
}
5、假如問題4中的函數實現兩個double類型的數值相加,那么應該如何修改原函數?{
return n + m;
}
答:
double plus(double n, double m)
{
return n + m;
}
6、設計函數alter(),其輸入參數是兩個int類型的變量x和y,功能是分別將這兩個變量的數值改為它們的和以及它們的差。{
return n + m;
}
答:(注意:下面這種寫法是錯誤的!!!)
void alter(int x, int y)
{
x = x + y;
y = x - y;
}
正確的寫法如下:{
x = x + y;
y = x - y;
}
void alter(int * u, int * v)
{
int temp;
temp = *u;
*u = *u + *v;
*v = temp - *v;
}
7、判斷下面的函數定義是否正確。{
int temp;
temp = *u;
*u = *u + *v;
*v = temp - *v;
}
void salami(num)
{
int num, count;
for(count = 1; count <= num; num++)
printf("O salami mio!\n");
}
答:{
int num, count;
for(count = 1; count <= num; num++)
printf("O salami mio!\n");
}
有錯誤。num應該在salami()的參數列表中而不是在花括號之后聲明,而且應該是count++而不是num++。
8、編寫一個函數,使其返回3個整數參數中的最大值。
答:
int max(int x, int y, int z)
{
int max;
if(x > y)
if(x > z)
max = x;
else
max = z;
else
if(y > z)
max = y;
else
max = z;
return max;
}
or (更簡潔一點){
int max;
if(x > y)
if(x > z)
max = x;
else
max = z;
else
if(y > z)
max = y;
else
max = z;
return max;
}
int max(int x, int y, int z)
{
int max = x;
if(y > max)
max = y;
if(z > max)
max = z;
return max;
}
9、給定下面的輸出:{
int max = x;
if(y > max)
max = y;
if(z > max)
max = z;
return max;
}
Please choose one of the following:
1)copy files 2)move files
3)remove files 4)quit
Enter the number of your choice:
a.用一個函數實現菜單的顯示,且該菜單有4個用數字編號的選項并要求你選擇其中之一(輸出應該如題中所示)。
b.編寫一個函數,該函數接受兩個int類型的參數:一個上界和一個下界。在函數中,首先從輸入終端讀取一個整數,如果該整數不在上下界規定的范圍內,則函數重新顯示菜單(使用本題目a部分中的函數)以再次提醒用戶輸入新值。如果輸入數值在規定的范圍內,那么函數應該將數值返回給調用函數。
c.使用本題目a和b部分中的函數編寫一個最小的程序。最小的意思是該程序不需要實現菜單中所描述的功能;它只需要顯示這些選項并能獲取正確的響應即可。
答:(參考課后答案)
#include <stdio.h>
void menu(void);
int get_input(int, int);
int main(void)
{
int res;
menu();
while((res = get_input(1, 4)) != 4)
printf("I like choice %d.\n", res);
printf("Bye!\n");
return 0;
}
void menu(void)
{
printf("Please choose one of the following: \n");
printf("1)copy files 2)move files\n");
printf("3)remove files 4)quit\n");
printf("Enter the number of your choice: \n");
}
int get_input(int min, int max)
{
int number;
scanf("%d", &number);
while(number < min || number > max)
{
printf("%d is not a valid choice; try again.\n", number);
menu();
scanf("%d", &number);
}
return number;
}
編程練習void menu(void);
int get_input(int, int);
int main(void)
{
int res;
menu();
while((res = get_input(1, 4)) != 4)
printf("I like choice %d.\n", res);
printf("Bye!\n");
return 0;
}
void menu(void)
{
printf("Please choose one of the following: \n");
printf("1)copy files 2)move files\n");
printf("3)remove files 4)quit\n");
printf("Enter the number of your choice: \n");
}
int get_input(int min, int max)
{
int number;
scanf("%d", &number);
while(number < min || number > max)
{
printf("%d is not a valid choice; try again.\n", number);
menu();
scanf("%d", &number);
}
return number;
}
1、
#include <stdio.h>
double min(double, double);
int main(void)
{
printf("One of the smaller of the two numbers is %.2f", min(23.34, 12.11));
return 0;
}
double min(double x, double y)
{
return x < y ? x : y;
}
2、double min(double, double);
int main(void)
{
printf("One of the smaller of the two numbers is %.2f", min(23.34, 12.11));
return 0;
}
double min(double x, double y)
{
return x < y ? x : y;
}
#include <stdio.h>
void chline(char ch, int i, int j);
int main(void)
{
chline('$', 3, 5);
return 0;
}
void chline(char ch, int i, int j)
{
int index;
for(index = 1; index < i; index++)
putchar(' ');
for(index = 1; index <= j - i + 1; index++)
putchar(ch);
}
3、void chline(char ch, int i, int j);
int main(void)
{
chline('$', 3, 5);
return 0;
}
void chline(char ch, int i, int j)
{
int index;
for(index = 1; index < i; index++)
putchar(' ');
for(index = 1; index <= j - i + 1; index++)
putchar(ch);
}
#include <stdio.h>
void chline(char ch, int col, int row);
int main(void)
{
chline('$', 3, 5);
return 0;
}
void chline(char ch, int col, int row)
{
int i, j;
for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
putchar(ch);
putchar('\n');
}
}
4、void chline(char ch, int col, int row);
int main(void)
{
chline('$', 3, 5);
return 0;
}
void chline(char ch, int col, int row)
{
int i, j;
for(i = 0; i < row; i++)
{
for(j = 0; j < col; j++)
putchar(ch);
putchar('\n');
}
}
#include <stdio.h>
double computer(double a, double b);
int main(void)
{
printf("%.2f和%.2f的諧均值是:%.3f\n", 0.3, 0.5, computer(0.3, 0.5));
return 0;
}
double computer(double a, double b)
{
double result;
result = 1 / ((1/a + 1/b) / 2);
return result;
}
5、double computer(double a, double b);
int main(void)
{
printf("%.2f和%.2f的諧均值是:%.3f\n", 0.3, 0.5, computer(0.3, 0.5));
return 0;
}
double computer(double a, double b)
{
double result;
result = 1 / ((1/a + 1/b) / 2);
return result;
}
#include <stdio.h>
void larger_of(double *, double *);
int main(void)
{
double x = 23.3;
double y = 34.4;
printf("Originally x = %.1f; y = %.1f\n", x, y);
larger_of(&x, &y);
printf("Now x = %.1f; y = %.1f\n", x, y);
return 0;
}
void larger_of(double * u, double * v)
{
double temp;
temp = *u > *v ? *u : *v;
*u = temp;
*v = temp;
}
6、(第一次碼的程序讀取到換行符的時候也會打印出來,會給人看不明白的感覺,索性按[Enter]鍵的時候就退出循環,不要讀到EOF)void larger_of(double *, double *);
int main(void)
{
double x = 23.3;
double y = 34.4;
printf("Originally x = %.1f; y = %.1f\n", x, y);
larger_of(&x, &y);
printf("Now x = %.1f; y = %.1f\n", x, y);
return 0;
}
void larger_of(double * u, double * v)
{
double temp;
temp = *u > *v ? *u : *v;
*u = temp;
*v = temp;
}
#include <stdio.h>
#include <ctype.h>
void printchar(char ch);
int main(void)
{
char ch;
printf("請輸入要分析的東西:\n");
while((ch = getchar()) != EOF)
{
printchar(ch);
}
return 0;
}
void printchar(char ch)
{
if(isalpha(ch))
{
printf("%c %d\n", ch, toupper(ch) % 'A' + 1);
}
}
修改之后,程序如下:#include <ctype.h>
void printchar(char ch);
int main(void)
{
char ch;
printf("請輸入要分析的東西:\n");
while((ch = getchar()) != EOF)
{
printchar(ch);
}
return 0;
}
void printchar(char ch)
{
if(isalpha(ch))
{
printf("%c %d\n", ch, toupper(ch) % 'A' + 1);
}
}
#include <stdio.h>
#include <ctype.h>
int show_c_location(char ch);
int main(void)
{
char ch;
printf("Please enter some characters: \n");
while((ch = getchar()) != '\n')
printf("%c-%d ", ch, show_c_location(ch));
return 0;
}
int show_c_location(char ch)
{
int result;
if(isalpha(ch))
result = toupper(ch) - 'A' + 1;
else
result = -1;
return result;
}
7、#include <ctype.h>
int show_c_location(char ch);
int main(void)
{
char ch;
printf("Please enter some characters: \n");
while((ch = getchar()) != '\n')
printf("%c-%d ", ch, show_c_location(ch));
return 0;
}
int show_c_location(char ch)
{
int result;
if(isalpha(ch))
result = toupper(ch) - 'A' + 1;
else
result = -1;
return result;
}
#include <stdio.h>
double power(double n, int p);
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while(scanf("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);
printf("%.3g to power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)
{
int i;
double result = 1;
if(n != 0)
{
if(p > 0)
{
for(i = 1; i <= p; i++)
result *= n;
}
else if(p < 0)
{
for(i = 1; i <= -p; i++)
result *= (1 / n);
}
else
result = 1;
}
else
{
if(p == 0)
result = 1;// 0的0次方是一個有爭議的數,本題認為會得到1
else
result = 0;
}
return result;
}
8、double power(double n, int p);
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while(scanf("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);
printf("%.3g to power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)
{
int i;
double result = 1;
if(n != 0)
{
if(p > 0)
{
for(i = 1; i <= p; i++)
result *= n;
}
else if(p < 0)
{
for(i = 1; i <= -p; i++)
result *= (1 / n);
}
else
result = 1;
}
else
{
if(p == 0)
result = 1;// 0的0次方是一個有爭議的數,本題認為會得到1
else
result = 0;
}
return result;
}
#include <stdio.h>
double power(double n, int p);
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while(scanf("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);
printf("%.3g to power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)
{
double result = 1;
if(n != 0)
{
if(p > 0)
result = n * power(n, p-1);
else if(p < 0)
result = (1/n) * power(n, p+1);
else
result = 1;
}
else
{
if(p == 0)
result = 1;// 0的0次方是一個有爭議的數,本題認為會得到1
else
result = 0;
}
return result;
}
9、double power(double n, int p);
int main(void)
{
double x, xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while(scanf("%lf%d", &x, &exp) == 2)
{
xpow = power(x, exp);
printf("%.3g to power %d is %.5g\n", x, exp, xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)
{
double result = 1;
if(n != 0)
{
if(p > 0)
result = n * power(n, p-1);
else if(p < 0)
result = (1/n) * power(n, p+1);
else
result = 1;
}
else
{
if(p == 0)
result = 1;// 0的0次方是一個有爭議的數,本題認為會得到1
else
result = 0;
}
return result;
}
#include <stdio.h>
void to_base_n(unsigned long n, int range);
int main(void)
{
unsigned long number;
int range;
printf("請輸入要轉換的無符號整數和所規定的進制數: \n");
while(scanf("%lu %d", &number, &range) == 2)
{
if(range >= 2 && range <= 10)
{
printf("無符號整數%lu轉換成%d進制數為: ", number, range);
to_base_n(number, range);
putchar('\n');
printf("請輸入要轉換的無符號整數和所規定的進制數: \n");
}
else
printf("所規定的進制數的范圍是2~10,請輸入正確的數字\n");
}
printf("Done!\n");
return 0;
}
void to_base_n(unsigned long n, int range)
{
int r;
r = n % range;
if(n >= range)
to_base_n(n / range, range);
putchar('0' + r);
return;
}
10、(題意理解不清楚,借鑒CSDN——vs9841原作者的做法,腦子太笨,實在想不出來)void to_base_n(unsigned long n, int range);
int main(void)
{
unsigned long number;
int range;
printf("請輸入要轉換的無符號整數和所規定的進制數: \n");
while(scanf("%lu %d", &number, &range) == 2)
{
if(range >= 2 && range <= 10)
{
printf("無符號整數%lu轉換成%d進制數為: ", number, range);
to_base_n(number, range);
putchar('\n');
printf("請輸入要轉換的無符號整數和所規定的進制數: \n");
}
else
printf("所規定的進制數的范圍是2~10,請輸入正確的數字\n");
}
printf("Done!\n");
return 0;
}
void to_base_n(unsigned long n, int range)
{
int r;
r = n % range;
if(n >= range)
to_base_n(n / range, range);
putchar('0' + r);
return;
}
#include <stdio.h>
int Fibonacci(int n);
int main(void)
{
int n = 9;
printf("當n為%d時,斐波納契數值為%d", n, Fibonacci(9));
return 0;
}
int Fibonacci(int n)
{
int a, b, i;
a = 0;
b = 1;
int sum;
if(n == 0)
return 0;
if(n == 1)
return 1;
else
{
for(i = 2; i <= n; i++)
{
sum = a + b;
a = b;
b = sum;
}
return sum;
}
}
總結:總體來說編程練習相對以往來說要簡單了,但第10題沒明白什么意思,所以只能借鑒別人的了,真是天下文章一大抄!
int Fibonacci(int n);
int main(void)
{
int n = 9;
printf("當n為%d時,斐波納契數值為%d", n, Fibonacci(9));
return 0;
}
int Fibonacci(int n)
{
int a, b, i;
a = 0;
b = 1;
int sum;
if(n == 0)
return 0;
if(n == 1)
return 1;
else
{
for(i = 2; i <= n; i++)
{
sum = a + b;
a = b;
b = sum;
}
return sum;
}
}
復習題
1、putchar(getchar())是一個有效的表達式,它實現什么功能?getchar(putchar())也有效嗎?
答:
語句putchar(getchar())使程序讀取下一個輸入字符并打印它,getchar()的返回值作為putchar()的參數。getchar(putchar())則不是合法的,因為getchar()不需要參數而putchar()需要一個參數。
2、下面的每個語句實現什么功能?
a. 顯示字符H
b.如果系統使用ASCII字符編碼,則發出一聲警報
c.把光標移動到下一行的開始
d.退后一格
3、假設您有一個程序count,該程序對輸入的字符進行統計。用count程序設計一個命令行命令,對文件essay中的字符進行計數并將結果保存在名為essayct的文件中。
答:
count < essay > essayct
4、給定問題3中的程序和文件,下面哪個命令是正確的?
答:
a.essayct <essay
b.count essay
c.essay >count
答:
c是正確的。
5、EOF是什么?
答:
它是由getchar()和scanf()返回的信號(一個特定的值),用來表明已經到達了文件的結尾。
6、對給出的輸入,下面每個程序段的輸出是什么(假定ch是int類型的,并且輸入是緩沖的)?
a. 輸入如下所示:
If you quit, I will.[enter]
程序段如下所示:
while ((ch = getchar()) != 'i')
putchar(ch);
b. 輸入如下所示:
Harhar[enter]
程序段如下所示:
while ((ch = getchar()) != '\n')
{
putchar(ch++);
putchar(++ch);
}
答:
a.If you qu
b.HJacrthjacrt
7、C如何處理具有不同文件和換行約定的不同計算機系統?
答:
C的標準I/O庫把不同的文件形式映射為統一的流,這樣就可以按相同的方式對它們進行處理。
8、在緩沖系統中把數值輸入與字符輸入相混合時,您所面臨的潛在問題是什么?
答:
數字輸入跳過空格和換行符,但是字符輸入并不是這樣。假設您編寫了這樣的代碼:
編程練習
1、
1、putchar(getchar())是一個有效的表達式,它實現什么功能?getchar(putchar())也有效嗎?
答:
語句putchar(getchar())使程序讀取下一個輸入字符并打印它,getchar()的返回值作為putchar()的參數。getchar(putchar())則不是合法的,因為getchar()不需要參數而putchar()需要一個參數。
2、下面的每個語句實現什么功能?
a.putchar('H');
b.putchar('\007');
c.putchar('\n');
d.putchar('\b');
答:b.putchar('\007');
c.putchar('\n');
d.putchar('\b');
a. 顯示字符H
b.如果系統使用ASCII字符編碼,則發出一聲警報
c.把光標移動到下一行的開始
d.退后一格
3、假設您有一個程序count,該程序對輸入的字符進行統計。用count程序設計一個命令行命令,對文件essay中的字符進行計數并將結果保存在名為essayct的文件中。
答:
count < essay > essayct
4、給定問題3中的程序和文件,下面哪個命令是正確的?
答:
a.essayct <essay
b.count essay
c.essay >count
答:
c是正確的。
5、EOF是什么?
答:
它是由getchar()和scanf()返回的信號(一個特定的值),用來表明已經到達了文件的結尾。
6、對給出的輸入,下面每個程序段的輸出是什么(假定ch是int類型的,并且輸入是緩沖的)?
a. 輸入如下所示:
If you quit, I will.[enter]
程序段如下所示:
while ((ch = getchar()) != 'i')
putchar(ch);
b. 輸入如下所示:
Harhar[enter]
程序段如下所示:
while ((ch = getchar()) != '\n')
{
putchar(ch++);
putchar(++ch);
}
答:
a.If you qu
b.HJacrthjacrt
7、C如何處理具有不同文件和換行約定的不同計算機系統?
答:
C的標準I/O庫把不同的文件形式映射為統一的流,這樣就可以按相同的方式對它們進行處理。
8、在緩沖系統中把數值輸入與字符輸入相混合時,您所面臨的潛在問題是什么?
答:
數字輸入跳過空格和換行符,但是字符輸入并不是這樣。假設您編寫了這樣的代碼:
int score;
char grade;
printf("Enter the score.\n");
scanf("%d", &score);
printf("Enter the letter grade.\n");
grade = getchar();
假設您輸入分數98,然后按下回車鍵來把分數發送給程序,您同時也發送了一個換行符,它會成為下一個輸入字符被讀取到grade中作為等級的值。如果在字符輸入之前進行了數字輸入,就應該添加代碼以在獲取字符輸入之前剔除換行字符。char grade;
printf("Enter the score.\n");
scanf("%d", &score);
printf("Enter the letter grade.\n");
grade = getchar();
編程練習
1、
#include <stdio.h>
int main(void)
{
int ch;
int count = 0;
while((ch = getchar()) != EOF) // 包括換行符
count++;
printf("The number of characters is %d\n", count);
return 0;
}
2、(覺得這題超難的!!!看了一些他人寫的例子,簡直胡說八道!!!不過還是完美解決了)int main(void)
{
int ch;
int count = 0;
while((ch = getchar()) != EOF) // 包括換行符
count++;
printf("The number of characters is %d\n", count);
return 0;
}
#include <stdio.h>
int main(void)
{
int ch;
int i = 0;
while((ch = getchar()) != EOF)
{
if(ch >= 32) // 可打印字符
{
putchar(ch);
printf("/%d ", ch);
i++;
}
else if(ch == '\n') // 打印換行符
{
printf("\\n");
printf("/%d ", ch);
putchar(ch); // 清除輸入緩沖區里面的換行符
i = 0; // i置為0重新開始計數,因為題目要求每次遇到一個換行符時就要開始打印一個新行
}
else if(ch == '\t') // 打印制表符
{
printf("\\t");
printf("/%d ", ch);
i++;
}
else // 打印控制字符
{
putchar('^');
putchar(ch + 64);
printf("/%d ", ch);
}
if(i == 10)
{
putchar('\n');
i = 0;
}
}
return 0;
}
運行結果如下:int main(void)
{
int ch;
int i = 0;
while((ch = getchar()) != EOF)
{
if(ch >= 32) // 可打印字符
{
putchar(ch);
printf("/%d ", ch);
i++;
}
else if(ch == '\n') // 打印換行符
{
printf("\\n");
printf("/%d ", ch);
putchar(ch); // 清除輸入緩沖區里面的換行符
i = 0; // i置為0重新開始計數,因為題目要求每次遇到一個換行符時就要開始打印一個新行
}
else if(ch == '\t') // 打印制表符
{
printf("\\t");
printf("/%d ", ch);
i++;
}
else // 打印控制字符
{
putchar('^');
putchar(ch + 64);
printf("/%d ", ch);
}
if(i == 10)
{
putchar('\n');
i = 0;
}
}
return 0;
}
I love you!
I/73 /32 l/108 o/111 v/118 e/101 /32 y/121 o/111 u/117(每行打印10個值)
!/33 \n/10(每次遇到一個換行符時就開始一個新行)
My hello world^A
M/77 y/121 /32 h/104 e/101 l/108 l/108 o/111 /32 w/119(每行打印10個值)
o/111 r/114 l/108 d/100 ^A/1 \n/10(每次遇到一個換行符時就開始一個新行)
^Z
3、I/73 /32 l/108 o/111 v/118 e/101 /32 y/121 o/111 u/117(每行打印10個值)
!/33 \n/10(每次遇到一個換行符時就開始一個新行)
My hello world^A
M/77 y/121 /32 h/104 e/101 l/108 l/108 o/111 /32 w/119(每行打印10個值)
o/111 r/114 l/108 d/100 ^A/1 \n/10(每次遇到一個換行符時就開始一個新行)
^Z
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int ch;
int low_count = 0, up_count = 0;
while((ch = getchar()) != EOF)
{
if(islower(ch))
low_count++;
if(isupper(ch))
up_count++;
}
printf("A number of capital letters: %d\n", up_count);
printf("A number of lower case letters: %d\n", low_count);
return 0;
}
4、#include <ctype.h>
int main(void)
{
int ch;
int low_count = 0, up_count = 0;
while((ch = getchar()) != EOF)
{
if(islower(ch))
low_count++;
if(isupper(ch))
up_count++;
}
printf("A number of capital letters: %d\n", up_count);
printf("A number of lower case letters: %d\n", low_count);
return 0;
}
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int main(void)
{
char ch;
long chars = 0L; // 統計單詞的字符數
int words= 0; // 單詞數
bool inword = false; // 如果ch在一個單詞中,則inword為true
printf("Enter text to be analyzed: \n");
while((ch = getchar()) != EOF)
{
if(!isspace(ch) && !ispunct(ch))
chars++;
if(!isspace(ch) && !inword)
{
inword = true;
words++;
}
if(isspace(ch) && inword)
inword = false;
}
printf("The average number of words per word: %ld\n", chars / words);
return 0;
}
5、(二分搜索算法第一次碰見,搞了大半天了,借鑒的是CSDN-----vs9841作者的做法,不過稍微加了下工)#include <ctype.h>
#include <stdbool.h>
int main(void)
{
char ch;
long chars = 0L; // 統計單詞的字符數
int words= 0; // 單詞數
bool inword = false; // 如果ch在一個單詞中,則inword為true
printf("Enter text to be analyzed: \n");
while((ch = getchar()) != EOF)
{
if(!isspace(ch) && !ispunct(ch))
chars++;
if(!isspace(ch) && !inword)
{
inword = true;
words++;
}
if(isspace(ch) && inword)
inword = false;
}
printf("The average number of words per word: %ld\n", chars / words);
return 0;
}
#include <stdio.h>
char get_choice(void);
char get_first(void);
int main(void)
{
int low = 1, high = 100, guess = 50;
char ch;
printf("Pick an integer from 1 to 100. I will try to guess it\n");
printf("Un
is your number %d?\n", guess);
while((ch = get_choice()) != 'q')
{
if(ch == 'a')
{
printf("I knew I could do it!\n");
break;
}
else if(ch == 'b')
{
printf("It is too small!\n");
low = guess + 1;
}
else if(ch == 'c')
{
printf("It is too big!\n");
high = guess - 1;
}
guess = (low + high) / 2;
printf("Un
is your number %d?\n", guess);
}
printf("Done!\n");
return 0;
}
char get_choice(void)
{
int ch;
printf("Enter the letter of your choice: \n");
printf("a. right b. too small\n");
printf("c. too big q. quit\n");
ch = get_first();
while((ch < 'a' || ch > 'c') && ch != 'q')
{
printf("Please respond with a, b, c, or q.\n");
ch = get_first();
}
return ch;
}
char get_first(void)
{
int ch;
ch = getchar();
while(getchar() != '\n')
continue;
return ch;
}
6、char get_choice(void);
char get_first(void);
int main(void)
{
int low = 1, high = 100, guess = 50;
char ch;
printf("Pick an integer from 1 to 100. I will try to guess it\n");
printf("Un

while((ch = get_choice()) != 'q')
{
if(ch == 'a')
{
printf("I knew I could do it!\n");
break;
}
else if(ch == 'b')
{
printf("It is too small!\n");
low = guess + 1;
}
else if(ch == 'c')
{
printf("It is too big!\n");
high = guess - 1;
}
guess = (low + high) / 2;
printf("Un

}
printf("Done!\n");
return 0;
}
char get_choice(void)
{
int ch;
printf("Enter the letter of your choice: \n");
printf("a. right b. too small\n");
printf("c. too big q. quit\n");
ch = get_first();
while((ch < 'a' || ch > 'c') && ch != 'q')
{
printf("Please respond with a, b, c, or q.\n");
ch = get_first();
}
return ch;
}
char get_first(void)
{
int ch;
ch = getchar();
while(getchar() != '\n')
continue;
return ch;
}
char get_first(void)
{
int ch;
while((ch = getchar()) == '\n')
continue;
while(getchar() != '\n')
continue;
return ch;
}
7、{
int ch;
while((ch = getchar()) == '\n')
continue;
while(getchar() != '\n')
continue;
return ch;
}
#include <stdio.h>
#define WORK_OVERTIME 40
#define MULTIPLE 1.5
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
#define BREAK1 300
#define BREAK2 450
#define BASE1 (BREAK1 * RATE1)
#define BASE2 (BASE1 + (BREAK2 - BREAK1) * RATE2)
char get_choice(void);
char get_first(void);
int main(void)
{
int hour, choise;
double total, tax, net_pay;
double base_pay; // 基本工資等級不能用#define來定義了,因為它要隨著程序而改變了,書上真是胡說八道
while((choise = get_choice()) != 'q')
{
switch(choise)
{
case 'a':
base_pay = 8.15;
break; // break只是導致程序脫離switch語句,跳到switch之后的下一條語句!!!
case 'b':
base_pay = 9.33;
break;
case 'c':
base_pay = 10.00;
break;
case 'd':
base_pay = 11.20;
break;
default:
printf("Program error!\n");
break;
}
printf("Please enter the hour used: ");
scanf("%d", &hour); // 獲取每周工作小時數時沒有像書上那樣判斷,我偷懶了!!!
if(hour <= WORK_OVERTIME)
{
total = hour * base_pay;
if (total <= BREAK1)
{
tax = total * RATE1;
net_pay = total - tax;
}
else
{
tax = BASE1 + (total - BREAK1) * RATE2;
net_pay = total - tax;
}
}
else
{
total = base_pay * WORK_OVERTIME + (hour - WORK_OVERTIME) * MULTIPLE * base_pay;
if(total <= BREAK2)
{
tax = BASE1 + (total - BREAK1) * RATE2;
net_pay = total - tax;
}
else
{
tax = BASE2 + (total - BREAK2) * RATE3;
net_pay = total - tax;
}
}
printf("The total pay: %.2f; tax: %.2f; net pay: %.2f\n", total, tax, net_pay);
}
printf("Bye!\n");
return 0;
}
char get_choice(void)
{
int ch;
printf("*****************************************************************\n");
printf("Enter number corresponding to the desired pay rate or action:\n");
printf("a) $8.75/hr\tb) $9.33/hr\n");
printf("c) $10.00/hr\td) $11.20/hr\n");
printf("q) quit\n");
printf("*****************************************************************\n");
printf("Please enter your choise: ");
ch = get_first();
while((ch < 'a' || ch > 'd') && ch != 'q')
{
printf("Please respond with a, b, c, d, or q.\n");
ch = get_first();
}
return ch;
}
char get_first(void)
{
int ch;
while((ch = getchar()) == '\n')
continue;
while(getchar() != '\n')
continue;
return ch;
}
8、#define WORK_OVERTIME 40
#define MULTIPLE 1.5
#define RATE1 0.15
#define RATE2 0.20
#define RATE3 0.25
#define BREAK1 300
#define BREAK2 450
#define BASE1 (BREAK1 * RATE1)
#define BASE2 (BASE1 + (BREAK2 - BREAK1) * RATE2)
char get_choice(void);
char get_first(void);
int main(void)
{
int hour, choise;
double total, tax, net_pay;
double base_pay; // 基本工資等級不能用#define來定義了,因為它要隨著程序而改變了,書上真是胡說八道
while((choise = get_choice()) != 'q')
{
switch(choise)
{
case 'a':
base_pay = 8.15;
break; // break只是導致程序脫離switch語句,跳到switch之后的下一條語句!!!
case 'b':
base_pay = 9.33;
break;
case 'c':
base_pay = 10.00;
break;
case 'd':
base_pay = 11.20;
break;
default:
printf("Program error!\n");
break;
}
printf("Please enter the hour used: ");
scanf("%d", &hour); // 獲取每周工作小時數時沒有像書上那樣判斷,我偷懶了!!!
if(hour <= WORK_OVERTIME)
{
total = hour * base_pay;
if (total <= BREAK1)
{
tax = total * RATE1;
net_pay = total - tax;
}
else
{
tax = BASE1 + (total - BREAK1) * RATE2;
net_pay = total - tax;
}
}
else
{
total = base_pay * WORK_OVERTIME + (hour - WORK_OVERTIME) * MULTIPLE * base_pay;
if(total <= BREAK2)
{
tax = BASE1 + (total - BREAK1) * RATE2;
net_pay = total - tax;
}
else
{
tax = BASE2 + (total - BREAK2) * RATE3;
net_pay = total - tax;
}
}
printf("The total pay: %.2f; tax: %.2f; net pay: %.2f\n", total, tax, net_pay);
}
printf("Bye!\n");
return 0;
}
char get_choice(void)
{
int ch;
printf("*****************************************************************\n");
printf("Enter number corresponding to the desired pay rate or action:\n");
printf("a) $8.75/hr\tb) $9.33/hr\n");
printf("c) $10.00/hr\td) $11.20/hr\n");
printf("q) quit\n");
printf("*****************************************************************\n");
printf("Please enter your choise: ");
ch = get_first();
while((ch < 'a' || ch > 'd') && ch != 'q')
{
printf("Please respond with a, b, c, d, or q.\n");
ch = get_first();
}
return ch;
}
char get_first(void)
{
int ch;
while((ch = getchar()) == '\n')
continue;
while(getchar() != '\n')
continue;
return ch;
}
#include <stdio.h>
char get_choice(void);
char get_first(void);
float get_float(void);
int main(void)
{
char choise;
float first_number, second_number;
while((choise = get_choice()) != 'q')
{
printf("Enter first number: ");
first_number = get_float();
printf("Enter second number: ");
second_number = get_float();
switch(choise)
{
case 'a':
printf("%.1f + %.1f = %.1f\n", first_number, second_number, first_number + second_number);
break;
case 's':
printf("%.1f - %.1f = %.1f\n", first_number, second_number, first_number - second_number);
break;
case 'm':
printf("%.1f * %.1f = %.1f\n", first_number, second_number, first_number * second_number);
break;
case 'd':
if(second_number == 0)
{
printf("Enter a number other than 0: ");
second_number = get_float();
printf("%.1f / %.1f = %.1f\n", first_number, second_number, first_number / second_number);
}
else
printf("%.1f / %.1f = %.1f\n", first_number, second_number, first_number / second_number);
break;
default:
printf("Program error!\n");
break;
}
}
printf("Bye.\n");
return 0;
}
char get_choice(void)
{
int ch;
printf("Enter the operation of your choice: \n");
printf("a. add\ts. subtract\n");
printf("m. multiply\td. divide\n");
printf("q. quit\n");
ch = get_first();
while(ch != 'a' && ch != 's' && ch != 'm' && ch != 'd' && ch != 'q')
{
printf("Please respond with a, s, m, d, or q.\n");
ch = get_first();
}
return ch;
}
char get_first(void)
{
int ch;
while((ch = getchar()) == '\n')
continue;
while(getchar() != '\n')
continue;
return ch;
}
float get_float(void)
{
float input;
char ch;
while((scanf("%f", &input)) != 1)
{
while((ch = getchar()) != '\n')
putchar(ch);
printf(" is not a number.\nPlease enter a ");
printf("number, such as 2.5, -1.78E8, or 3: ");
}
return input;
}
char get_choice(void);
char get_first(void);
float get_float(void);
int main(void)
{
char choise;
float first_number, second_number;
while((choise = get_choice()) != 'q')
{
printf("Enter first number: ");
first_number = get_float();
printf("Enter second number: ");
second_number = get_float();
switch(choise)
{
case 'a':
printf("%.1f + %.1f = %.1f\n", first_number, second_number, first_number + second_number);
break;
case 's':
printf("%.1f - %.1f = %.1f\n", first_number, second_number, first_number - second_number);
break;
case 'm':
printf("%.1f * %.1f = %.1f\n", first_number, second_number, first_number * second_number);
break;
case 'd':
if(second_number == 0)
{
printf("Enter a number other than 0: ");
second_number = get_float();
printf("%.1f / %.1f = %.1f\n", first_number, second_number, first_number / second_number);
}
else
printf("%.1f / %.1f = %.1f\n", first_number, second_number, first_number / second_number);
break;
default:
printf("Program error!\n");
break;
}
}
printf("Bye.\n");
return 0;
}
char get_choice(void)
{
int ch;
printf("Enter the operation of your choice: \n");
printf("a. add\ts. subtract\n");
printf("m. multiply\td. divide\n");
printf("q. quit\n");
ch = get_first();
while(ch != 'a' && ch != 's' && ch != 'm' && ch != 'd' && ch != 'q')
{
printf("Please respond with a, s, m, d, or q.\n");
ch = get_first();
}
return ch;
}
char get_first(void)
{
int ch;
while((ch = getchar()) == '\n')
continue;
while(getchar() != '\n')
continue;
return ch;
}
float get_float(void)
{
float input;
char ch;
while((scanf("%f", &input)) != 1)
{
while((ch = getchar()) != '\n')
putchar(ch);
printf(" is not a number.\nPlease enter a ");
printf("number, such as 2.5, -1.78E8, or 3: ");
}
return input;
}
摘要: 復習題1、確定哪個表達式為true,哪個為false。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> a.100 > 3 && 'a' >&nbs... 閱讀全文
摘要: 復習題1、給出每行之后quack的值Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> int quack = 2; quack +... 閱讀全文
復習題
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行:應該有#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;。
下面是一個正確的版本:
主要問題在于判斷語句(sec是否大于0?)和獲取sec值的scanf()語句之間的關系。具體地說,第一次進行判斷時,程序還沒有機會來獲得sec的值,這樣就會對碰巧處在那個內存位置的一個垃圾值進行比較。一個比較笨拙的解決方法是對sec進行初始化,比如把它初始化為1,這樣就可以通過第一次判斷。但是還有一個問題,當最后輸入0來停止程序時,在循環結束之前不會檢查sec,因而0秒的結果也被打印出來。更好的方法是使scanf()語句在進行while判斷之前執行。可以通過像下面這樣改變程序的讀取部分來做到這一點:
5、下面的程序將打印什么?
%s! C is cool!
! C is cool!
11
11
12
11
6、下面的程序將打印什么?
SOS: 4 4.00
7、下面的程序將打印出什么?
1 2 3 4 5 6 7 8 9 10(注意:每個數字占據5列的寬度)
8、修改上一個程序,讓它打印從a到g的字母。
答:
a.
a.
1 2
b.
101
102
103
104
c.
stuvw
10、下面的程序將打印什么?
這是一個構造有缺陷的程序。因為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、假定所有的變量都是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行:應該有#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相比,它有什么缺點?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()語句之間的關系。具體地說,第一次進行判斷時,程序還沒有機會來獲得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()語句。這是處理這類問題的一個常用方法。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、下面的程序將打印什么?
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、下面的程序將打印什么?
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、下面的程序將打印出什么?
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(注意:每個數字占據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循環的一部分。因此它只是在while循環結束之后被調用一次,我看成一個代碼塊了)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、下面的程序將打印什么?
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 }
這是一個構造有缺陷的程序。因為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、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()函數,還是用目前的知識弄不出來,啊!)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章 循環部分,原來可以這樣做,是我讀書太不用心了!
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 }
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 }
復習題
1、再次運行程序清單4.1,但是在要求您輸入名字時,請輸入您的名字和姓氏。發生了什么?為什么?
答:
原因:(參考課后答案)程序不能正常工作。第一個scanf()語句只是讀入您的名而沒有讀入您的姓,您的姓依然存儲在輸入“緩沖區”(緩沖區只是一塊用來存放輸入的臨時存儲區域)中。當下一個scanf()語句想要讀入您的體重時,它從上次讀入結束的地方開始,這樣就試圖把您的姓作為體重來讀取。這會使scanf()失敗。一方面,如果您對姓名請求做出像Li 123這樣的響應,程序會使用123作為您的體重,雖然您是在程序請求體重之前輸入123的。
2、假定下列每個示例都是某個完整程序的一部分。它們的打印結果分別是什么?
a.He sold the painting for $234.50.
b.Hi!
c.His Hamlet was funny without being vulgar. (注意,與課后答案不一樣,是因為細看題目的話,此句末尾有一個空格,strlen()函數輸出字符串中字符(包括空格和標點符號)的準確數目)
答:
使用\"。示例如下:
下面是一個正確的版本:
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.
答:
空白字符包括空格、制表符和換行符。C使用空白字符分隔各個語言符號;scanf()使用空白字符分隔相鄰的輸入項。
11、假設您想在程序中使用圓括號代替花括號。以下方法可以嗎?
#define ( {
#define ) }
答:
會發生替換。但不幸的是,預處理器不能區別哪些圓括號應該被替換成花括號,哪些圓括號不應該被替換成花括號。因此:
編程練習
1、
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 }
如果輸入名字和姓氏,會輸出如下結果: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.
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、假定下列每個示例都是某個完整程序的一部分。它們的打印結果分別是什么?
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()函數輸出字符串中字符(包括空格和標點符號)的準確數目)
has 43 characters.
d.Is 1.20e+003 the same as 1201.00?
3、在問題2c中,應進行哪些修改以使字符串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、假設一個程序這樣開始: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;
請構造一個printf()語句,使用BOOK、cost和percent打印下列內容: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、您會使用什么轉換說明來打印下列各項內容?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.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、假設您想在程序中使用圓括號代替花括號。以下方法可以嗎?
#define ( {
#define ) }
答:
會發生替換。但不幸的是,預處理器不能區別哪些圓括號應該被替換成花括號,哪些圓括號不應該被替換成花括號。因此:
1 #include <stdio.h>
2 #define ( {
3 #define ) }
4 int main(void)
5 (
6 printf("Hello World!\n");
7 return 0;
8 )
會變為: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 }
編程練習
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 }
結果為:(看起來有一點怪啊!!!)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; // 英里數
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 }
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 }