Форум программистов, компьютерный форум CyberForum.ru

Прата - составные типы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Twas
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 15:50     Прата - составные типы #1
Добрый день.
Недавно начал заниматься С++ по книге Прата.
Прошел четвертую главу и встретил такую задачу:
Напишите программу С++, которая запрашивает и отображает информацию, как показано в следующем примере:
What is your first name? Betty Sue
What is your last name? Yew
What letter grade do you deserve? B
What is your age? 22
Name: Yew, Betty Sue
Grade: C
Age: 22

...Отметьте, что программа должна уменьшать значение grade на 1 шаг - то есть на одну букву выше. Предполагается, что пользователь может ввести A, B или C, то есть Вам не нужно беспокоиться о пропуске между D и F.


Собственно вопрос заключается вот в чем: Трудный для меня момент я выделил жирным. Как это можно сделать? В четвертой главе рассматривались составные типы (строки, массивы, последовательности, структуры, объединения, операции new и delete). Я не понимаю, как с их помощью можно решить эту задачу. Помогите, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2012, 15:50     Прата - составные типы
Посмотрите здесь:

Ищу книгу С. Прата C++
C++ Составные типы данных: структуры
Прата -> Шлее = PROFIT? C++
C++ Прата С. 6.6
C++ Ошибка в коде(С.Прата)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 16:27     Прата - составные типы #2
Я так сделал эту задачку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
int main()
{   using namespace std;
    cout<<"What is your first name? ";
    char fname[80] ;
    cin.getline(fname,80);
    cout<<"What is your last name? ";
    char lname[80];
    cin.getline(lname,80);
    cout<<"What letter grade do you deserve? ";
    char grade;
    cin>>grade;
    cout<<"What is your age? ";
    int a;cin>>a;
    cout<<"Name: "<<lname<<", "<<fname<<endl;
    cout<<"Grade: "<<(char) (grade+1)<<endl;
    cout<<"Age: "<<a<<endl;
    return 0;
}
Чтобы получить следующую букву нужно добавить 1
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
20.06.2012, 16:36     Прата - составные типы #3
Можно ище добавить небольшую проверку
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
cout<<"What letter grade do you deserve? ";
    char ch;
    while(true)
    {
        if (cin>>ch, isalpha(ch))
        {
            ch = toupper(ch);
            if (ch=='A' || ch=='B' || ch=='C')
                ++ch;
            break;
        }
        else {cout<<"Error. Try again: "; continue;}
    }
Twas
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 17:18  [ТС]     Прата - составные типы #4
Получилось, спасибо большое.

Добавлено через 36 минут
Еще одна задача не получается...

Есть такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "stdafx.h"
#include <iostream>
 
struct CandyBar
{
    char name[20];
    double weight;
    int kal;
};
 
int main()
{
    using namespace std;
    CandyBar snack[3]=
    {
        {"Mocha Munch", 2.30, 350},
        {"True",7.6,120},
        {"Crap",5,20}
    };
    cout<<"Group 1\n";
    cout<<"Name: "<<snack[0].name<<endl;
    cout<<"Weight: "<<snack[0].weight<<endl;
    cout<<"Kalories: "<<snack[0].kal<<endl;
    cout<<"Group 2\n";
    cout<<"Name: "<<snack[1].name<<endl;
    cout<<"Weight: "<<snack[1].weight<<endl;
    cout<<"Kalories: "<<snack[1].kal<<endl;
    cout<<"Group 3\n";
    cout<<"Name: "<<snack[2].name<<endl;
    cout<<"Weight: "<<snack[2].weight<<endl;
    cout<<"Kalories: "<<snack[2].kal<<endl;
    cin.get();
    return 0;
}
Теперь нужно вместо объявления массива из трех структур использовать операцию new для динамического размещения массива.
Как делать динамические массивы и динамические структуры с помощью new, я разобрался, а вот с динамическим массивом структур ничего не выходит...
Помогите, пожалуйста.
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 17:45     Прата - составные типы #5
9 задача из этого учебника
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
struct CandyBar
{
    char name[20];
    double w;
    unsigned int c;
};
int main()
{
    using namespace std;
    CandyBar *ps=new CandyBar[3];
    for (int i=0;i!=3;i++)
    {
    if (i!=0)
    cin.get();
    cout<<"Enter name "<<i+1<<": ";
    cin>>ps->name;
    cout<<"Enter W "<<i+1<<": ";
    cin>>ps->w;
    cout<<"Enter C "<<i+1<<": ";
    cin>>ps->c;
    cout<<"Name It's "<<ps->name<<endl;;
    cout<<"W it's "<<ps->w<<endl;
    cout<<"C it's "<<ps->c<<endl;
    ps++;;
    }
    delete []ps;
    return 0;
}
Динамическое выделение - 11 строка
Сначала объявляешь указатель типа структуры ,а потом определяешь его через new, У меня сделано в одной 11 строчке
Кстати число структур(в моем случе 3) лучше объявить до int main() вот так:
C++
1
const int size = 3;
и исппользовать вместо 3 size
Twas
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 17:56  [ТС]     Прата - составные типы #6
В твоем коде используется цикл, а это в данной книге - 5 глава, т.е. следующая.
Можно как-то инициализировать это все дело в самой программе?
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 18:01     Прата - составные типы #7
объявление идет до цикла
цикл введен чтобы не писать кучу раз выводы/вводы
Twas
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 18:05  [ТС]     Прата - составные типы #8
Так я так и делал, а потом когда пытался ввести данные, ничего не выходит.
Причем, я так понимаю, нужно, чтобы данные уже были введены во время компиляции, а не во время выполнения.
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 18:07     Прата - составные типы #9
Раз не поленился каждый элемент массива отдельно вывести, то инициализируй также:
C++
1
2
3
ps[1] = {"FF",12,12};
ps[2] = {"SS",123,12};
...
Но если, например, массив структур увеличится, то предется выводы и инициализацию дописывать для каждого нового элемента массива
Мне просто лень стало 9 выводов писать , я сделал в цикле
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
20.06.2012, 18:21     Прата - составные типы #10
Цитата Сообщение от yleart Посмотреть сообщение
ps[1] = {"FF",12,12};
ps[2] = {"SS",123,12};
Походу, это не будет компилироваться
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 18:31     Прата - составные типы #11
C++
1
2
3
4
ps->name ="asd";
ps->w = 1;
ps->c = 2;
ps++;
Если делать такую инициализацию, то name не знаю как инициализировать..Копилятор ругается
Twas
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 18:38  [ТС]     Прата - составные типы #12
Цитата Сообщение от yuron_477 Посмотреть сообщение
Походу, это не будет компилироваться
Так и есть это не компилируется.

