首页 > 学院 > 开发设计 > 正文

学生分组的小程序

2019-11-06 06:24:17
字体:
来源:转载
供稿:网友

学生信息:

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(默认一组的人数),就停止向本组分配学生。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表