| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1036 人关注过本帖, 1 人收藏
标题:新人求助,自己三天没解决了。因为我完全自学所以没有老师可问。请高手们给 ...
只看楼主 加入收藏
jysliang
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-1-1
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:12 
新人求助,自己三天没解决了。因为我完全自学所以没有老师可问。请高手们给我学下去的勇气吧!谢谢了
书上让用结构体存放学生姓名 年龄 分数,然后按分数排序并输出。写到定义学生信息的时候出问题了。请知道的朋友给我一点指导。谢谢了!
下面是我写的程序
#include<stdio.h>
#include<malloc.h>
struct student    //定义一个结构体为student
{
    char name[50];//姓名
    int age;//年龄
    float score;//分数
};

void inlen(int * len0) //学生数量输入函数
{
    printf("请输入学生的个数:\n");
    printf("人数= ");
    scanf("%d",&*len0);   
}

void instudent(struct student ** parr0, int  len0)//学生信息输入函数
{
    *parr0 = (struct student *) malloc (len0 * sizeof(struct student *)); //动态内存分配
    int i;
    for(i = 0; i < len0; i++ )
    {
        printf("请输入第%d个学生的信息\n",i+1);
        printf("姓名=");
        scanf("%s",parr0[i]->name);
        printf("年龄=");
        scanf("%d",&parr0[i]->age);
        printf("分数=");
        scanf("%f",&parr0[i]->score);


    }
}

int main (void)//主函数
{
    int len ;//定义学生数量变量
    inlen(&len);//学生数量输入函数调用
    struct student * parr;定义学生信息指针
    instudent(&parr,len);//输入学生信息函数调用
    return 0;
}

搜索更多相关主题的帖子: 信息 姓名 include 结构体 勇气 
2012-01-01 01:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
你这种编码法从哪学回来的?自学也得跟着某本书某个人的风格走吧,谁?

授人以渔,不授人以鱼。
2012-01-01 01:26
jysliang
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-1-1
收藏
得分:0 
郝斌老师学的  是不是我的方向有问题?
2012-01-01 01:29
jysliang
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-1-1
收藏
得分:0 
新快乐啊 这么多人都没睡啊!
2012-01-01 01:32
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
问题大着了,我不知道郝斌怎样的,没看过,但如果你学他真成这样,不要再跟他了。一个很简单的问题,inlen()函数,你好好的直接返回int不就可以了么,干么偏要弄成指针返回?这是典型的滥用指针,而且从你后面本来就是用数组却要搞成**指针看,更是如此。把简单的问题弄复杂,这是非常坏的风格。

要用动态分配内存,任哪一本正经的负责任的书,都会告诫读者,动态分配要记得释放,而且在哪个函数分配就该由那个函数释放,你看看自己的代码,只管分配不管释放,是大忌。要动态分配数组的每个元素,可以,调用一次函数分配一个元素的空间就是了,不要在一个instudent()中分配全部元素空间,这个全部分配,让调用者即main()函数来做,分配好了再让子函数填充数据,自己使用完后自己释放,不是下级分配内存让上级去释放,天下岂有此理。

main()函数的写法,一开始读入数组的元素数目len,然后马上分配出这个数组的空间,把指针传给子函数,逐个读入数据(不要在子函数一气读完),这是方便你处理任何一个出错的读数过程,因此,main()中用循环调用子函数读数就是了。这样处理,你的逻辑就清晰了,错误也不会那么多,查错也容易。

函数的写法,尽量任务单纯,不要兼职太多。既分配内存又读入数据,还居然是循环读完整个数组,更要命,这里是最危险的人机交互过程,你也敢一气scanf()、printf()地循环读取?

[ 本帖最后由 TonyDeng 于 2012-1-1 01:45 编辑 ]

授人以渔,不授人以鱼。
2012-01-01 01:42
jysliang
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-1-1
收藏
得分:0 
谢谢 那我要重新学习了! 不管怎么样,就凭你打了这么多字感激不尽!可能是我太笨了!那我只有多看书多学习!
2012-01-01 01:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
对内置值类型(非引用)的数据,如int、char、long、double之类,直接return返回就可以了,参数传递也没必要用指针,这种类型的数据复制很快,不会耽误时间的,而这样做的结果,是方便你在函数中处理数据,确保返回正确的数据,而不至于因使用指针把错误的数据传回去了——用指针的话你如何保护原来的数据呢?省不了事的。指针的作用,通常是数据太庞大无法挪移或复制时才用的,不要滥用。用指针的危险就在于你直接对真身操作,而不是先在复制副本上试验,其操作是不可逆的,要可逆,你就得自己想办法保护原数据的副本——用指针时,时刻把这个警告存在脑中,想清楚会有什么问题,否则,问题发生了,你都不知道会是这个方面引起的。

看看你那个inlen()函数,如果scanf()读入的数据是非法的怎么办,也传回去了,main()是照收不误的。
int len;
inlen(&len);

你自己看,len没有初始化,你敢保证&len回来的是合格的数据?如果scanf()失败了,你晓得len是多少?你传int *i型的指针进去,在里面scanf()直接就可以使用这个指针scanf("%d",i)了,&*叠加,等于互相抵消、两个都没有了,多此一写。郝斌不会写出这样的东西吧?如果我写,就是这样:
int number = 0;
number = get_number();

这样不是清晰许多?get_number()函数的职责,就是获取元素数目,它负责数据的合法性,总不会返回负数给你,大不了number==0,而用0分配内存是不会有危险的,最起码number不会仍然未初始化,再保险一点,马上检测if(number==0),做出对策,不让程序再往下盲目执行。本来很直观的代码,被你写成inlen(&len),考读者脑筋急转弯呀?获取什么东西,是get,不是in,这些单词,最好查一查字典,人家读码也轻松一点。这些东西,才是学编程首先要培养的。

[ 本帖最后由 TonyDeng 于 2012-1-1 02:24 编辑 ]

授人以渔,不授人以鱼。
2012-01-01 01:56
hcmfys
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2007-4-3
收藏
得分:4 
#include<stdio.h>
#include<malloc.h>
#include<float.h>

typedef struct _student    //定义一个结构体为student
{
    char name[50];//姓名
    int age;//年龄
    float score;//分数
} student;


void printStudent( int len  )
{
    student *pStudent=new student[len];
    for(int i=0; i<len; i++)
    {
        printf("name:\n");
        scanf("%s",pStudent[i].name);
        printf("age:\n");
        scanf("%d",&pStudent[i].age);
        printf("score\n");
        scanf("%f",&pStudent[i].score);
    }

    for(int i=0; i<len; i++)
    {
        printf("name=%s age=%d score=%f \n",pStudent[i].name ,pStudent[i].age,pStudent[i].score);
    }

    delete []pStudent;

}

int main (void)//主函数
{
    printStudent(2);
    return 0;
}
2012-01-01 09:01
hcmfys
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2007-4-3
收藏
得分:0 
来个简单的
2012-01-01 09:01
jysliang
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-1-1
收藏
得分:0 
看懂了。看来是我的方向有问题了! 大家很热心!谢谢
2012-01-01 13:50
快速回复:新人求助,自己三天没解决了。因为我完全自学所以没有老师可问。请高手 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013852 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved