你也可以上程序咖(),打開大學幕題板塊,不但有答案,講解,還可以在線答題。
題目1:什么是算術運算?什么是關系運算?什么是邏輯運算?
算術運算:
算術運算即“四則運算”,是加法、減法、乘法、除法、乘方、開方等幾種運算的統稱。
其中加減為一級運算,乘除為二級運算,乘方、開方為三級運算。在一道算式中,如果有多級運算存在,則應先進行高級運算,再進行低一級的運算。
C語言中的算熟運算符包括:+、-、*、/、++、--、% 等種類。
如果只存在同級運算;則從左至右的順序進行;如果算式中有括號,則應先算括號里邊c語言程序設計上機指導與習題選解,再按上述規則進行計算。
示例:$ (1 + 1)^{2} * 4+5 * 3$
解析:
先進行括號內運算1+1,然后進行乘方運算得到結果4.
接下來與4相乘,得到結果16
因為乘法優先級大于加法,因此先進行5*3,得到結果15
最終相加得到結果31
結果:31
關系運算:
關系的基本運算有兩類:一類是傳統的集合運算(并、差、交等),另一類是專門的關系運算(選擇、投影、連接、除法、外連接等),而在C語言中,關系運算通常被認為是比較運算,將兩個數值進行比較,判斷比較結果是否符合給定的條件。
常見的關系運算符包括:=、==、!= 等種類。
其中,前4種關系運算符(= )的優先級別相同,后2種(==、!=)也相同。而前4種高于后2種。
例如, > 優先于 == 。而 > 與 < 優先級相同。
并且,關系運算符的優先級低于算術運算符,關系運算符的優先級高于賦值運算符(=)。
邏輯運算:
在邏輯代數中,有與、或、非三種基本邏輯運算。表示邏輯運算的方法有多種,如語句描述、邏輯代數式、真值表、卡諾圖等。而在C語言中,邏輯運算通常用于使用邏輯運算符將關系表達式或其它邏輯量連接起來組成邏輯表達式用來測試真假值。
常見的邏輯運算符包括:&&、||、! 等種類
&&: 與是雙目運算符,要求有兩個運算對象,表示兩個運算對象都成立,則結果為真,否則結果為假。
例如:(ay)c語言程序設計上機指導與習題選解,表示(ay)同時成立則為真。
||:是雙目運算符,要求有兩個運算對象,表示兩個運算對象只要任意一個成立,則結果為真,否則結果為假。
例如:(ay),表示(ay)兩個對象中任意一個成立則結果為真。
!是單目運算符,只要求有一個運算對象,表示取運算對象反義,運算對象為真則結果為假,運算對象結果為假則結果為真。
例如:!(a>b),表示(a>b)成立時結果為假,不成立時結果為真。
若在一個邏輯表達式中包含多個邏輯運算符,則優先次序為: ! > && > ||。當然若一個邏輯表達式中包含括號括起來的子邏輯,則優先括號內的子邏輯判斷。
示例:
(1>2)||(2>3)&&(4>3) 結果為0
!(1>2)||(2>3)&&(4>3)結果為1
注:&&優先級大于||,((2>3)&&(4>3))無法同時成立,則結果為假,然后與(1>2)結果進行邏輯或運算,兩者都為假因此第一次結果為假。 而第二次!優先級最高,先對(1>2)的結果取邏輯非,得到結果為真,因此結果為真。
題目2:C語言中如何表示“真”和“假”?系統如何判斷一個量的“真”和“假”?
答案:
對于邏輯表達式,若其值為“真",則以1表示,若其值為“假”,則以0表示。但是在判斷一個邏輯量的值時,系統會以0作為“假”,以非0作為“真”。例如3 && 5的值為“真”,系統給出3 && 5的值為1。
題目3:寫出下面各邏輯表達式的值。設a=3,b=4,c=5。
(1) a+b>c && b==c
(2) al|b十c && b-c
(3) !(a>b) && !c || 1
(4) !(x=a) && (y=b) && 0
(5) !(a+b)+c-1 && b十c/2
答案:
(1) 0
(2) 1
(3) 1
(4) 0
(5) 1
題目4:有3個整數a,b,c,由鍵盤輸人,輸出其中最大的數。
答案:
方法一:N-S圖見圖4.1
答案代碼:
#include
int main()
{
int a, b, c;
printf("請輸入3個整數:");
scanf("%d,%d,%d", &a, &b, &c);
if (a < b)
if (b < c)
printf("max=%d\n", c);
else
printf("max=%d\n", b);
else if (a < c)
printf("max=%d\n", c);
else
printf("max=%d\n", a);
return 0;
}
運行結果:
方法二:使用條件表達式,可以使程序更簡明、清晰。
#include
int main()
{
int a, b, c, temp, max;
printf("請輸入3個整數:");
scanf("%d,%d,%d", &a, &b, &c);
temp = (a > b) ? a : b; //將a和b中的大者存入temp中
max = (temp > c) ? temp : c; //將a和b中的大者與c比較,取最大者
printf("3個整數的最大數是%d\n", max);
return 0;
}
運行結果:
題目5:從鍵盤輸入一個小于1000的正數,要求輸出它的平方根(如平方根不是整數,則輸出其整數部分)。要求在輸入數據后先對其進行檢查是否為小于1000 的正數。若不是,則要求重新輸入。
解:答案代碼:
#include
#include
#define M 1000
int main()
{
int i, k;
printf("請輸入一個小于%d的整數i:", M);
scanf("%d", &i);
if (i > M)
{
printf("輸人的數據不符合要求,請重新輸入一個小于%d的整數i;", M);
scanf("%d", &i);
}
k = sqrt(i);
printf("%d的平方根的整數部分是%d\n", i, k);
return 0;
}
運行結果:
①第一次:輸人正確數據。
②第二次:輸人不正確數據。
討論:題目要求輸人的數小于1000,今為了增加程序的靈活性,定義符號常量M為1000,如果題目要求輸入的數小于10000,只須修改指令即可,不必修改主函數。
用if語句檢查輸入的數是否符合要求,如果不符合要求應進行相應的處理。從上面的程序看來是很簡單的,但在實際應用中是很有用的。因為在程序提供用戶使用后,不能保證用戶輸入的數據都是符合要求的。假若用戶輸人了不符合要求的數據怎么辦?如果沒有檢查和補救措施,程序是不能供實際使用的。
本程序的處理方法是:提醒用戶“輸人的數據錯了”,要求重新輸入。但只提醒一次,再錯了怎么辦?在學習了第5章循環之后,可以將程序改為多次檢查,直到正確輸人為止。程序如下:
#include
#include
#define M 1000
int main()
{
int i, k;
printf("請輸入一個小于%d的整數i:", M);
scanf("%d", &i);
while (i > M)
{
printf("輸入的數據不符合要求,請重新輸入一個小于%d的整數i:", M);
scanf("%d", &i);
}
k = sqrt(i);
printf("%d的平方根的整數部分是%d\n", i, k);
return 0;
}
運行結果:
多次輸入不符合要求的數據,均通不過,直到輸入符合要求的數據為止。
這種檢查手段是很重要的,希望讀者能真正掌握。本例只是示意性的,程序比較簡單。有了此基礎,讀者根據此思路完全可以做到對任何條件進行檢查處理,使程序能正常運行,萬無一失。
題目6:有一個函數:
$$y = \begin{cases}x + y= 1 & (x \lt 1) \\2x - 1 & (1 \le x \lt 10) \\3x - 11 & (x \le 10)\end{cases}$$
寫程序,輸入 x 的值,輸出 y 相應的值。
答案代碼:
#include
#include
#define M 1000
int main()
{
int x, y;
printf("輸入x:");
scanf("%d", &x);
if (x < 1) // x<1
{
y = x;
printf("x=%3d, y=x=%d\n", x, y);
}
else if (x < 10) // 1= = 10
{
y = 3 * x - 11;
printf("x=%d, y=3*x-11=%d\n", x, y);
}
return 0;
}
運行結果:
①
②
③
題目7:有一個函數:
$$y = \begin{cases}-1 & (x \lt 0) \\0 & (x = 0) \\1 & (x \gt 0)\end{cases}$$
有人分別編寫了以下兩個程序,請分析它們是否能實現題目要求。不要急于,上機運行程序,先分析上面兩個程序的邏輯,畫出它們的流程圖,分析它們的運行情況。然后上機運行程序,觀察并分析結果。
(1)
#include
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;
}
解:程序(1)的流程圖見圖4. 2。
它不能實現題目的要求。如果輸人的x
運行結果:
x的值為-6,輸出y=0,結果顯然不對。
(2)
#include
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;
}
解:程序(2)的流程圖見圖4.3。
它也不能實現題目的要求。如果輸入的x
運行結果:
x的值為-4,輸出y=0,結果顯然不對。程序(2)中的else子句是和第9行的內嵌的if語句配對,而不與第8行的if語句配對。
一定要注意 if 與 else 的配對關系。配對關系不隨 if 和 else 所出現的列的位置而改變,例如程序(2)中的else與第8行的 if 寫在同一列,但 else 并不因此而與第8行的if語句配對,它只和在它前面的離它最近的 if 配對。
請和教材第 4 章例 4.5 程序對比分析,進一步理解 if-else 的配對規則。
為了使邏輯關系清晰,避免出錯,一般把內嵌的 if 語句放在外層的 else 子句中(如例 4.5 中程序1 那樣),這樣由于有外層的 else 相隔,內嵌的 else 不會被誤認為和外層的 if 配對,而只能與內嵌的 if 配對,這樣就不會搞混,若像本習題的程序(1)和程序(2)那樣寫就很容易出錯。
可與本章例 4.5 中介紹的程序進行對比分析。
題目8:給出一百分制成績,要求輸出成績等級'A'、'B'、'C'、'D'、'E'。90 分以上為'A',80~89分為'B' ,70~70分為'C' ,60~69分為'D' ,60分以下為'E'。
解:答案代碼:
#include
int main()
{
float score;
char grade;
printf("請輸入學生成績:");
scanf("%f", &score);
while (score > 100 || score < 0)
{
printf("\n輸入有誤,請重輸");
scanf("%f", &score);
}
switch ((int)(score / 10))
{
case 10:
case 9:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
grade = 'E';
}
printf("成績是%5.1f,相應的等級是%c\n", score, grade);
return 0;
}
運行結果:
①
②
說明:對輸入的數據進行檢查,如小于0或大于100,要求重新輸入。(int)( score/10)的作用是將(score/10)的值進行強制類型轉換,得到一個整型值。例如,當score的值為78時,(int) (score/10)的值為7。然后在語句中執行case 7中的語句,使grade= 'C'。
題目9:給一個不多于5位的正整數,要求:
①求出它是幾位數;
②分別輸出每一位數字;
③按逆序輸出各位數字,例如原數為321,應輸出123。
解:
#include
int main()
{
int num, indiv, ten, hundred, thousand, ten_thousand, place; //分別代表個位、十位、百位、千位.萬位和位數
printf("請輸入一個整數(0~99999):");
scanf("%d", &num);
if (num > 9999)
place = 5;
else if (num > 999)
place = 4;
else if (num > 99)
place = 3;
else if (num > 9)
place = 2;
else
place = 1;
printf("位數:%d\n", place);
printf("毎位數字為:");
ten_thousand = num / 10000;
thousand = (int)(num - ten_thousand * 10000) / 1000;
hundred = (int)(num - ten_thousand * 10000 - thousand * 1000) / 100;
ten = (int)(num - ten_thousand * 10000 - thousand * 1000 - hundred * 100) / 10;
indiv = (int)(num - ten_thousand * 10000 - thousand * 1000 - hundred * 100 - ten * 10);
switch (place)
{
case 5:
printf("%d,%d,%d,%d,%d", ten_thousand, thousand, hundred, ten, indiv);
printf("\n反序數字為:");
printf("%d%d%d%d%d\n", indiv, ten, hundred, thousand, ten_thousand);
break;
case 4:
printf("%d,%d,%d,%d", thousand, hundred, ten, indiv);
printf("\n反序數字為:");
printf("%d%d%d%d\n", indiv, ten, hundred, thousand);
break;
case 3:
printf("%d,%d,%d", hundred, ten, indiv);
printf("\n反序數字為:");
printf(" %d% d% d(n", indiv, ten, hundred);
break;
case 2:
printf("%d,%d", ten, indiv);
printf("\n反序數字為:");
printf("%d%d\n", indiv, ten);
break;
case 1:
printf("%d", indiv);
printf("\n反序數字為:");
printf("%dn", indiv);
break;
}
return 0;
}
運行結果:
題目10:企業發放的獎金根據利潤提成。利潤 I 低于或等于 100 000 元的,獎金可提成10%;利潤高于100 000 元,低于200 000元(100 0001 000 000時,超過1 000 000元的部分按1%提成。從鍵盤輸入當月利潤 I,求應發獎金總數。
要求:
(1)用if語句編程序;
(2)用 語句編程序。
解:
(1)用 if 語句編程序。
答案代碼:
#include
int main()
{
int i;
double bonus, bon1, bon2, bon4, bon6, bon10;
bon1 = 100000 * 0.1;
bon2 = bon1 + 100000 * 0.075;
bon4 = bon2 + 100000 * 0.05;
bon6 = bon4 + 100000 * 0.03;
bon10 = bon6 + 400000 * 0.015;
printf("請輸入利潤i:");
scanf("%d", &i);
if (i <= 100000)
bonus = i * 0.1;
else if (i <= 200000)
bonus = bon1 + (i - 100000) * 0.075;
else if (i <= 400000)
bonus = bon2 + (i - 200000) * 0.05;
else if (i <= 600000)
bonus = bon4 + (i - 400000) * 0.03;
else if (i <= 1000000)
bonus = bon6 + (i - 600000) * 0.015;
else
bonus = bon10 + (i - 1000000) * 0.01;
printf("獎金是∶.2f\n", bonus);
return 0;
}
運行結果:
此題的關鍵在于正確寫出每一區間的獎金計算公式。例如利潤在 100 000~200 000元時,獎金應由兩部分組成∶
①利潤為 100 000元時應得的獎金,即 100 000元×0.1。
②100 000元以上部分應得的獎金,即(num一100 000)×0.075元。
同理,200 000~400 000 元這個區間的獎金也應由兩部分組成:
①利潤為 200 000元時應得的獎金,即 100 000×0.1+100 000×0.075。
②200 000元以上部分應得的獎金,即(num—200 000)×0.05元。
程序中先把100 000元、200 000元、400 000元、600 000元、1 000 000元各關鍵點的獎金計算出來,即 bonl1,bon2,bon4,bon6 和 bonl0。然后再加上各區間附加部分的獎金即可。
(2)用 語句編程序。
N-S圖見圖4.4。
答案代碼:
#include
int main()
{
int i;
double bonus, bon1, bon2, bon4, bon6, bon10;
int branch;
bon1 = 100000 * 0.1;
bon2 = bon1 + 100000 * 0.075;
bon4 = bon2 + 200000 * 0.05;
bon6 = bon4 + 200000 * 0.03;
bon10 = bon6 + 400000 * 0.015;
printf("請輸入利潤 i∶");
scanf("%d", &i);
branch = i / 100000;
if (branch > 10)
branch = 10;
switch (branch)
{
case 0:
bonus = i * 0.1;
break;
case 1:
bonus = bon1 + (i - 100000) * 0.075;
break;
case 2:
case 3:
bonus = bon2 + (i - 200000) * 0.05;
break;
case 4:
case 5:
bonus = bon4 + (i - 400000) * 0.03;
break;
case 6:
case 7:
case 8:
case 9:
bonus = bon6 + (i - 600000) * 0.015;
break;
case 10:
bonus = bon10 + (i - 1000000) * 0.01;
}
printf("獎金是 .2f\n", bonus);
return 0;
}
運行結果:
題目11:輸入 4個整數,要求按由小到大的順序輸出。?解∶此題采用依次比較的方法排出其大小順序。在學習了循環和數組以后,可以掌握更多的排序方法。
程序如下∶
#include
int main()
{
int t, a, b, c, d;
printf("請輸入4個數∶");
scanf("%d,%d,%d,%d", &a, &b, &c, &d);
printf("a=%d,b=%d,c=%d,d=%d\n", a, b, c, d);
if (a > b)
{
t = a;
a = b;
b = t;
}
if (a > c)
{
t = a;
a = c;
c = t;
}
if (a > d)
{
t = a;
a = d;
d = 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("排序結果如下∶\n");
printf("%d %d %d %d \n", a, b, c, d);
return 0;
}
運行結果:
題目12:有4個圓塔,圓心分別為(2,2)、(一2,2)、(—2,一2)、(2,一2),圓半徑為1,見圖 4.5。這 4個塔的高度為10m,塔以外無建筑物。今輸入任一點的坐標,求該點的建筑高度(塔外的高度為零)。
解:N-S圖見圖 4.6。
答案代碼:
#include
int main()
{
int h = 10;
float x1 = 2, y1 = 2, x2 = -2, y2 = 2, x3 = -2, y3 = -2, x4 = 2, y4 = -2, x, y, d1, d2, d3, d4;
printf("請輸入一個點(x,y)∶");
scanf("%f,%f", &x, &y); //求該點到各中心點距離
d1 = (x - x4) * (x - x4) + (y - y4) * (y - y4);
d2 = (x - x1) * (x - x1) + (y - y1) * (y - y1);
d3 = (x - x2) * (x - x2) + (y - y2) * (y - y2);
d4 = (x - x3) * (x - x3) + (y - y3) * (y - y3);
if (d1 > 1 && d2 > 1 && d3 > 1 && d4 > 1)
h = 0; //判斷該點是否在塔外
printf("該點高度為%d\n", h);
return 0;
}
運行結果:
①
②
關于閏年問題的說明:
在教材第 4章中舉了計算閏年的例子,有的讀者對閏年規則不清楚,紛紛來信詢問。因此,有必要在此對閏年的規定作一些說明:
地球繞太陽轉一周的實際時間為365 天5小時 48 分 46 秒。如果一年只有 365天,每年就多出5個多小時。4年多出的23小時15分4秒,差不多等于一天。于是決定每4年增加1天。但是,它比一天 24小時又少了約45分鐘。如果每100年有25個閏年,就少了18 時 43分20秒,這就差不多等于一天了,這顯然是不合適的。
可以算出,每年多出5小時48分46秒,100年就多出581小時16分40秒。而 25個閏年需要 25×24=600 小時。581小時16分40秒只夠 24個閏年(24×24=576 小時),于是決定每100年只安排24 個閏年(世紀年不作為閏年)。但是這樣每 100年又多出5小時16 分40秒(581小時16分40秒—576小時),于是又決定每 400年增加一個閏年。這樣就比較接近實際情況了。
根據以上情況,決定閏年按以下規則計算:
閏年應能被 4整除(如 2004年是閏年,而 2001年不是閏年),但不是所有能被4 整除的年份都是閏年。在能被 100 整除的年份中,只有同時能被 400 整除的年份才是閏年(如2000年是閏年),能被100整除而不能被400整除的年份(如 1800、1900、2100)不是閏年。這是國際公認的規則。只說"能被 4整除的年份是閏年"是不準確的。
教材中介紹的方法和程序是正確的。