您的位置:首页 > 编程语言

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

2019-01-26 14:32 405 查看
版权声明:本文由 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):文件的读入读出
  1. feof(in) :是检查in所指向的文件是否结束。如果是,则函数值为1(真),否则为0(假)。
  2. fprint(文件指针,格式字符串,输出列表) :向文件中写入数据
  3. fscanf(文件指针,格式字符串,输入列表) :读出文件数据
    知识点(2):一元二次方程的解的情况
    这边的相关知识可以参考我以前的一篇博客,那里面有更为清晰的讲解:(也可以参考别人的博客),此处不做过多的解释。

https://blog.csdn.net/qq_42887760/article/details/83999502

  • 运行结果

第二题

  • 题目

见上,题目总

  • 参考代码(答案并非最优代码,仅供参考)
#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;
}
  • 代码说明

关于 组合数 的求解有很多种方法,此处题目有限定,但读者不应局限于此,下面推荐几篇博客,以拓宽读者的思维。
推荐参考:

  1. https://blog.csdn.net/dadaguai001/article/details/81559554
  2. https://www.geek-share.com/detail/2711808890.html (组合数的各种性质和定理)
  3. https://www.geek-share.com/detail/2718184143.html
  4. https://www.geek-share.com/detail/2703140190.html (计算排列组合数C(m,r),解决走方格问题)
  • 运行结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: