| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 495 人关注过本帖
标题:c++ primer plus第6版练习题9 问题求组
只看楼主 加入收藏
yehunyou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-12-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
c++ primer plus第6版练习题9 问题求组
题目为:
结构CandyBar保护3个成员,第一个是存储糖果品牌,第二个是存储糖果重量,第三个是存储糖果卡路里含量。现在是编写一个程序,创建一个使用new的动态分配数组,该数组为包含3个元素的CandyBa数组,然后初始化各个元素,并显示出来。 大概就是这么个意思。
我写的代码:
#include<iostream>
int main()
{
using namespace std;
struct CandyBar
{
char name[30];
double weight;
int calorie;
};
CandyBar *snack=new CandyBar[3];

snack[0]{"third",2.7,5};





cout <<snack[0].name <<snack[0].calorie <<snack[0].weight ;
cout <<snack[1].calorie <<snack[1].name <<snack[1].weight ;
cout <<snack[2].calorie <<snack[2].name <<snack[2].weight ;
delete [] snack;
return 0;
}
问题就是 在,建立动态指针数组后, 怎么给 snack赋值。我的理解是此snack是个指针数组,那个就可以使用指针数组的赋值方法,即 snack[0]表示第一个元素,可以直接给赋值。 但是编译器 看见赋值符合就是那个大括号就 报错,
高人指点指点,迷茫啊,没搞懂为什么就不行呢。
搜索更多相关主题的帖子: include 练习题 double 卡路里 
2013-12-19 11:21
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
大约是这个样子吧  

程序代码:
#include<iostream>

using namespace std;

int main()
{
    struct CandyBar
    {
        char name[30];
        double weight;
        int calorie;
    };
    CandyBar *snack=new CandyBar[3];
    strcpy(snack[0].name,"third");
    snack[0].weight=8.5;
    snack[0].calorie=19;

    strcpy(snack[1].name,"bbbbbbb");
    snack[1].weight=7.5;
    snack[1].calorie=9;

    strcpy(snack[2].name,"th5ffffird");
    snack[2].weight=15.5;
    snack[2].calorie=29;

    for(int i=0; i<3; i++)
    {
        printf("%30s  %.2f  %d  \n",snack[i].name,snack[i].weight,snack[i].calorie);
    }
    delete [] snack;
    return 0;
}



[ 本帖最后由 wp231957 于 2013-12-19 15:26 编辑 ]

DO IT YOURSELF !
2013-12-19 15:24
yehunyou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-12-19
收藏
得分:0 
回复 2楼 wp231957
这种也能够运行,
但是我其实比较像知道,为什么  我的这种写法 会错误,这个错误在什么地方呢
还有   
赋值的方法, snack[0].name=“def” 这种方法为什么也不行,非得用你所写的那种复制的strcay 这种方式,毕竟 使用snack[0].weight=5 这种形式都是被允许的。
能解释下吗?
2013-12-19 16:39
犬虫门心本人
Rank: 2
等 级:论坛游民
帖 子:28
专家分:26
注 册:2013-12-19
收藏
得分:4 
你定义的name成员是一个数组,数组名称是常量,不能被赋值的!
你的程序编译的错误提示大概应该是:
= needs l-value
这个意思是说,=需要左值。所谓的左值就是变量。而数组名称是常量。
再说,看题目的意思应该是定义类类型啊,你定义的是结构体,这是哪跟哪啊!
2013-12-19 17:04
zuojian168
Rank: 2
等 级:论坛游民
帖 子:16
专家分:27
注 册:2013-3-20
收藏
得分:4 
#include<iostream.h>
int main()
{

struct CandyBar
{
char name[30];
double weight;
int calorie;
}snack[3]={"third",2.7,5,"two",9.9,0,"one",1.2,3};
//CandyBar *snack=new CandyBar[3];




cout <<snack[0].name <<snack[0].calorie <<snack[0].weight ;
cout <<snack[1].name <<snack[1].calorie <<snack[1].weight ;
cout <<snack[2].name <<snack[2].calorie <<snack[2].weight ;
//delete [] snack;
return 0;
}
2013-12-19 20:45
yehunyou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-12-19
收藏
得分:0 
回复 4楼 犬虫门心本人
感谢回答,但是第一句话就说了 这个是一个结构!
另外 数组初始化这个问题,哎,是读书不够认真啊。
数组的初始化只能够在定义的时候进行初始化,其他的时候就不被允许了。
数组不是常量,毕竟可以使用它进行 cin操作。只是数组初始化规则 不允许了而已。
2013-12-20 10:15
yehunyou
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-12-19
收藏
得分:0 
这里用new动态分配数组,已经是一个初始化过程了,指针都有相应地址了, 后面是一个赋值的过程了。
2013-12-20 10:20
i80286
Rank: 6Rank: 6
等 级:侠之大者
威 望:5
帖 子:99
专家分:428
注 册:2013-9-30
收藏
得分:2 
CandyBar是一个结构体,其中包含了三个变量,“snack[0]{"third",2.7,5}”从你的角度看是没问题,但编译器就不知道这三个值究竟赋给谁,赋值的顺序是没有规则可用
2013-12-20 10:31
阿呆不高
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-11-1
收藏
得分:0 
回复 3楼 yehunyou
name作为数组名,也就是数组的首地址,很明显它是不变的。再看strcpy这个函数的原型声明:extern char *strcpy(char* dest, const char *src);很明显是将把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。字符串可以看作是每个字母组成的数组,字符串"third"即为数组char  buf[30]={'t','h','i','r','d'}那么该函数执行其实就是dest=name;src=buf;*dest=*src;dest++;src++;假设dest空间足够大,循环次数为strlen(buf)+1;很明显和对name直接赋值不一样。任何对数组名的赋值行为都是不可以的。
2013-12-21 00:39
快速回复:c++ primer plus第6版练习题9 问题求组
数据加载中...
 
   



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

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