自动点名
来源:互联网 发布:mac 中国银行 u盾 编辑:程序博客网 时间:2024/06/10 16:17
动态数组实现自动点名
描述
假设有若干个学生,为了威慑不来上课的同学,欲开发一套自动点名程序,每次课随机抽取若干个学生点名,给出结课后所以学生的 出勤分数。
规定
一共6次课 每个学生出勤满分为5分 如果出现一次缺勤扣1分,两次缺勤扣3分,三次及三次以上扣5分。 常规写法
#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX 100#define CMAX 4//点名最多次数int InputInfo(char stuName[][20], char stuID[][10]){ int stuNum, i; printf("Please input the number of students!\n"); scanf("%d", &stuNum); printf("Please input the information of students!\n"); getchar();//读出缓冲区的空格 for(i=0; i<stuNum; i++) { gets(stuName[i]);//gets遇到回车就结束了! gets(stuID[i]); } return stuNum;}void RandomCall(char stuName[][20], char stuID[][10], int stuAbsentNum[], int stuNum){ int i, callNum, callIndex[CMAX]; char answer; srand(time(NULL)); callNum = rand() % CMAX; for(i=0; i<callNum; i++) { callIndex[i] = rand() % stuNum; printf("Is the student %s, %s present?\n", stuName[callIndex[i]], stuID[callIndex[i]] ); scanf(" %c", &answer);//读入学生是否出勤,注意在%c前加空格滤除缓冲区的空格! if(answer == 'n') { stuAbsentNum[callIndex[i]]++; } }}void SumScore(int stuAbsentNum[], int stuNum, int stuScore[]){ for(int i=0; i<stuNum; i++) { switch(stuAbsentNum[i]) { case 0: stuScore[i] = 5; break; case 1: stuScore[i] = 4; break; case 2: stuScore[i] = 2; break; default: stuScore[i] = 0; break; } }}void OutputInfo(char stuName[][20], char stuID[][10], int stuScore[], int stuNum){ for(int i=0; i<stuNum; i++) { printf("%s\t%s\t%d\n", stuName[i], stuID[i], stuScore[i]); }}int main(){ char stuName[MAX][20], stuID[MAX][10]; int stuScore[MAX], stuAbsentNum[MAX]= {0};//后续要在缺勤次数上操作,要初始化! int stuNum, hours, i;//hours课时数 stuNum = InputInfo(stuName, stuID); printf("Please input the number of lessons!\n"); scanf("%d", &hours); for(i=0; i<hours; i++) { RandomCall(stuName, stuID, stuAbsentNum, stuNum); } SumScore(stuAbsentNum, stuNum, stuScore); OutputInfo(stuName, stuID, stuScore, stuNum); return 0;}
动态写法(动态一维数组使用方法)
#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX 100#define CMAX 4//点名最多次数int InputInfo(char stuName[][20], char stuID[][10]){ int stuNum, i; printf("Please input the number of students!\n"); scanf("%d", &stuNum); printf("Please input the information of students!\n"); getchar();//读出缓冲区的空格 for(i=0; i<stuNum; i++) { gets(stuName[i]);//gets遇到回车就结束了! gets(stuID[i]); } return stuNum;}void RandomCall(char stuName[][20], char stuID[][10], int stuAbsentNum[], int stuNum){ int i, callNum; char answer; int *callIndex;//申请动态空间访问,因为指针和数组是通用的所以采用数组的形式也是合法的访问! srand(time(NULL)); callNum = rand() % CMAX; callIndex = (int *)malloc(callNum*sizeof(int)); if(callIndex == NULL) { printf("No enough memory!\n"); exit(0); } else { for(i=0; i<callNum; i++) { callIndex[i] = rand() % stuNum; //数组形式 //*(callIndex+i) = rand() % stuNum; //指针形式 printf("Is the student %s, %s present?\n", stuName[callIndex[i]], stuID[callIndex[i]] ); scanf(" %c", &answer);//读入学生是否出勤,注意在%c前加空格滤除缓冲区的空格! if(answer == 'n') { stuAbsentNum[callIndex[i]]++; } } } free(callIndex);}void SumScore(int stuAbsentNum[], int stuNum, int stuScore[]){ for(int i=0; i<stuNum; i++) { switch(stuAbsentNum[i]) { case 0: stuScore[i] = 5; break; case 1: stuScore[i] = 4; break; case 2: stuScore[i] = 2; break; default: stuScore[i] = 0; break; } }}void OutputInfo(char stuName[][20], char stuID[][10], int stuScore[], int stuNum){ for(int i=0; i<stuNum; i++) { printf("%s\t%s\t%d\n", stuName[i], stuID[i], stuScore[i]); }}int main(){ char stuName[MAX][20], stuID[MAX][10]; int stuScore[MAX], stuAbsentNum[MAX]= {0};//后续要在缺勤次数上操作,要初始化! int stuNum, hours, i;//hours课时数 stuNum = InputInfo(stuName, stuID); printf("Please input the number of lessons!\n"); scanf("%d", &hours); for(i=0; i<hours; i++) { RandomCall(stuName, stuID, stuAbsentNum, stuNum); } SumScore(stuAbsentNum, stuNum, stuScore); OutputInfo(stuName, stuID, stuScore, stuNum); return 0;}
再改把里面的二维数组也改成动态申请的形式
#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX 100#define CMAX 4//点名最多次数void InputInfo(char *pstuName, char *pstuID, int stuNum){ printf("Please input the information of students!\n"); for(int i=0; i<stuNum; i++) { gets(pstuName+i*20);//二维数组 gets(pstuID+i*10); }}void RandomCall(char *pstuName, char *pstuID, int stuAbsentNum[], int stuNum){ int i, callNum; char answer; int *callIndex;//申请动态空间访问,因为指针和数组是通用的所以采用数组的形式也是合法的访问! srand(time(NULL)); callNum = rand() % CMAX; callIndex = (int *)malloc(callNum*sizeof(int)); if(callIndex == NULL) { printf("No enough memory!\n"); exit(0); } else { for(i=0; i<callNum; i++) { callIndex[i] = rand() % stuNum; //数组形式 //*(callIndex+i) = rand() % stuNum; //指针形式 printf("Is the student %s, %s present?\n", pstuName+ callIndex[i] *20, pstuID+ callIndex[i] *10); scanf(" %c", &answer);//读入学生是否出勤,注意在%c前加空格滤除缓冲区的空格! if(answer == 'n') { stuAbsentNum[callIndex[i]]++; } } } free(callIndex);}void SumScore(int stuAbsentNum[], int stuNum, int stuScore[]){ for(int i=0; i<stuNum; i++) { switch(stuAbsentNum[i]) { case 0: stuScore[i] = 5; break; case 1: stuScore[i] = 4; break; case 2: stuScore[i] = 2; break; default: stuScore[i] = 0; break; } }}void OutputInfo(char *stuName, char *stuID, int stuScore[], int stuNum){ for(int i=0; i<stuNum; i++) { printf("%s\t%s\t%d\n", stuName+i*20, stuID+i*10, stuScore[i]); }}int main(){ //char stuName[MAX][20], stuID[MAX][10]; int stuScore[MAX], stuAbsentNum[MAX]= {0};//后续要在缺勤次数上操作,要初始化! int stuNum, hours, i;//hours课时数 char *pstuName, *pstuID; printf("Please input the number of students!\n"); scanf("%d", &stuNum); getchar();//读出缓冲区的空格 pstuName = (char *)malloc(sizeof(char) *stuNum *20); pstuID = (char *)malloc(sizeof(char) *stuNum *20); if(pstuName == NULL || pstuID == NULL) { printf("No enough memory!\n"); exit(0); } else { InputInfo(pstuName, pstuID, stuNum); printf("Please input the number of lessons!\n"); scanf("%d", &hours); for(i=0; i<hours; i++) { RandomCall(pstuName, pstuID, stuAbsentNum, stuNum); } SumScore(stuAbsentNum, stuNum, stuScore); OutputInfo(pstuName, pstuID, stuScore, stuNum); } return 0;}
1 0
- 自动点名
- 点名
- 点名
- linux学习shell----脚本3连发 ps ( 自动搭建本地YUM, 双色球摇号脚本, 点名脚本 )
- 应小柳点名
- 点名游戏
- 点名游戏
- 暴笑点名
- 2010、点名。
- 点名系统
- 随机点名
- 点名程序
- 精简点名
- 点名神器
- 点名器
- 随机点名
- 随机点名
- 抽奖点名
- 推荐10个bootstrap及其他框架的后台管理模板
- C++中的异步操作
- GDI映射方式
- OpenFlow in Floodlight 问题集
- 怎么把 ubuntu 系统的 工具条 挪到屏幕下方? 默认在屏幕左侧
- 自动点名
- 服务器大并发的思考
- 微服务架构多“微”才合适
- linux下vi操作Found a swap file by the name
- 零基础学习JAVA编程题——信号报告
- 欢迎使用CSDN-markdown编辑器
- java集合之集合简介
- 高仿小米时钟
- 文件上传和下载