实验七

实验任务1、实验任务2 略

实验任务3:屏幕正确出现了信息,生成了file3.dat,内容正确,直观可读。

实验任务4:

  子任务1:屏幕正确输出信息,生成文件file4.dat,不直观可读。

  子任务2:

#include <stdio.h> 
#include <stdlib.h>

#define N 10

// 定义一个结构体类型STU 
typedef struct student {
    int num;
    char name[20];
    int score;
}STU;

void sort(STU *pst, int n);  // 函数声明 

int main() {
    FILE *fin;
    STU st[N];
    int i;
    
    // 以只读文本方式打开文件file4.dat 
    fin = fopen("file4.dat", "rb");
    if( !fin ) {  // 如果打开失败,则输出错误提示信息,然后退出程序 
        printf("fail to open file4.dat\n");
        exit(0);
    }
    
    
    // 从fin指向的数据文件file4.dat中读取数据到结构体数组st
    fread(st,sizeof(STU),N,fin); 
    
    
    fclose(fin);  // 关闭fin指向的文件file4.dat
    for(i=0; i<N; i++) 
        printf("%-6d%-10s%3d\n", st[i].num, st[i].name, st[i].score);
    return 0;
}

实验任务5:

#include <stdio.h>
//#include <stdlib.h>
#include <string.h>
const int N = 10;

// 定义结构体类型struct student,并定义其别名为STU 
typedef struct student {
    long int id;
    char name[20];
    float objective;    /*客观题得分*/
    float subjective;    /*操作题得分*/
    float sum;
    char level[10];    
}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;
} 

// 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
void input(STU s[], int n) {
    FILE *fin;
    int i;
    fin = fopen("examinee.txt","r");
//    if( !fin ) {  // 如果打开失败,则输出错误提示信息,然后退出程序 
//        printf("fail to open examinee.txt\n");
//        exit(0);
//    }
    for(i=0; i<N; i++) 
        fscanf(fin, "%d %s %f %f", &s[i].id, s[i].name, &s[i].objective,&s[i].subjective);
    
    fclose(fin);
}

// 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
// 不仅输出到屏幕上,还写到文本文件result.txt中 
void output(STU s[], int n) {
    FILE *fout;
    int i;
    fout = fopen("result.txt", "w");
//    if( !fout ) {  // 如果打开失败,则输出错误提示信息,然后退出程序 
//        printf("fail to open result.txt\n");
//        exit(0);
//    }
    
    // 将排序后的数组s中数据输出到屏幕,同时,也写入文件result.txt
    for(i=0; i<N; i++) {
        printf("%-8d%-10s%-8.2f%-8.2f%-8.2f%s\n",  s[i].id, s[i].name,  s[i].objective, s[i].subjective, s[i].sum, s[i].level);
        fprintf(fout, "%-8d%-10s%-8.2f%-8.2f%-8.2f%s\n", s[i].id, s[i].name,  s[i].objective, s[i].subjective, s[i].sum, s[i].level);
    }
        
    fclose(fout);  // 关闭fout指向的文件result.txt
    
}

// 对考生信息进行处理:计算总分,排序,确定等级
void process(STU s[], int n) {
    STU t;
    int i,j;
    for (i=0;i<n;i++){
        s[i].sum = s[i].objective + s[i].subjective;
    } 
    for (i=0;i<n-1;i++){
        for (j=i+1;j<n;j++){
            if (s[i].sum<s[j].sum){
                t = s[i];
                s[i]=s[j];
                s[j]=t;
            }
        }
    }
    for (i=0;i<n;i++){
        if (i<n/10)
            strcpy (s[i].level,"优秀"); 
        else if (i<n/2)
            strcpy (s[i].level,"合格"); 
        else 
            strcpy (s[i].level,"不合格");         
    }
}

实验任务6:

实现了随机抽点,解决了重复抽点问题,读取时间作为文件名,设定抽点人数,重复多次抽点。

运用方法2解决问题。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int N = 80;

typedef struct student {
    int num;
    long int id;
    char name[20];
    char room[100];
}STU;

void input(STU s[], int n, int a[]);
void output(STU s[], int n,char name[]);
void random(int a[], int n);

int main(){
    int b;
    time_t p;
    char name[100] = {0};
    time(&p);
    //将当前时间作为文件名 
    strftime( name, sizeof(name), "%Y-%m-%d %H:%M:%S  .txt",localtime(&p) ); 
    printf("输入想抽取的人数:"); 
    while (scanf("%d",&b)!=EOF){  //多次抽点&指定人数 
        int a[N]={0};
        STU s[N]={0};
        random(a,b);
        input(s,b,a);
        output(s,b,name);
        printf("输入想抽取的人数:"); 
    }
    return 0;
}

void input(STU s[],int n,int a[]){        //读取信息 
    FILE *fin;
    int i;
    fin = fopen("list.txt","r");
    if( !fin ) {  
        printf("fail to open list.txt\n");
        exit(0);
    }
    for(i=0; i<N; i++) {
        rewind(fin);        //重置位置为文件开头 
        int j=-1;
        while(j!=a[i]){        //定位具体行数 
            j++;
            fscanf(fin,"%d%ld%s%s\n",&s[i].num,&s[i].id,s[i].name,s[i].room); 
        } 
    }
    fclose(fin);
}

void output(STU s[],int n,char name[]){        //输出 
    FILE *fout = NULL;
    int i;
    if((fout = fopen(name, "a")) == NULL){
        printf("fail to open %s\n",name);
        exit(0);
    }
    for(i=0; i<n; i++) {
        printf("%-8d%-18ld%-8s%s\n", s[i].num,  s[i].id, s[i].name,  s[i].room);
        fprintf(fout, "%-8d%-18ld%-8s%s\n", s[i].num,  s[i].id, s[i].name,  s[i].room);
    }
    fprintf(fout,"点名人数:%d\n",n);
    fclose(fout);  
}

void random(int a[],int n){        //抽取随机数 
    int i,j,k;
    srand((unsigned)time(0)); 
    a[0] = (int)rand()%N;
    for (i=1;i<n;i++){    
        k=(int)rand()%N;
        for (j=0;j<i;j++){        //判断是否相等避免重复 
            if (a[j]==k)
                break;
        }
        if (j!=i)
            i--;
        else 
            a[i] = k;    
    }
    for (i=0;i<n;i++)
        printf("学号为:%d.\n",a[i]+1);
}

posted @ 2020-12-24 15:15  GHao831  阅读(100)  评论(2)    收藏  举报