| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1747 人关注过本帖
标题:C++ Primer Plus(第五版)第四章编程练习题9 求助
只看楼主 加入收藏
sam031
Rank: 2
等 级:论坛游民
帖 子:12
专家分:14
注 册:2013-2-23
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:9 
C++ Primer Plus(第五版)第四章编程练习题9 求助
第五题:结构CandyBar 包含3个成员.第一个成员存储了糖块的品牌,第二个成员存储糖块的重量(可以有小数);第三个成员存储了糖块的卡路里,含量(整数).请编写一个程序,声明这个结构,创建一个名为snack的CandyBar变量,并将基成员分别初始化为"Mocha Munch"2.3和350.化应在声明snack时进行.最后,程序显示snack变量的内容.

第六题:结构CandyBar包含3个成员,如编程练习5所示.请编写一个程序,创建一个程序,创建一个饱含3个元素的CandyBar数组,并将它们初始化为所选择的值,然后显示每个结构的内容.

第九题:完成编程练习6,但使用new来动态分配数组,而不是声明一个包含3个元素的CandyBar数组.

做第九题作业时,这里小弟理解 不是声明一个包含3个元素的CandyBar数组 应为声明包含未知个元素的CandyBar数组,于是写了如下代码,编译通过,但输入bra数组后就立刻出现遗传乱码数字,小弟菜鸟也,不懂,求助高手们,帮忙改一下代码并说明一下,先谢过!

#include <iostream>
#include <cstring>
using namespace std;
struct CandyBar
{
        char brand[30];
        float weight;
        int colorie;
};
void main()
{
    cout<<"请输入正整数:";
    int x;
    cin>>x;
    CandyBar* p=new CandyBar[x];
    char bra[30];
    for(int i=0;i<x;i++)
    {
        cin.getline(bra,30);
        strncpy(p[i].brand,bra,29);
        p[i].brand[29]='\0';
        cin>>p[i].weight;
        cin>>p[i].colorie;
        cout<<p[i].brand<<endl;
        cout<<p[i].weight<<endl;
        cout<<p[i].colorie<<endl;
    }
    delete [] p;

}



搜索更多相关主题的帖子: 练习题 卡路里 动态 
2013-02-23 23:12
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
不懂C++的也来蹭分

仰望星空...........不忘初心!
2013-02-23 23:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
程序代码:
#include <iostream>

using namespace std;

struct CandyBar
{
    char _brand[30];        // 品牌
    double _weight;         // 重量(gram)
    int _heat;              // 热量(calories)

    void show(void);
};

void CandyBar::show(void)
{
    cout << " Brand: " << _brand << endl;
    cout << "Weight: " << _weight << "(gram)" << endl;
    cout << "  Heat: " << _heat << "(calories)" << endl;
}

void subject_5(void);
void subject_6(void);
void subject_9(void);

int main(void)
{
    subject_5();
    subject_6();
    subject_9();

    return 0;
}

void subject_5(void)
{
    cout << "Subject 5" << endl;
    CandyBar snack = { "Mocha Munch", 2.3, 350 };
    snack.show();
    cout << endl;
}

void subject_6(void)
{
    cout << "Subject 6" << endl;

    CandyBar snacks[3] = {
        { "Mocha Munch", 2.3, 350 },
        { "Cubita", 3.2, 320 },
        { "Jamaica Blue Mountain", 2.8, 300 }
    };

    for (int index = 0; index < _countof(snacks); ++index)
    {
        snacks[index].show();
        cout << endl;
    }

    cout << endl;
}

void subject_9(void)
{
    cout << "Subject 9" << endl;

    CandyBar* snacks[3];

    snacks[0] = new CandyBar();
    strncpy_s(snacks[0]->_brand, "Mocha Munch", _TRUNCATE);
    snacks[0]->_weight = 2.3;
    snacks[0]->_heat = 350;

    snacks[1] = new CandyBar();
    strncpy_s(snacks[1]->_brand, "Cubita", _TRUNCATE);
    snacks[1]->_weight = 3.2;
    snacks[1]->_heat = 320;

    snacks[2] = new CandyBar();
    strncpy_s(snacks[2]->_brand, "Jamaica Blue Mountain", _TRUNCATE);
    snacks[2]->_weight = 2.8;
    snacks[2]->_heat = 300;

    for (int index = 0; index < _countof(snacks); ++index)
    {
        snacks[index]->show();
        cout << endl;
        delete snacks[index];
    }

    cout << endl;
}

