|
发表于 2013-6-22 18:17:19
|
显示全部楼层
本帖最后由 fanki 于 2013-6-23 14:43 编辑
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- #define MAX 20
- typedef struct score
- {
- char score_name[MAX];
- double stu_score;
- } score;
- typedef struct stu
- {
- char name[MAX];
- char num[MAX];
- struct score *score_stu;
- char passwd[MAX];
- } stu;
- //用于初始化科目的
- void InitStuSub( stu* group, int stNum, int subNum );
- //用于出入名称的 (你可以加上输入其他信息)
- void InputStName( stu* group, int stNum );
- //用于显示所有资料信息的 (我只显示了名字和成绩,其他你可以加上)
- void ShowAllStuInfo( stu* group, int stNum, int subNum );
- //用于释放已经申请的空间的。
- void deleteInfo( stu* group, int stNum );
- //初始化科目的
- void InitStuSub( stu* group, int stNum, int subNum )
- {
- //输入科目名的一片空间
- char* subname = ( char * )malloc( MAX * subNum );
- //找一个指针控制位置
- char* name = subname;
- int i = 0, j = 0;
- //循环输入科目名
- for ( i = 0; i < subNum; i++ )
- {
- printf( "请输入第%d科名称:", i + 1 );
- //输入前先清空输入缓冲区
- fflush( stdin );
- scanf( "%s", name );
- //指针向后移动一个名称的位置
- name = name + MAX;
- }
- //循环把科目的名字放到每个同学的结构体里面,并申请空间给它,成绩我改了用double型,成绩初始为0
- //i控制第几个学生,j控制第几个科目
- for ( i = 0; i < stNum; i++ )
- {
- name = subname;
- group[i].score_stu = ( score* )malloc( sizeof( score ) * subNum );
- for ( j = 0; j < subNum; j++ )
- {
- //把成绩名字复制过去
- strncpy( group[i].score_stu[j].score_name, name, MAX );
- name = name + MAX;
- group[i].score_stu->stu_score = 0;
- }
- }
- //这个subname只是用来保存科目名字的,用完就释放了。
- free( subname );
- }
- //显示所有信息(只是普通的打印)
- void ShowAllStuInfo( stu* group, int stNum, int subNum )
- {
- int i = 0, j = 0;
- //i控制第几个学生,j控制第几个科目
- for ( i = 0; i < stNum; i++ )
- {
- printf( "第%d个学生的姓名是:%s", i + 1, group[i].name );
- for ( j = 0; j < subNum; j++ )
- {
- printf( "第%d科%s成绩是:%g\n", j + 1, group[i].score_stu[j].score_name, group[i].score_stu->stu_score );
- }
- }
- }
- //输入名字
- void InputStName( stu* group, int stNum )
- {
- int i = 0;
- for( i = 0; i < stNum; i++ )
- {
- printf( "请输入第%d个学生姓名:", i + 1 );
- //输入前清空输入缓冲区,习惯,哈哈
- fflush( stdin );
- fgets( group[i].name, MAX, stdin );
- }
- }
- //释放空间不能只free group,因为结构体里面申请的空间还没有释放
- void deleteInfo( stu* group, int stNum )
- {
- int i = 0;
- for ( i = 0; i < stNum; i++ )
- {
- free( group[i].score_stu );
- }
- free( group );
- }
- //主函数
- int main(int argc, char *argv[])
- {
- //输入学生数
- int stNum = 0;
- printf( "请输入学生数:" );
- while( !scanf( "%d", &stNum ) ){
- printf( "输入错误,请重新输入" );
- fflush( stdin );
- }
- stu* stugroup = ( stu* )malloc( sizeof(stu) * stNum );
- //输入科目数
- int subNum = 0;
- printf( "请输科目数:" );
- while( !scanf( "%d", &subNum ) ){
- printf( "输入错误,请重新输入" );
- fflush( stdin );
- }
- //用于初始化科目的
- InitStuSub( stugroup, stNum, subNum );
- //用于出入名称的 (你可以加上输入其他信息)
- InputStName( stugroup, stNum );
- //用于显示所有资料信息的 (我只显示了名字和成绩,其他你可以加上)
- ShowAllStuInfo( stugroup, stNum, subNum );
- //用于释放已经申请的空间的。
- deleteInfo( stugroup, stNum );
- return 0;
- }
- //fgets是会保存\n的, 而scanf是不会保存\n的。
- //如果学完链表可以用链表实现,就不用输入什么学生数和科目数了,可以直接加。
复制代码
学习学习,写了一下代码,你看看。
希望对你有帮助,支持支持{:7_155:}
|
|