码迷,mamicode.com
首页 > 其他好文 > 详细

实验7

时间:2021-06-13 09:54:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:进制   随机   float   怎么   类型   span   dom   student   做了   

3.文件

示例代码运行结果如下:

技术图片

生成的file3.txt内容如下:

技术图片

输出与生成文件的内容均完整可读。

 

4.二进制文件

(1)示例代码运行结果如下:

技术图片

生成的file4.txt内容如下:

技术图片

 

输出内容完整可读,而生成的文件显示为乱码,这是因为file4是用二进制方式写入的。

 

(2)代码如下:

 1 #include <stdio.h>
 2 #define N 10
 3 typedef struct student {
 4     int num;
 5     char name[20];
 6     int score;
 7 }STU;
 8 int main() {
 9     FILE *fp;
10     STU stu[N];
11     fp=fopen("file4.dat","r");
12     if(fp==NULL)
13         printf("cannot open file");
14     fread(stu, sizeof(STU),N,fp);
15     for (int i = 0; i < N; ++i) {
16         printf("%-6d%-10s%3d\n", stu[i].num, stu[i].name, stu[i].score);
17     }
18     return 0;
19 }

 输出结果如下:

技术图片

 

5.计算机成绩

代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int N = 10;
 4 // 定义结构体类型struct student,并定义其别名为STU
 5 typedef struct student {
 6     long int id;
 7     char name[20];
 8     float objective; /*客观题得分*/
 9     float subjective; /*操作题得分*/
10     float sum;
11     char level[10];
12 }STU;
13 // 函数声明
14 void input(STU s[], int n);
15 void output(STU s[], int n);
16 void process(STU s[], int n);
17 int main() {
18     STU stu[N];
19     printf("录入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\n", N);
20     input(stu,N);
21     printf("\n对考生信息进行处理: 计算总分,确定等级\n");
22     process(stu,N);
23     printf("\n打印考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级\n");
24     output(stu,N);
25     return 0;
26 }
27 // 录入考生信息:准考证号,姓名,客观题得分,操作题得分
28 void input(STU s[], int n) {
29     FILE *fin;
30     fin=fopen("examinee.txt","r");
31     if(fin==NULL)
32         printf("cannot open examinee.txt");
33     for (int i = 0; i < N; ++i) {
34         fscanf(fin,"%ld %s %f %f",&s[i].id,s[i].name,&s[i].objective,&s[i].subjective);
35     }
36     fclose(fin);
37 }
38 //输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
39 void output(STU s[], int n) {
40     FILE *fout;
41     fout=fopen("result.txt","w");
42     if(fout==NULL)
43         printf("cannot open result.txt");
44     printf("-------------输出学生信息--------------\n");
45     printf("准考证号  姓名  客观题得分  操作题得分  总分  等级\n");
46     for (int i = 0; i < n; ++i) {
47         printf("%5ld %6s %8.1f %8.1f %8.1f %4s\n", s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum,
48                s[i].level);
49         fprintf(fout, "%5ld %6s %8.1f %8.1f %8.1f %4s\n", s[i].id, s[i].name, s[i].objective, s[i].subjective, s[i].sum,
50                 s[i].level);
51     }
52     fclose(fout);
53 }
54 // 对考生信息进行处理:计算总分,排序,确定等级
55 void process(STU s[], int n) {
56     //计算总分
57     for (int i = 0; i < n; ++i)
58         s[i].sum=s[i].objective+s[i].subjective;
59     //排序(冒泡排序,降序)
60     STU temp;
61     for (int i = 0; i < n-1; ++i) {
62         for (int j = 0; j < n-1-i; ++j) {
63             if (s[j].sum<s[j+1].sum){
64                 temp=s[j];
65                 s[j]=s[j+1];
66                 s[j+1]=temp;
67             }
68         }
69     }
70     //根据比例划分等级
71     for (int i = 0; i < n; ++i) {
72         if (i<=(n/10)-1)          //数组序列从0开始
73             strcpy(s[i].level,"优秀");
74         else if (i<=(n/2)-1)
75             strcpy(s[i].level,"合格");
76         else
77             strcpy(s[i].level,"不合格");
78     }
79 }

输出结果如下:

技术图片

 result.txt内容如下:

技术图片

 

6.自制抽点器(无重复版)

总之做了一个上午大概写出来了。

把我觉得要注意的东西都往注释里写了,一是注意在循环生成随机数之前先生成种子,二是注意要生成0~n-1的随机数,否则会超出数组范围。

剩下的就是不重复抽点如何实现的问题了,我写的是类似筛选素数的算法。

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <time.h>
 4 #define N 80
 5 typedef struct student {
 6     int num;
 7     long id;
 8     char name[20];
 9     char class[20];
10 }STU;
11 void random(STU s[],int n,int x);
12 
13 int main() {
14     STU s[N];
15     int x;
16     FILE *fp;
17 
18     //读入数据存入结构体数组s
19     fp=fopen("list.txt","r");
20     if (fp==NULL) {
21         printf("fail to open list.txt");
22         exit(0);
23     }
24     for (int i = 0; i < N; ++i) {
25         fscanf(fp,"%d %ld %s %s",&s[i].num,&s[i].id,s[i].name,s[i].class);
26     }
27     
28     //随机抽点(函数实现)
29     printf("输入抽点人数:");
30     scanf("%d",&x);
31     random(s,N,x);
32 
33     fclose(fp);
34     return 0;
35 }
36 void random(STU s[],int n,int x){
37     int i=0,j,rd,lucky[N]={-1};       //数组lucky存储已被抽的号数
38     FILE *fout;
39     fout=fopen("lucky.txt","w");
40     if (fout==NULL) {
41         printf("fail to create lucky.txt");
42         exit(0);
43     }
44     srand((unsigned)time(NULL));//要在循环生成随机数前先生成种子,否则会随机出x个相同结果,别问我怎么知道的
45     while(i<x){
46        rd = rand()%n;//生成0~n-1间随机数
47         for ( j = 0; j<=i ; j++) {    //与已抽出号数比对,若已被抽则重新生成,x个随机数生成完毕再输出
48             if (lucky[j]==rd)
49                 break;
50         }
51         if (j>i){
52             lucky[i] = rd;
53             i++;
54         }
55     }
56     for (int k = 0; k < x; ++k) {
57         printf("%d %5ld %2s %5s\n",s[lucky[k]].num,s[lucky[k]].id,s[lucky[k]].name,s[lucky[k]].class);//显示器输出
58         fprintf(fout,"%d %5ld %2s %5s\n",s[lucky[k]].num,s[lucky[k]].id,s[lucky[k]].name,s[lucky[k]].class);//读入文件lucky.txt
59     }
60 
61     fclose(fout);
62 }

运行结果如下:
技术图片

生成的lucky.txt内容如下:

技术图片

 

实验7

标签:进制   随机   float   怎么   类型   span   dom   student   做了   

原文地址:https://www.cnblogs.com/namelessbird/p/14873294.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!