授人以渔,不授人以鱼。
2013-02-24 02:26
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:6 
程序代码:
#include <iostream>
#include <cstring>
using namespace std;
struct CandyBar
{
    char brand[30];
    float weight;
    int colorie;
};
int main() // void main() 的写法很操蛋的
{
    cout<<"请输入正整数:";
    int x;
    // 如果输入的格式为 整数+换行符 ,cin >> x 后流里会残留一个换行符
    // 然后 cin.getline(bra,30); 会因为这个换行符然后 结束,本来你打算给
    // p[i].brand的数据会 cin >> p[i].weight , 这样数据就乱了
    cin>>x; 
    //int g = cin.get();
    CandyBar* p=new CandyBar[x];
    char bra[30];
    
    for(int i=0;i<x;i++)
    {
        // cin.getline(x, xx); 读到换行符后就结束,但不会把换行符存到x 里
        // 如果输入的数据长度大于30,那么本来打算给brand 的字符会有一部分还留在流里,应该要清空下流。
        cin.getline(bra,30);
        strncpy(p[i].brand,bra,29);
        p[i].brand[29]='\0';
        cin>>p[i].weight;
        cin>>p[i].colorie;
        cout<<p[i].brand<<endl;
        cout<<p[i].weight<<endl;
        cout<<p[i].colorie<<endl;
    }
    delete [] p;

}

迭代的是人,递归的是神。
2013-02-24 11:23
sam031
Rank: 2
等 级:论坛游民
帖 子:12
专家分:14
注 册:2013-2-23
收藏
得分:0 
感谢LS两位的知道  小弟终于明白了
感谢3L的回答,同时十分感谢4L指出了小弟代码中的问题,原来是cin作怪。呵呵,忘了cin是保留回车,还有void main()确实操蛋,不过就是为了偷懒不写return 0,而且大学中C++的课本极大多数时候(华南理工的课本啊)都是用void main(),嘻嘻,养成陋习了,请见谅,以后注意改正。
还有那个cin.get()吸收队列的回车需放在循环for 中,否则输入到i=1 以后还是出现 乱套现象。
总之,十分感谢论坛上的高手热心达人
以后小弟在论坛里一定多多学习!
2013-02-24 21:03
y605302737
Rank: 1
等 级:新手上路
帖 子:32
专家分:9
注 册:2013-2-2
收藏
得分:0 
过来学习
2013-02-25 09:40
SwanK
Rank: 1
等 级:新手上路
帖 子:68
专家分:3
注 册:2013-1-18
收藏
得分:0 
学习
2013-02-28 15:25
puresky
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-11-2
收藏
得分:0 
3楼的人好厉害的样子啊。! 膜拜
2013-03-06 23:50
小菜B
Rank: 2
等 级:论坛游民
帖 子:29
专家分:25
注 册:2013-3-6
收藏
得分:0 
三楼的结构很清楚啊。一目了然

2013-03-08 12:36
小菜B
Rank: 2
等 级:论坛游民
帖 子:29
专家分:25
注 册:2013-3-6
收藏
得分:0 
我也花了一点时间写了点,由于时间仓促,没有写子函数,就全部放在主函数里了;功能也只有输入没有输出;希望大家多多提点意见
#include<iostream>
#include<string>
 struct candybar
{ char c[10];
 float a;
 int b;
 candybar * next;};
int main()
{using namespace std;
candybar *p1,*p2,*head;
head=new(candybar);
cout<<"请输入糖果名\n";
cin.getline(head->c,10);
cout<<"请输入重量\n";
cin>>head->a;
cout<<"情输入卡路里量\n";
cin>>head->b;
p1=head;
p1->next=0;
cout<<"是否继续添加?1;是2;否";
int i;
(cin>>i).get();
while(i==1)
{p2=new(candybar);
p1->next=p2;
cout<<"请输入糖果名\n";
cin.getline(p2->c,10);
cout<<"请输入重量\n";
cin>>p2->a;
cout<<"情输入卡路里量\n";
cin>>p2->b;
p1=p2;
p1->next=0;
cout<<"是否继续添加?1;是2;否";
(cin>>i).get();}
}
2013-03-08 12:38
快速回复:C++ Primer Plus(第五版)第四章编程练习题9 求助
数据加载中...
 
   



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

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