1. 程式人生 > >C程式設計--案例(2016年江蘇大學程式設計考研試題 -- 程式設計題)

C程式設計--案例(2016年江蘇大學程式設計考研試題 -- 程式設計題)

題目(總):

在這裡插入圖片描述

解答(答案為博主自已所寫,並非最優程式碼,僅供參考)

第一題

  • 題目

已知檔案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),解決走方格問題)
  • 執行結果
    在這裡插入圖片描述