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)。

 

posted @ 2020-12-22 22:25  鸣蜩  阅读(65)  评论(2编辑  收藏  举报