注册 登录
编程论坛 C++教室

C++ Primer Plus(第五版)第四章编程练习题9 求助

sam031 发布于 2013-02-23 23:12, 1747 次点击
第五题:结构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;

}



9 回复
#2
Susake2013-02-23 23:14
不懂C++的也来蹭分
#3
TonyDeng2013-02-24 02:26
程序代码:

#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;
}
#4
lintaoyn2013-02-24 11:23
程序代码:
#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;

}
#5
sam0312013-02-24 21:03
感谢LS两位的知道  小弟终于明白了
感谢3L的回答,同时十分感谢4L指出了小弟代码中的问题,原来是cin作怪。呵呵,忘了cin是保留回车,还有void main()确实操蛋,不过就是为了偷懒不写return 0,而且大学中C++的课本极大多数时候(华南理工的课本啊)都是用void main(),嘻嘻,养成陋习了,请见谅,以后注意改正。
还有那个cin.get()吸收队列的回车需放在循环for 中,否则输入到i=1 以后还是出现 乱套现象。
总之,十分感谢论坛上的高手热心达人
以后小弟在论坛里一定多多学习!
#6
y6053027372013-02-25 09:40
过来学习
#7
SwanK2013-02-28 15:25
学习
#8
puresky2013-03-06 23:50
3楼的人好厉害的样子啊。! 膜拜
#9
小菜B2013-03-08 12:36
三楼的结构很清楚啊。一目了然

#10
小菜B2013-03-08 12:38
我也花了一点时间写了点,由于时间仓促,没有写子函数,就全部放在主函数里了;功能也只有输入没有输出;希望大家多多提点意见
#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();}
}
1