学生信息:
1 击2 主3 杨4 牛5 更6 呀7 主8 啊9 哦10 丫三次分组结果:第1组:2 主9 哦第2组:1 击4 牛6 呀8 啊第3组:3 杨5 更7 主10 丫**************************第1组:2 主4 牛6 呀10 丫第2组:5 更8 啊第3组:1 击3 杨7 主9 哦************************第1组:4 牛6 呀9 哦第2组:2 主7 主第3组:1 击3 杨5 更8 啊10 丫实现代码:/* * 目的: *从文件中读取学生,并进行分组。 */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <unistd.h>static int student_number = 0;//学生个数默认为0人static int student_group = 0;//分多少组 默认0组static int student_group_number = 3; //每组人数默认3人//用于分割信息static const char sign_d = ';';static const char sign_e = '@';static char s[2048] = {}; //存放数据信息static char temp[1024] = {}; //缓冲数据static int rand_seed = 0; //防止随机数,生成严重重复typedef struct data{ char *title; char *content; int n; //表示已存放的学生数(弃用) struct data *p;}DATA;void read_count(FILE *fp) //读取学生信息,保存进 s[]中{ char temp; int i = 0; while((temp = fgetc(fp)) != EOF) { if(temp == ' ') { s[i] = sign_d; i++; continue; } if(temp == '/n') { s[i] = sign_e; i++; student_number++; continue; } s[i] = temp; i++; } student_number++; s[i] = '#';//#标记结束末尾符号}void group(void) //计算出要分几组{ if(student_number < student_group_number) { student_group = 1; return; } student_group = student_number / student_group_number;}int random_n(int x, int y) //随机数生成{ srand((unsigned)time(NULL) + rand_seed); rand_seed += 10; int k = x + rand()%(y - x + 1); return k;}DATA *handle(void) //生成一个存放了学生信息的链表{ DATA *head = (DATA *)malloc(sizeof(DATA)); DATA *p = head; for(int i = 0; i < student_group; i++) { DATA *node = (DATA *)malloc(sizeof(DATA)); node->title = (char *)malloc(sizeof(char) * 50); node->content = (char *)malloc(sizeof(char) * 1024); sPRintf(temp, "第%d组:", i + 1); strcpy(node->title, temp); memset(temp, 0, sizeof(temp)); node->p = NULL; node->n = 0; head->p = node; head = node; } return p;}void print(DATA *head) //打印信息并录入{ FILE *fp = fopen("student2.txt", "w"); head = head->p; while(NULL != head) { printf("%s/n%s/n", head->title, head->content); fprintf(fp, "%s/n%s/n", head->title, head->content); //将最终得到的数据录入文件中 head = head->p; }}void get_student(int n) //获取一个学生{ int i = 0, j = 0, k = 0; while(j != n - 1) { if(s[i] == sign_e) { i++; j++; continue; } i++; } while(s[i] != sign_e && s[i] != '#') { if(s[i] != sign_d) temp[k] = s[i]; else temp[k] = ' '; k++; i++; }}int temp_r = 0; //保存上一个随机数与新生成的随机数是否一样void student_group_stack(DATA *head) //进行学生分组{ DATA *p = head; int k = random_n(1, student_group); if(temp_r != k) temp_r = k; else while(1) { k = random_n(1, student_group); if(temp_r != k) { temp_r = k; break; } } for(int i = 0; i < k; i++) p = p->p; strcat(p->content, temp); strcat(p->content, "/n");}int main(int argc, char *argv[]){ FILE *fp = fopen("student.txt", "r"); read_count(fp); group(); DATA *head = NULL; head = handle(); for(int i = 0; i < student_number; i++) { memset(temp, 0, sizeof(temp)); get_student(i+1); //printf("%s/n", temp); student_group_stack(head); } print(head); return 0;}///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
设定为3人一组,程序运行结果无法100%与预期结果一样。 需要进行条件限制。
DATA结构体中n代表一组里已有多少学生, 如该n 等于 3(默认一组的人数),就停止向本组分配学生。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
新闻热点
疑难解答