1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
1

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

20.06.2012, 15:50. Показов 2586. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Недавно начал заниматься С++ по книге Прата.
Прошел четвертую главу и встретил такую задачу:
Напишите программу С++, которая запрашивает и отображает информацию, как показано в следующем примере:
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). Я не понимаю, как с их помощью можно решить эту задачу. Помогите, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2012, 15:50
Ответы с готовыми решениями:

Составные типы
Здравствуйте. Поясните пожалуйста выражение r=&i и int*&r=p. Напишите им эквивалентные если можно....

Составные типы данных: структуры
Помогите решить задачи пожалуйста!!! Дан массив данных о работниках фирмы: ФИО и год поступления...

Прата С. 6.6
написал код, но после ввода первой структуры в цикле, выдает ошибку( //6.6.cpp #include...

С.Прата, задача 3.5
Гляньте, пожалуйста. Задача на преобразование целочисленных типов в с плавающей точкой. Вроде бы я...

16
60 / 45 / 12
Регистрация: 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
1
1458 / 795 / 257
Регистрация: 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;}
    }
0
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, я разобрался, а вот с динамическим массивом структур ничего не выходит...
Помогите, пожалуйста.
0
60 / 45 / 12
Регистрация: 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
0
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 17:56  [ТС] 6
В твоем коде используется цикл, а это в данной книге - 5 глава, т.е. следующая.
Можно как-то инициализировать это все дело в самой программе?
0
60 / 45 / 12
Регистрация: 07.10.2011
Сообщений: 139
20.06.2012, 18:01 7
объявление идет до цикла
цикл введен чтобы не писать кучу раз выводы/вводы
0
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 18:05  [ТС] 8
Так я так и делал, а потом когда пытался ввести данные, ничего не выходит.
Причем, я так понимаю, нужно, чтобы данные уже были введены во время компиляции, а не во время выполнения.
0
60 / 45 / 12
Регистрация: 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 выводов писать , я сделал в цикле
0
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
20.06.2012, 18:21 10
Цитата Сообщение от yleart Посмотреть сообщение
ps[1] = {"FF",12,12};
ps[2] = {"SS",123,12};
Походу, это не будет компилироваться
1
60 / 45 / 12
Регистрация: 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 не знаю как инициализировать..Копилятор ругается
0
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 18:38  [ТС] 12
Цитата Сообщение от yuron_477 Посмотреть сообщение
Походу, это не будет компилироваться
Так и есть это не компилируется.

Че ж делать тогда, если циклов я еще не знаю?
0
60 / 45 / 12
Регистрация: 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++;
...
Интересно, почему работает?
0
1458 / 795 / 257
Регистрация: 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);
0
yleart
20.06.2012, 18:47
  #15

Не по теме:

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

0
1 / 1 / 0
Регистрация: 20.06.2012
Сообщений: 28
20.06.2012, 18:53  [ТС] 16
Не на своем месте задача, получается...
Спасибо большое, помогли. Пойду дальше штудировать.
0
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;
}
0
01.09.2013, 14:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2013, 14:15
Помогаю со студенческими работами здесь

Прата задача 6.9
Всем доброго времени суток, подскажите как сделать что бы программа в строке 32 принимала имена с...

C++ - Прата задача 6.9
Подскажите пожалуйста в чем ошибка?не обрабатывается условие неправильного ввода имени файла....

Прата -> Шлее = PROFIT?
Изучением программирования занялся от безделья. Путём гугления выбрал С++. В качестве первой книги...

Ищу книгу С. Прата
Всем добрый день! ищу книгу Стивена Прата &quot;Язык программирования C (Си). Лекции и упражнения, 5-е...

Прата и умные указатели
Читаю Прата С. - Язык программирования С++. Лекции и упражнения - 2011, стр. 886: Пишу,...

Ошибка в коде(С.Прата)
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; int _tmain(int argc, _TCHAR* argv)...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru