1. 程式人生 > 實用技巧 >12月17號

12月17號

#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[],int
n); 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)。