C語言程序設計精髓(MOOC第6周 )題

第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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章