假设有若干个学生,为了威慑不来上课的同学,欲开发一套自动点名程序,每次课随机抽取若干个学生点名,给出结课后所以学生的 出勤分数。
动态写法(动态一维数组使用方法)
#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; } ReCclay 认证博客专家 嵌入式软件开发 机器/深度学习 全栈技术学习者 大家好,我是博主ReCclay,目前处于研究生阶段,就读于电子科技大学,主攻方向为汽车辅助驾驶算法研究。入站以来,凭借坚持与热爱,以博文的方式分享所学,截止目前累计博文数量达800余篇,累计受益人次达130w+次,涉及领域包括但不限于物联网开发、单片机开发、Linux驱动开发、FPGA开发、前/后端软件开发等。在未来我将继续专注于嵌入式相关领域,学习更多的科技知识,输出更高质量的博文。