C程序设计--案例(2008年江苏大学程序设计考研试题 -- 编程题)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/84405437

题目(总):

在这里插入图片描述

解答(答案为博主自已所写,并非最优代码,仅供参考)

第一题

  • 题目

给一个不多于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
  • 运行结果
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/84405437