12月17號
阿新 • • 發佈:2020-12-23
#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 3 typedef struct students{ int id; char name[20];// char subject[10]; float perd; float mid; float final; float total; char level[10]; }STU; void print(STU s[], int n); void input(STU s[],intn); int fail(STU s[] , STU a[], int n ); void calc(STU s[], int n); void sort (STU s[], int n); int main(){ STU s[N], a[N]; int k; printf("錄入學生成績資訊:\n"); input(s, N); printf("\n"); printf("成績處理..."); printf("\n"); calc(s, N); k = fail(s, a, N); sort(s, N); printf("學生成績排名情況:\n"); printf("------------------\n"); print(s,N); printf("\n不及格學生資訊:\n"); printf("----------------\n"); print(a, k); return 0; } void input(STU s[],int n){ int i; for(i = 0; i < n; i++) scanf("%d %s %s %f %f %f",&s[i].id, s[i].name, s[i].subject,&s[i].perd, &s[i].mid, &s[i].final); } void print(STU s[], int n){ int i = 0; printf(" 學號 姓名 考試科目 平時成績 期中成績 期末成績 總成績 成績等級\n"); for(; i < n; i++) printf("%5d %6s %7s %8.1f %9.1f %9.1f %8.1f %3s\n",s[i].id, s[i].name, s[i].subject, s[i].perd, s[i].mid, s[i].final,s[i].total, s[i].level); } void calc (STU s[], int n){ int i; for(i = 0 ;i < n ; i++){ s[i].total = s[i].perd * 0.2 + s[i].mid * 0.2 + s[i].final * 0.6; if(s[i].total >= 90) strcpy(s[i].level,"優"); else if(s[i].total >= 80 && s[i].total < 90) strcpy(s[i].level,"良"); else if(s[i].total >= 70 && s[i].total < 80) strcpy(s[i].level,"中"); else if(s[i].total >= 60 && s[i].total < 70) strcpy(s[i].level,"及格"); else strcpy(s[i].level, "不及格"); } } void sort(STU s[], int n){ int i , j; float min; STU t; for(i = n - 1; i > 0; i-- ){ j = i - 1; min = s[i].total; for( ; j >= 0; j--) { if(s[j].total < min ){ min = s[j].total; t = s[j]; s[j] = s[i]; s[i] = t; } } } } int fail(STU s[],STU a[], int n){ int i,j = 0 ; for(i = 0; i < n ; i++) if(s[i].total < 60) a[j++] = s[i]; return j; }
#include<stdio.h> const int N = 5; typedef struct student{ long no; char name[20]; int score; }STU; void input(STU s[], int n); int findMinlist(STU s[], STU t[], int n); void output(STU s[], int n); int main(){ STU stu[N], minlist[N]; int count; printf("錄入%d個學生的資訊\n", N); input(stu, N); printf("\n統計最低分人數和學生資訊...\n"); count = findMinlist(stu , minlist , N); printf("\n一共有%d個最低分, 資訊如下:\n"); output(minlist, count ); return 0; } void input(STU s[], int n){ int i; for( i = 0 ;i < n; i++) scanf("%ld %s %d", &s[i].no, s[i].name , &s[i].score); } void output(STU s[], int n){ int i ; for(i = 0; i < n ;i++) printf("%ld %s %d\n",s[i].no, s[i].name, s[i].score); } int findMinlist(STU s[], STU t[], int n){ int i , j,min, sum = 0; STU temp; for(i = n - 1; i > 0 ;i--){ j = i - 1; min = s[i].score; for(; j >= 0; j--){ if(s[j].score < min){ min = s[j].score; temp = s[i]; s[i] = s[j]; s[j] =temp; } } } t[sum++] = s[n - 1]; for(i = n - 2; i >= 0; i--){ if(s[i].score == s[n-1].score) t[sum++] = s[i]; } return sum; }
#include<stdio.h> #include<string.h> const int N = 10; typedef struct student{ long int id; char name[20]; float objective; float subjective; float sum; char level[20]; }STU; void input(STU s[], int n); void output(STU s[], int n); void process(STU s[], int n); int main(){ STU stu[N]; printf("錄入%d個考生的資訊:准考證號, 姓名, 客觀題得分(<=40),操作題得分(<=60)\n",N); input(stu, N); printf("\n對考生資訊進行處理:計算總分,確定等級\n"); process(stu, N); printf("\n列印考生完整資訊:准考證號, 姓名, 客觀題得分 ,總分, 等級\n"); output(stu, N); return 0; } void input(STU s[], int n){ int i = 0; for(; i < n; i++){ scanf("%ld %s %f %f", &s[i].id, s[i].name, &s[i].objective, &s[i].subjective); s[i].sum = 0; strcpy(s[i].level ,"合格"); } } void output(STU s[], int n){ int i = 0; printf("准考證號 姓名 客觀題得分 操作題得分 總分 等級\n"); for(; i < n; i++) printf("%ld %10s %8.2f %12.2f %9.2f %8s\n",s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum,s[i].level); } void process(STU s[],int n){ int prefect, pass ,fail; prefect = n * 0.1; pass = n * 0.5; fail = n; int i , j; for(i = 0; i < n; i++) s[i].sum = s[i].objective * 0.4 + s[i].subjective * 0.6; int min; STU temp; for(i = n - 1; i > 0; i--){ min = s[i].sum; j = i - 1; for(;j >= 0; j--){ //這裡條件錯誤; if(s[j].sum < min){ min = s[j].sum; temp = s[j]; s[j] = s[i]; s[i] = temp; } } } for( i = 0 ; i < n ; i++){ if(i < prefect) strcpy(s[i].level, "優秀"); else if( i >= prefect && i < pass) strcpy(s[i].level, "合格"); else strcpy(s[i].level, "不合格"); } }
實驗總結:
做實驗一的時候想嘗試自己打出來,所以主要遇到的麻煩都在實驗一
首先是遇到的一些找了很久的小問題
1 print函式中少打了一個%f導致一直不能輸出。
2 sort函式中if沒有加大括號,找了很久的問題。
3 j--打成j++導致邏輯錯誤
總結,遇到這種多個函式的問題,可以先把思路寫下來再打,會減少頭腦混亂導致的小錯誤。
然後是在實驗一中發現的一個小問題
因為最開始是自己打的程式碼,在結構體中定義了char *name發現執行不了,改為char name[20]後就可以運行了。
原因是如果定義*name,與a[20]
*name 為一個無效指標,因為沒有指向的地址所以無法輸入輸出,&name 可以直接等同於字元陣列中的a(及字串的首地址),因為字元陣列中a其實也是一個指標,指向字元常量區中字串的首地址。
所以如果結構體中定義了*name,輸入輸出的格式應該為scanf("%s",&name)和printf("%s",&name)。