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

版权声明:本文由 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://blog.csdn.net/litble/article/details/75913032 (组合数的各种性质和定理)
  3. https://blog.csdn.net/sxh759151483/article/details/78161232
  4. https://blog.csdn.net/qikaihuting/article/details/70170469 (计算排列组合数C(m,r),解决走方格问题)
  • 运行结果
    在这里插入图片描述

猜你喜欢

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