C程式設計--案例(2008年江蘇大學程式設計考研試題 -- 程式設計題)
阿新 • • 發佈:2018-12-05
題目(總):
解答(答案為博主自已所寫,並非最優程式碼,僅供參考)
第一題
- 題目
給一個不多於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);
}
- 程式碼說明
可能是我把問題想的複雜化了。後來寫完後,在網上看了一下別人相關的解答思路,可以推薦給讀者看看。
- 執行結果
第二題
- 題目
打印出所有的 "水仙花數 ",所謂 "水仙花數 "是指一個三位數,其各位數字立方和等於該數本身: 如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;
}
- 程式碼說明
讀者也可以自行參考其他版本答案(推薦)
- 執行結果
第三題
- 題目
見上圖(題目(總))本人為了方便測試,將題目改為了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]);
}
}
- 程式碼說明
這種型別的題目,博主以前也遇見過一些,可以參考我以前寫過的一些案例。
- 執行結果
第四題
- 題目
給定一個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;
}
- 程式碼說明
程式本身並不是很難,邏輯思維理清就行。
推薦參考:
- 執行結果