第6周編程題在線測試
NOTE:
- 在預處理命令後~~,主函數前對所要用的函數進行聲明(包括函數返回值、函數名、函數參數類型和參數名),養成良好的編程習慣!!!
- 函數中的return語句可以有多個,但是多個return語句並不表示函數可以用return返回多個值,用return返回的函數值只能有一個。
- 形參也是局部變量,只能在函數體內訪問。
- 在C語言中,實參與其對應的形參各佔獨立的存儲單元,函數調用時的參數傳遞就是把實參的值複製一份給形參,即由實參向形參進行單向傳值,因此形參值的變化不影響實參的值。
- assert()函數—<assert.h>中,常用於debug版本中檢測函數傳入參數的正確性;正式release版本中要刪掉,不能作爲程序的功能。
- 學會防禦式編程。
1. 計算階乘的和v2.0
題目內容:
假設有這樣一個三位數m,其百位、十位和個位數字分別是a、b、c,如果m= a!+b!+c!,則這個三位數就稱爲三位階乘和數(約定0!=1)。請編程計算並輸出所有的三位階乘和數。
函數原型: long Fact(int n);
函數功能:計算n的階乘
#include <stdio.h>
long Fact(int n);
int main()
{
int m;
int a,b,c;
for(m = 100; m <= 999; m++)
{
c = m % 10;
b = (m/10)%10;
a = (m - c - b*10)/100;
if(m == Fact(a) + Fact(b) + Fact(c))
printf("%d\n",m);
}
return 0;
}
long Fact(int n)
{
if(n == 0)return 1;
else return n*Fact(n - 1);
}
2. 計算最大的三位約數
題目內容:
從鍵盤任意輸入一個數n(1000<=n<=1000000),編程計算並輸出n的所有約數中最大的三位數(即最大的三位約數)。如果n小於1000或者大於1000000,則輸出“Input error!”。
函數原型:int Func(int n);
函數功能:計算n的所有約數中最大的三位數
#include <stdio.h>
int Func(int n);
int main()
{
int n,ret;
printf("Input n:");
scanf("%d",&n);
ret = Func(n);
if(ret == -1)printf("Input error!\n");
else
{
printf("%d\n",ret);
}
return 0;
}
int Func(int n)
{
int max = 100;
if(n < 1000 || n > 1000000) return -1;
else
{
for(int i = 100;i <= 999; i++)
{
if(n % i == 0)max = i;
}
return max;
}
}
3. 孔融分梨
題目內容:
孔融沒有兄弟姐妹,到了週末,就找堂兄孔明、堂姐孔茹、堂弟孔偉等7個堂兄妹來到家裏玩。孔融媽媽買了8個梨給孩子們吃,結果小黃狗桐桐淘氣叼走了一個,大花貓鑫鑫偷偷藏了一個。孔融搶過剩下的6個梨,媽媽止住他,說他要和大家平分吃。孔融不高興,說8個人怎麼分6個梨?媽媽說可以用分數解決這個問題。孔融學過分數,說把每個梨切8個相等的塊,每個人拿6塊就行了。媽媽說不用切那麼多塊,每個梨切4個相等的塊,每個人拿3塊正好。孔融糊塗了。孔明說,我來教你。於是孔明給孔融講起了分數的化簡。
分數化簡要化簡到最簡形式,比如12/20可以化簡成6/10和3/5,但3/5是最簡形式;100/8可以化簡成 50 /4和 25 /2 , 而25/2 爲最簡形式。爲了降低難度,不要求將假分數(如7/2)化簡成帶分數(3 )形式。請編程幫助孔融將任意一個分數化簡成最簡形式。先從鍵盤輸入兩個整數m和n(1<=m,n<=10000) ,其中m表示分子,n表示分母。然後輸出分數化簡後的最簡形式。
函數原型:int Gcd(int a, int b);
函數功能:計算a和b的最大公約數,輸入數據超出有效範圍時返回-1。
#include <stdio.h>
int Gcd(int a, int b);
int main()
{
int m,n;
printf("Input m,n:");
scanf("%d,%d",&m,&n);
if(Gcd(m,n) == -1)printf("Input error!\n");
else{
printf("%d/%d\n",m/Gcd(m,n),n/Gcd(m,n));
}
return 0;
}
int Gcd(int a, int b)
{
if(a < 1||b > 10000||b==0)return -1;
else
{
int r;
while(b != 0)
{
r = a%b;
a = b;
b = r;
}
return a;
}
}
4. 素數求和
題目內容:
從鍵盤任意輸入一個整數n,編程計算並輸出1~n之間的所有素數之和。
函數原型:int IsPrime(int x);
函數功能:判斷x是否是素數,若函數返回0,則表示不是素數,若返回1,則代表是素數
#include <stdio.h>
#include<math.h>
int IsPrime(int x);
int main()
{
int n,sum = 0;
printf("Input n:");
scanf("%d",&n);
for(int i = 2; i <= n; i++)
{
if(IsPrime(i))sum += i;
}
printf("sum=%d\n",sum);
return 0;
}
int IsPrime(int x)
{
int i;
for(i = 2; i <= sqrt(x); i++)
{
if(x%i == 0)return 0;
}
return 1;
}
第6周 練兵區編程題
1. 繪製金字塔
題目內容:
要求用戶從鍵盤輸入一個大寫字母,使用嵌套循環產生像下面這樣的金字塔圖案:
A
ABA
ABCBA
ABCDCBA
程序運行結果示例1:
Please input a capital:
D↙
____A
___ABA
__ABCBA
_ABCDCBA
#include <stdio.h>
int main()
{
char c;
int q, m, n, z;
printf("Please input a capital:\n");
scanf(" %c", &c);
for(m = 65; m <= c; m++)//行數
{
for(q = c - m; q >= 0; q--)//打印空格
{
printf("_");
}
for(n = 65; n <= m - 1; n++)//打印左邊
{
printf("%c", n);
}
printf("%c",m);//打印中間
for(z = m - 1; z >= 65; z--)//打印右邊
{
printf("%c", z);
}
printf("\n");
}
return 0;
}
2. 循環嵌套的應用
題目內容:
編寫程序產生如下輸出:
F
FE
FED
FEDC
FEDCB
FEDCBA
#include<stdio.h>
int main()
{
for(int n = 0;n <=5; n++)
{
for(int i = 0;i <= n; i++)
{
printf("%c",'F'-i);
}
printf("\n\n");
}
return 0;
}
3. 利用泰勒級數計算sinx的值
題目內容:
利用泰勒級數計算sinx的值,要求最後一項的絕對值小於10^-5,並統計出此時累加了多少項。請用“利用前項來計算後項”的方法計算累加項,不要使用pow函數編寫程序。程序中所有實數的數據類型都是double類型。
#include<stdio.h>
#include<math.h>
double fact(double n);
int main()
{
int i = 1,sign = -1;
double x,sum = 0,p,q;
printf("Input x:\n");
scanf("%lf",&x);
q = x;
do
{
sign = -sign;
p = q*sign/fact(2*i - 1);
sum += p;
q = q*x*x;
i++;
}while(fabs(p) >= 1e-5);
printf("sin(x)=%.3f,count=%d\n",(float)sum,i - 1);
return 0;
}
double fact(double n)
{
if(n == 0)return 1.0;
else return n*fact(n - 1);
}
4. 計算100~200之間的所有素數之和
題目內容:
計算100~200之間的所有素數之和,判別一個數是否是素數請用給定的函數實現。
函數原型:int fun(int m);
#include<stdio.h>
#include<math.h>
int fun(int m);
int main()
{
int m,sum = 0;
for(m = 100; m <=200; m++)
{
if(fun(m))
{
sum += m;
}
}
printf("sum=%d\n",sum);
return 0;
}
int fun(int m)
{
int i;
for(i = 2; i <= sqrt(m); i++)
{
if(m%i == 0)return 0;
}
return 1;
}
5. 編程實現一個輸入指定範圍內的整數的函數
題目內容:
編程實現一個輸入指定範圍內的整數的函數getint,其完整的函數原型爲:int getint(int min, int max);,它負責接收用戶的輸入進行驗證,保證接收的一定是一個介於min和max之間([min, max]區間內)的一個整數並最後返回該整數。如果用戶輸入不合法,則會提示繼續輸入,直到輸入合法時爲止。要求編寫完整的程序並測試你所寫的getint函數。
#include<stdio.h>
int getint(int min,int max);
int main()
{
int min,max,n;
printf("Please enter min,max:\n");
scanf("%d,%d",&min,&max);
printf("The integer you have entered is:%d\n",getint(min,max));
return 0;
}
int getint(int min,int max)
{
int n;
printf("Please enter an integer [%d..%d]:\n",min,max);
do
{
fflush(stdin);
scanf("%d",&n);
if(n >= min && n <= max)return n;
else
{
printf("Please enter an integer [%d..%d]:\n",min,max);
}
}while(n < min || n > max);
}
7. 編程計算a+aa+aaa+…+aa…a(n個a)的值
題目內容:
編程計算 a+aa+aaa+…+aa…a(n個a)的值,n和a的值由鍵盤輸入。例如,當n=4,a=2,表示計算2+22+222+2222的值。
#include<stdio.h>
long sum_n_a(int a,int n);
int main()
{
int n,a;
printf("Input a,n:\n");
scanf("%d,%d",&a,&n);
printf("sum=%ld\n",sum_n_a(a,n));
return 0;
}
long sum_n_a(int a,int n)
{
int i;
long p = 0;
long sum = 0;
for(i = 0;i < n; i++)
{
p = p*10 + a;
sum += p;
}
return sum;
}
8. 搬磚問題
題目內容:
n塊磚( 27<n<=77 ),36人搬,男搬4,女搬3,兩個小孩擡一塊磚,要求一次搬完,問男人、女人和小孩各需多少人?請用窮舉法編程求解,n的值要求從鍵盤輸入。輸出結果按照男人數量升序給出。
#include<stdio.h>
int main()
{
int n,a,b,c;
printf("Input n(27<n<=77):\n");
scanf("%d",&n);
for(a = 0;a <=36;a++)
{
for(b = 0;b <= 36;b++)
{
c = 36 - a - b;
if(4*a + 3*b + c/2.0 == n)
printf("men=%d,women=%d,children=%d\n",a,b,c);
}
}
return 0;
}
9. 編程輸出某年某月有多少天(考慮到閏年)
題目內容:
從鍵盤輸入一個年份和月份,輸出該月有多少天(考慮閏年),用switch語句編程。
#include<stdio.h>
int IsLeap(int y)
{
if((y%400 == 0)||(y%4 == 0&&y%100 != 0))
return 1;
else
return 0;
}
int main()
{
int y,m;
printf("Input year,month:\n");
scanf("%d,%d",&y,&m);
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:printf("31 days\n");break;
case 4:
case 6:
case 9:
case 11:printf("30 days\n");break;
case 2: if(IsLeap(y))printf("29 days\n");
else
printf("28 days\n");
break;
default:printf("Input error!\n");
}
return 0;
}