Че ж делать тогда, если циклов я еще не знаю?
yleart
 Аватар для yleart
60 / 45 / 1
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 18:42     Прата - составные типы #13
считывай тогда через std::cin в это поле тогда все работает

Добавлено через 1 минуту
вобщем так:
C++
1
2
3
4
5
6
7
8
9
std::cin >>ps->name;
ps->w = 1;
ps->c = 2;
ps++;
std::cin>>ps->name;
ps->w = 3;
ps->c = 45;
ps++;
...
Интересно, почему работает?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
20.06.2012, 18:46     Прата - составные типы #14
А можно объявить конструктор в структуре:
C++
1
2
3
4
5
6
7
8
9
10
struct CandyBar
{
    char name[20];
    double w;
    unsigned int c;
    CandyBar(const char* ch = " ", double d = 0, unsigned int n = 0): w(d), c(n)
    {
        strncpy_s(name, ch, 19);
    }
};
Тогда можно писать:
C++
1
2
CandyBar *ps=new CandyBar[3];
    ps[0] = CandyBar("Char", 12,12);
yleart
20.06.2012, 18:47
  #15

Не по теме:

до конструкторов в структуре там еще глав 5 , а то и 10

Twas
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 18:53  [ТС]     Прата - составные типы #16
Не на своем месте задача, получается...
Спасибо большое, помогли. Пойду дальше штудировать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2013, 14:15     Прата - составные типы
Еще ссылки по теме:

Прата задача 6.9 C++
C++ C++ - Прата задача 6.9
C++ Составные типы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Brahmastra
 Аватар для Brahmastra
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 8
01.09.2013, 14:15     Прата - составные типы #17
Код
//4.9.cpp
#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;
struct CandyBar
{
       string naimen;
       float ves;
       unsigned int cal;
};
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    CandyBar * snack = new CandyBar[3]; 
    snack[0].naimen = "Семечки";
    snack[0].ves = 0.1;
    snack[0].cal = 800;
    snack[1].naimen = "Чипсы";
    snack[1].ves = 0.2;
    snack[1].cal = 530;
    snack[2].naimen = "Орешки";
    snack[2].ves = 0.25;
    snack[2].cal = 450;
    cout << "Первый снэк " << snack[0].naimen << " вес " 
    << snack[0].ves << " каллории " << snack[0].cal << endl; 
    cout << "Второйй снэк " << snack[1].naimen << " вес " 
    << snack[1].ves << " каллории " << snack[1].cal << endl;
    cout << "Третийй снэк " << snack[2].naimen << " вес " 
    << snack[2].ves << " каллории " << snack[2].cal << endl;
cin.get();
cin.get();
delete [] snack;
return 0;
}
Yandex
Объявления
01.09.2013, 14:15     Прата - составные типы
Ответ Создать тему
Опции темы

Текущее время: 00:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru