C程式設計(譚浩強)第五版課後題答案 第四章
1. 什麼是算術運算?什麼是關係運算?什麼是邏輯運算?
算術運算:
算術運算即“四則運算”,是加法、減法、乘法、除法、乘方、開方等幾種運算的統稱。
其中加減優先順序為4;乘除優先順序為3;乘方、開方優先順序為2。
在一道算式中,如果有多級運算存在,則應先進行高階運算,再進行低一級的運算。
如果只存在同級運算;則從左至右的順序進行;如果算式中有括號,則應先算括號裡邊,再按上述規則進行計算。
關係運算:
關係的基本運算有兩類:一類是傳統的集合運算(並、差、交等);
另一類是專門的關係運算(選擇、投影、連線、除法、外連線等),而在C語言中,關係運算通常被認為是比較運算,將兩個數值進行比較,判斷比較結果是否符合給定的條件。
常見的關係運算符包括:<、<=、>、>=、==、!= 等種類。
其中,前4種關係運算符(<、<=、>、>= )的優先級別相同為6,後2種(==、!=)優先順序為7。
如果只存在同級運算;則從左至右的順序進行,關係運算符的優先順序高於賦值運算子(=:優先順序為14)。
邏輯運算:
在邏輯代數中,有與、或、非三種基本邏輯運算。
表示邏輯運算的方法有多種,如語句描述、邏輯代數式、真值表、卡諾圖等。
而在C語言中,邏輯運算通常用於使用邏輯運算子將關係表示式或其它邏輯量連線起來組成邏輯表示式用來測試真假值。
常見的邏輯運算子包括:&&(優先順序為11)、||(優先順序為12)、! (優先順序為2)等種類
&&: 與 是雙目運算子,要求有兩個運算物件,表示兩個運算物件都成立,則結果為真,否則結果為假。
||:或 是雙目運算子,要求有兩個運算物件,表示兩個運算物件只要任意一個成立,則結果為真,否則結果為假。
注意:a || b || c,只要a為真,就不必判斷b和c。
!:非 是單目運算子,只要求有一個運算物件,表示取運算物件反義,運算物件為真則結果為假,運算物件結果為假則結果為真。
若在一個邏輯表示式中包含多個邏輯運算子,則優先次序為: ! > && > ||。若一個邏輯表示式中包含括號括起來的子邏輯,則優先括號內的子邏輯判斷。
2. C語言中如何表示“真”和“假”?系統如何判斷一個量的“真”和“假”?
在C語言中邏輯常量只有兩個,即0和1,用來表示兩個對立的邏輯狀態,其中0表示假,1表示真。
邏輯變數與普通代數一樣,也可以用字母、符號、數字及其組合成為的邏輯表示式表示。
對於系統來說,判斷一個邏輯量的值時,系統會以0作為假,以非0作為真。
3. 寫出下面各邏輯表示式的值。設a=3,b=4,c=5。
(1)a + b > c && b == c
(2)a || b + c && b - c
(3)!(a > b) && !c || 1
(4)!(x = a) && (y = b) && 0
(5)!(a + b) + c - 1 && b + c / 2
運算子優先順序: ! > * / > + - > <= >= > == >&& > || > =,有括號優先括號。
3.1 :a + b > c && b == c
轉化為((3+4)> 5)&& (4==5) -> 1 &&0 -> 0
3.2:a || b + c && b - c
轉化為 a ||((b+c)&&(b-c)) -> 3 ||((4+5)&&(4-5)) -> 3 || 1 -> 1
3.3:!(a > b) && !c || 1
轉化為 (!(a > b)&&(!c))|| 1 -> (!(3 > 4)&&(!5))|| 1 -> 0 || 1 -> 1
3.4:!(x = a) && (y = b) && 0
轉化為 (!(x=a)&&(y=b))&& 0 -> (!(x=3)&&(y=4))&& 0 -> 0 && 0 -> 0
3.5:!(a + b) + c - 1 && b + c / 2
轉化為 ((!(a+b))+c-1)&&(b+(c/2)) -> ((!(3+4))+5-1)&&(4+(5/2)) -> 1 && 1 -> 1
4. 有3個整數a, b, c,由鍵盤輸入,輸出其中最大的數。
#include<stdio.h>
int main()
{
int a,b,c;
printf("請輸入三個整數:\n");
scanf("%d%d%d",&a,&b,&c);
if(a<b)
{
int t=a;
a=b;
b=t;
}
if(c>a)
{
int t=a;
a=c;
c=t;
}
printf("最大數為:%d\n",a);
return 0;
}
5.從鍵盤輸入一個小於1000的正數,要求輸出它的平方根(如平方根不是整數,則輸出其整數部分)。要求在輸入資料後先對其進行檢查是否為小於1000 的正數。若不是,則要求重新輸入。
#include<stdio.h>
#include<math.h>
int main()
{
float a,b=0;
scanf("%f",&a);
if(a>=1000 || a<0)
{
printf("請輸入小於1000的正整數:\n");
scanf("%f",&a);
}
b=sqrt(a);
printf("%4.0f的平方根為%4.0f:\n",a,b);
return 0;
}
6. 有一個函式:
$y=\left\{\begin{matrix}
x (x<1)& \\ 2x-1(1<=x<10)
& \\ 3x-11 (10<=x)
&
\end{matrix}\right.$
寫程式,輸入x的值,輸出y相應的值。
#include<stdio.h>
int main()
{
int x,y=0;
printf("請輸入x的值:\n");
scanf("%d",&x);
if(x<1)
y=x;
if(1<=x<10)
y=2*x-1;
if(x>=10)
y=3*x-11;
printf("%d\n",y);
return 0;
}
7. 有一個函式:
$y=\left\{\begin{matrix}
-1 (x<0)& \\ 0(x=0)
& \\ 1 (x>0)
&
\end{matrix}\right.$
有人編寫了以下兩個程式,請分析它們是否能實現題目要求。不要急於上機執行程式,先分析兩個程式的邏輯,畫出它們的流程圖,分析它們的執行情況。然後,上機執行程式,觀察和分析結果。
(1)
#include<stdio.h>
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=-1;
if(x!=0)
if(x>0)
y=1;
else
y=0;
printf("x=%d,y=%d\n",x,y);
return 0;
}
(2)
#include<stdio.h>
int main()
{
int x,y;
printf("enter x:");
scanf("%d",&x);
y=0;
if(x>=0)
if(x>0) y=1;
else y=-1;
printf("x=%d,y=%d\n",x,y);
return 0;
}
(1).
if語句使用過程中,else總是匹配距離自己最近的且沒有配對的if。
因此x!=0具有兩種情況x>0和x<0;因此x=0時y=-1;x>0時y=1;x<0時y=0。
與題意不符。
(2).
if語句使用過程中,else總是匹配距離自己最近的且沒有配對的if。
因此x>=0具有兩種情況x>=0和x<0;因此x<0時y=0;x>0時y=1;x=0時y= -1。
與題意不符。
8. 給出一百分制成績,要求輸出成績等級’A’、‘B’、‘C’、‘D’、‘E’。 90分以上為’A’,80~89分為’B’,70~79分為’C’ ,60~69分為’D’ ,60分以下為’E’。
#include<stdio.h>
int main()
{
int i;
printf("請輸入成績:");
scanf("%d",&i);
switch(i/10)
{
case 9 : printf("A\n") ;break;
case 8 : printf("B\n") ;break;
case 7 : printf("C\n") ;break;
case 6 : printf("D\n") ;break;
default :printf("E\n");
}
return 0;
}
9. 給一個不多於5位的正整數,要求:
①求出它是幾位數;
②分別輸出每一位數字;
③按逆序輸出各位數字,例如原數為321,應輸出123。
#include<stdio.h>
#include<math.h>
int main()
{
int i,x,n,j,m=0;
int a[5];
printf("請輸入一個少於5位數的正整數:\n");
scanf("%d",&x);
j=x;
while(x>0)
{
x=x/10;
m++;
}
for(i=0;i<m;i++)
{
a[i]=j%10;
j=j/10;
}
printf("這是個%d位數\n",m);
printf("各個數是:");
for(i=0;i<m;i++)
printf(" %d",a[i]);
printf("\n");
printf("逆序輸出為:");
for(i=0;i<m;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}
10.企業發放的獎金根據利潤提成。利潤I低於或等於100000元的,獎金可提成10%;利潤高於100000元,低於200000元(100000<I≤200000)時,低於100000元的部分按10%提成,高於100000元的部分,可提成7. 5%;200000<I≤400000時,低於200000元的部分仍按上述辦法提成(下同)。高於200000元的部分按5%提成;400000<<I≤600000元時,高於400000元的部分按3%提成;600000<1≤1000000時,高於600000元的部分按1.5%提成;I>1000000時,超過1000000元的部分按1%提成。從鍵盤輸入當月利潤I,求應發獎金總數。
要求:
(1) 使用if語句編寫程式。
(2) 使用switch語句編寫程式。
(1) 使用if語句編寫程式。
#include <stdio.h>
int main()
{
double i,salary = 0;
printf("請輸入獎金:");
scanf("%lf", &i);
if (i<0)
{
printf("請輸入一個正數\n");
return -1;
}
double salary1 = 100000 * 0.1; //大於100000時0~100000的獎金
double salary2 = (200000 - 100000) * 0.075 + salary1; //大於200000時0~20萬的獎金
double salary3 = (400000 - 200000) * 0.05 + salary2; //大於400000時0~40萬的獎金
double salary4 = (600000 - 400000) * 0.03 + salary3; //大於600000時0~60萬的獎金
double salary5 = (1000000 - 600000) * 0.015 + salary4; //大於1000000時0~100萬的獎金
int grade =i/100000;
if (i <= 100000) {
salary = i * 0.1;//小於100000按10%提成
}else if (i > 100000 && i <= 200000) {
salary = salary1 + (i - 100000) * 0.075;//多出10萬的按比例計算,加上10w的獎金
}else if (i > 200000 && i <= 400000) {
salary = salary2 + (i - 200000) * 0.05;//多出20萬的按比例計算,加上20w的獎金
}else if (i > 400000 && i <= 600000) {
salary = salary3 + (i - 400000) * 0.03;//多出40萬的按比例計算,加上40w的獎金
}else if (i > 600000 && i <= 1000000) {
salary = salary4 + (i - 600000) * 0.015;//多出60萬的按比例計算,加上60w的獎金
}else if (i > 1000000){
salary = salary5 + (i - 1000000) * 0.01;//多出100萬的按比例計算,加上100w的獎金
}
printf("salary:%f\n", salary);
return 0;
}
(2) 使用switch語句編寫程式。
#include <stdio.h>
int main()
{
double i,salary = 0;
printf("請輸入獎金:");
scanf("%lf", &i);
if (i<0)
{
printf("請輸入一個正數\n");
return -1;
}
double salary1 = 100000 * 0.1; //大於100000時0~100000的獎金
double salary2 = (200000 - 100000) * 0.075 + salary1; //大於200000時0~20萬的獎金
double salary3 = (400000 - 200000) * 0.05 + salary2; //大於400000時0~40萬的獎金
double salary4 = (600000 - 400000) * 0.03 + salary3; //大於600000時0~60萬的獎金
double salary5 = (1000000 - 600000) * 0.015 + salary4; //大於1000000時0~100萬的獎金
int grade =i/100000;
switch(grade) {
case 0:
salary = i * 0.1; break;
case 1:
salary = salary1 + (i - 100000) * 0.075; break;
case 2: //會順序執行到下一個break處
case 3:
salary = salary2 + (i - 200000) * 0.05; break;
case 4:
case 5:
salary = salary3 + (i - 400000) * 0.03; break;
case 6:
case 7:
case 8:
case 9:
salary = salary4 + (i - 600000) * 0.015; break;
default:
salary = salary5 + (i - 1000000) * 0.01; break;
}
printf("salary:%f\n", salary);
return 0;
}
11. 輸入4個整數,要求按由小到大的順序輸出。
#include <stdio.h>
int main()
{
int a,b,c,d,t;
printf("請輸入4個整數:");
scanf("%d%d%d%d", &a,&b,&c,&d);
if (a<b){
t=a;a=b;b=t;
}
if(c<d){
t=c;c=d;d=t;
}
if(a<c){
t=a;a=c;c=t;
}
if(b<c){
t=b;b=c;c=t;
}
if(b<d){
t=b;b=d;d=t;
}
if(c<d){
t=c;c=d;d=t;
}
printf("%d %d %d %d\n",a,b,c,d);
return 0;
}
12. 有4個圓塔,圓心分別為(2,2)、(-2,2)、(-2,-2)、(2,-2),圓半徑為1,見圖。這4個塔的高度為10m,塔以外無建築物。今輸入任一點的座標,求該點的建築高度(塔外的高度為零)。
#include <stdio.h>
#include <math.h>
void main()
{
int h;
double x, y, m, n, r;
printf("請輸入座標(x,y):");
scanf("%lf,%lf", &x,&y);
if (fabs(x) > 3 || fabs(y) > 3) {
h = 0;
printf("座標(%f,%f)的高度h=%d\n", x, y, h);
return 0;
}
m = fabs(x) - 2; n = fabs(y) - 2;
r = sqrt(m * m + n * n);
if (r > 1)
h = 0;
else
h = 10;
printf("座標(%f,%f)的高度h=%d\n", x, y, h);
return 0;
}