1. 程式人生 > >C程式設計--案例(2008年江蘇大學程式設計考研試題 -- 程式設計題)

C程式設計--案例(2008年江蘇大學程式設計考研試題 -- 程式設計題)

題目(總):

在這裡插入圖片描述

解答(答案為博主自已所寫,並非最優程式碼,僅供參考)

第一題

  • 題目

給一個不多於5位的正整數,要求:
1、求出它是幾位數
2、分別輸出每一位數字
3、按逆序輸出各位數字,例如原數為321,應輸出123。

  • 參考程式碼(答案並非最優程式碼,僅供參考)
#include<stdio.h>
#include<math.h>

int getLength(long);
void print(long,int);
void ReversaPrint(long);

int main()
{ long int n=0;//因為int型只能表示-32768~32767之間的整數,故需要Long型資料 int l;//記錄數字的位數 printf("請輸入一個5位數以內的整數: "); scanf("%ld",&n); l=getLength(n); printf("該正數是 %d 位數",l); print(n,l); ReversaPrint(n); return 0; } int getLength(long int n){ int i=0; do{ n/=10; i++; }while(n!=0); return i; } void print
(long n,int l){ printf("\n分別列印每一位數字 : "); for(int i=l;i>0;i--){ int temp=n/pow(10,i-1); printf("%d、",temp); n=n%(int)pow(10,i-1); } putchar(10); } void ReversaPrint(long n){ printf("\n逆序列印每一位數字 : "); int temp=0; do{ temp=n%10; printf("%d、",temp); n/=10; }while(n!=0); putchar(10); }
  • 程式碼說明

    可能是我把問題想的複雜化了。後來寫完後,在網上看了一下別人相關的解答思路,可以推薦給讀者看看。
  1. https://blog.csdn.net/yjxsdzx/article/details/70134428
  2. https://blog.csdn.net/I_peter/article/details/79015462
  3. https://zhidao.baidu.com/question/1432610176449033819.htmlhttps://zhidao.baidu.com/question/1432610176449033819.html
  • 執行結果
    在這裡插入圖片描述
    在這裡插入圖片描述

第二題

  • 題目

打印出所有的 "水仙花數 ",所謂 "水仙花數 "是指一個三位數,其各位數字立方和等於該數本身: 如153是一個水仙花數,153=13 + 53+33

  • 參考程式碼(答案並非最優程式碼,僅供參考)
#include<stdio.h>
#include<math.h>

int main(){
	int a,b,c;//用於存放每位數字
	int temp;
	for(int i=100;i<1000;i++){
		a=i%10;
		b=i/10%10;
		c=i/100%10;
		temp=pow(a,3)+pow(b,3)+pow(c,3);
		if(i==temp){
			printf("%d ",i);
		}
	}
	putchar(10);
	return 0;
}
  • 程式碼說明
    讀者也可以自行參考其他版本答案(推薦)
  1. http://c.biancheng.net/view/504.html
  • 執行結果
    在這裡插入圖片描述

第三題

  • 題目

見上圖(題目(總))本人為了方便測試,將題目改為了4個學生,3門課程。原理差不多。

  • 參考程式碼(答案並非最優程式碼,僅供參考)
#include<stdio.h>
#define S 4//student 學生的個數
#define C 3//class 課程對應的門數

void setAver_Student(struct student []);//注意,引數不能寫成:(struct student);(缺少[])
void setAver_class(struct student [],float (*)[3]);//注意,引數不能寫成:(struct student [],float (*)[]);(缺少2)
void print_Max_class(struct student [],float (*)[3]);
void set_Variance_class(struct student [],float (*)[3]);

//定義結構體
struct student{
	char name[20];//存放學生姓名
	float score[C];//存放學生每門課的成績
	float aver;//存放學生的平均成績
};//不能忘記寫 ;

int main(){
	struct student stu[S],*p;
	p=stu;
	printf("請輸入學生資訊(姓名 %d門課的成績)\n",C);
	for(int i=0;i<S;i++){
		scanf("%s",stu[i].name);//name本身就是地址,不能寫成&stu[i].name;
		for(int j=0;j<C;j++)
			scanf("%f",&stu[i].score[j]);
	}

	setAver_Student(stu);//求學生平均成績
	float aver_subject[C][3];//存放每門課程的平均分,和對應對最高學生的編號,以及該門課程的方差
	setAver_class(stu,aver_subject);//求課程平均分
	print_Max_class(stu,aver_subject);
	set_Variance_class(stu,aver_subject);//求每門課程的方差

	return 0;
}

void setAver_Student(struct student stu[]){
	float sum;
	for(int i=0;i<S;i++){
		sum=0.0;
		for(int j=0;j<C;j++){
			sum+=stu[i].score[j];
		}
		stu[i].aver=sum/C;
	}

	for(i=0;i<S;i++){//輸出學生平均分
		printf("第%d個學生: %10s 的平均分為:%f\n",i+1,stu[i].name,stu[i].aver);
	}
}
void setAver_class(struct student stu[],float (*p)[3]){
	float sum;
	int max_student;//成績最高的學生
	for(int i=0;i<C;i++){
		sum=0;
		p[i][0]=0;
		max_student=0;
		for(int j=0;j<S;j++){
			sum+=stu[j].score[i];
			if(stu[max_student].score[i]<stu[j].score[i])
				max_student=j;
		}
		p[i][0]=sum/S;
		p[i][1]=(float)max_student;
	}
	for(i=0;i<C;i++){//輸出
		printf("第%d門課程的平均分為:%f \n",i+1,p[i][0]);
	}
}
void print_Max_class(struct student stu[],float (*p)[3]){
	for(int i=0;i<C;i++){//輸出(輸出樣式隨意)
		int max_student=(int)p[i][1];
		printf("第%d門課程的最高分學生為:%d \n",i+1,max_student+1);
		printf("(姓名、%d門課的成績為): %s ",C,stu[max_student].name);
		for(int j=0;j<C;j++){
			printf("%5.2f ",stu[max_student].score[j]);
		}
		putchar(10);
	}
}
void set_Variance_class(struct student stu[],float (*p)[3]){
	float sum_diff,diff;//與均分之間的差值
	for(int i=0;i<C;i++){
		sum_diff=0;
		diff=0;
		for(int j=0;j<S;j++){
			diff=stu[j].score[i]-p[i][0];//學生與均分之間的差值
			sum_diff+=diff*diff;
		}
		p[i][2]=sum_diff/S;
	}
	for(i=0;i<C;i++){//輸出
		printf("第%d門課程的平均分方差為:%f \n",i+1,p[i][2]);
	}
}
  • 程式碼說明
    這種型別的題目,博主以前也遇見過一些,可以參考我以前寫過的一些案例。
  1. https://blog.csdn.net/qq_42887760/article/details/84076506
  • 執行結果

在這裡插入圖片描述

第四題

  • 題目

給定一個m*n矩陣A。矩陣A的鞍點是一個位置(i,j),在該位置上的元素是第i行上的最大數,第j列上的最小數。一個矩陣A也可能沒有鞍點。

  • 參考程式碼(答案並非最優程式碼,僅供參考)
#include<stdio.h>
#define m 4
#define n 4

int main(){
	int a[m][n];
	int row_number=m;
	int i,j;
	for(i=0;i<m;i++){//輸入操作
		for(j=0;j<n;j++)
			scanf("%d",&a[i][j]);
	}

	int row_max;
	for(i=0;i<m;i++){
		row_max=0;
		for(j=1;j<n;j++){//拿到行最大元素的下標
			if(a[i][row_max]<a[i][j])
				row_max=j;
		}
		for(j=0;j<m;j++){//判斷是否是列最小元素
			if(a[i][row_max]>a[j][row_max])
				break;
		}
		if(j==row_number)//判斷是否提前跳出迴圈,注意不能寫成if(j==m)
			printf("a[%d,%d]=%d 為鞍點\n",i,row_max,a[i][row_max]);
			
	}

	return 0;
}
  • 程式碼說明
    程式本身並不是很難,邏輯思維理清就行。
    推薦參考:
  1. https://blog.csdn.net/qq_38500430/article/details/72637311
  • 執行結果
    在這裡插入圖片描述