C程式設計--案例(2016年江蘇大學程式設計考研試題 -- 程式設計題)
阿新 • • 發佈:2018-12-05
題目(總):
解答(答案為博主自已所寫,並非最優程式碼,僅供參考)
第一題
- 題目
已知檔案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;
}
- 程式碼說明
關於 組合數 的求解有很多種方法,此處題目有限定,但讀者不應侷限於此,下面推薦幾篇部落格,以拓寬讀者的思維。
推薦參考:
- 執行結果