版权声明:本文由 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);
}
- 代码说明
可能是我把问题想的复杂化了。后来写完后,在网上看了一下别人相关的解答思路,可以推荐给读者看看。
- 运行结果
第二题
- 题目
打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身: 如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;
}
- 代码说明
程序本身并不是很难,逻辑思维理清就行。
推荐参考:
- 运行结果