版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/84559081
题目(总):
解答(答案为博主自已所写,并非最优代码,仅供参考)
第一题
- 题目
已知文件Coefficient.txt存有多个方程中系数(具体见题目总)。。。。(文件读写 + 一元二次方程的处理)
- 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 1000//假设txt中最多存放了1000组数据
void func(FILE *,float,float,float);//将a,b,c参数传给函数,函数将处理结果存放到指定文件中去
int main(){
float a,b,c;
FILE *in,*out;
if((in=fopen("Coefficient.txt","r"))==NULL){
printf("文件不存在或无法打开!!!");
exit(0);
}
if((out=fopen("result.txt","w"))==NULL){
printf("文件不存在或无法打开!!!");
exit(0);
}
while(!feof(in)){
fscanf(in,"%f %f %f",&a,&b,&c);
printf("读到的数据:a=%5.2f ;b=%5.2f ;c=%5.2f;\n",a,b,c);//校验是否读出数据,可以不写
func(out,a,b,c);
}
fclose(in);//不要忘记关闭文件
fclose(out);
return 0;
}
//函数体部分是处理一元二次方程的内容
//具体可以参考: https://blog.csdn.net/qq_42887760/article/details/83999502
void func(FILE *fp,float a,float b,float c){
float x1,x2,x,real,image;
if(a==0){
if(b==0){
if(c==0){//a=0,b=0,c=0;
fprintf(fp,"方程的解为任意常数;\n");
}
else{//a=0,b=0,c!=0;
fprintf(fp,"方程无解;\n");
}
}
else{//a=0,b!=0;
x=-(c/b);
fprintf(fp,"原方程的的解为:x=%8.4f\n",x);
}
}
else{//a!=0
float disc=b*b-4*a*c;
if(fabs(disc)<1e-6){//a!=0;b^2-4ac=0;
x=-(b/(2*a));
fprintf(fp,"原方程的的解为:x=%8.4f\n",x);
}else if(disc>1e-6){//a!=0;b^2-4ac>0;
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
fprintf(fp,"原方程的的解为:x1=%8.4f ; x2=%8.4f \n",x1,x2);
}else{//a!=0;b^2-4ac>0;
real=-b/(2*a); //实部
image=sqrt(-disc)/(2*a); //虚部
fprintf(fp,"原方程的的解为:x1=%8.4f+%8.4fi ; x2=%8.4f+%8.4fi \n",real,image,real,image);
}
}
}
- 代码说明
知识点(1):文件的读入读出
- feof(in) :是检查in所指向的文件是否结束。如果是,则函数值为1(真),否则为0(假)。
- fprint(文件指针,格式字符串,输出列表) :向文件中写入数据
- fscanf(文件指针,格式字符串,输入列表) :读出文件数据
知识点(2):一元二次方程的解的情况
这边的相关知识可以参考我以前的一篇博客,那里面有更为清晰的讲解:(也可以参考别人的博客),此处不做过多的解释。
- 运行结果
第二题
- 题目
见上,题目总
- 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<string.h>
#define S 5//学生个数
#define C 3//课程数
#define F 3//关注人数
struct Student{
long int id;//学号:long表示范围:-2147483648~2147483647
char name[20];//姓名
float score[C];//成绩
float sum;//总分
};
int main(){
struct Student stu[S];
printf("请输入%d个学生的信息(学号,姓名,%d门成绩)\n",S,C);
int i,j,max;
for(i=0;i<S;i++){//输入操作
stu[i].sum=0;
scanf("%ld %s",&stu[i].id,stu[i].name);
for(j=0;j<C;j++){
scanf("%f",&stu[i].score[j]);
stu[i].sum+=stu[i].score[j];
}
}
for(i=0;i<S-1;i++){//选择排序法
max=i;
for(j=i+1;j<S;j++){
if(stu[j].sum>stu[max].sum)
max=j;
}
if(max!=i){//交换结构体中各元素的值
long int i_temp;
float f_temp;
char ch_temp[20];
i_temp=stu[i].id;
stu[i].id=stu[max].id;
stu[max].id=i_temp;
strcpy(ch_temp,stu[i].name);
strcpy(stu[i].name,stu[max].name);
strcpy(stu[max].name,ch_temp);
for(j=0;j<C;j++){
f_temp=stu[i].score[j];
stu[i].score[j]=stu[max].score[j];
stu[max].score[j]=f_temp;
}
f_temp=stu[i].sum;
stu[i].sum=stu[max].sum;
stu[max].sum=f_temp;
}
}
//输出总分在前10名的学生姓名和学号
printf("总分在前%d名的学生姓名和学号\n",F);
for(i=0 ; stu[i].sum>=stu[F-1].sum ; i++){
printf("姓名=%6s;学号=%6ld;成绩:",stu[i].name,stu[i].id);
for(j=0;j<C;j++){
printf("%d=%5.2f,",j+1,stu[i].score[j]);
}
printf("总分=%6.2f",stu[i].sum);
putchar(10);
}
//输出总分在前10名的学生(且判断成绩是否小于80分)姓名和学号
printf("总分在前%d名的学生(且判断成绩是否小于80分)姓名和学号\n",F);
for(i=0 ; stu[i].sum>=stu[F-1].sum ; i++){
printf("姓名=%6s ;学号=%6d ;80分以下成绩有:",stu[i].name,stu[i].id);
for(j=0;j<C;j++){
if(stu[i].score[j]<80)
printf("成绩%d=%5.2f;",j+1,stu[i].score[j]);
}
putchar(10);
}
return 0;
}
- 代码说明
为了测试的方便,代码中的参数做了调整,读者在运行的时候可以自行调整。 - 运行结果
第三题
- 题目
组合数:Ck n =Ck-1 n-1+Ck n-1
- 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
int C(int n,int k);
int main(){
int n,k,result;
printf("请输入两个参数n,k: ");
scanf("%d %d",&n,&k);
result=C(k,n);
printf("C(k,n)=%d\n",result);
return 0;
}
int C(int k,int n){
if(n==k||k==0)
return 1;
else if(k>0&&k<n)
return C(k-1,n-1)+C(k,n-1);
else
return 0;
}
- 代码说明
关于 组合数 的求解有很多种方法,此处题目有限定,但读者不应局限于此,下面推荐几篇博客,以拓宽读者的思维。
推荐参考:
- 运行结果