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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.82
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
#1

Пример структуры для изучения - C++

11.10.2013, 22:25. Просмотров 5332. Ответов 37
Метки нет (Все метки)

Пожалуйста,приведите пример структуры для разбора,сначала пробовал смотреть чужие темы на эту тему на форуме,но там у всех со своими ошибками,что побудило создать свою тему чем запоминать чужие ошибки.
Например что должно быть в структуре:
1, Описать структуру с именем Dota2, содержащую следующие поля:
- Имя героя;
- Основная характеристика;
- Его роль.
2. Следующие действия:
- ввод с клавиатуры данных в массив, состоящий из десяти структур типа Dota2; записи должны быть размещены по алфавиту.
- вывод на дисплей имена героев, чья основная характеристика введенная с клавиатуры;
- если таких героев нет, вывести на дисплей соответствующее сообщение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2013, 22:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пример структуры для изучения (C++):

Какие книги посоветуйте для изучения для изучения STL, C++ - C++
Попробовал Страуструп но видимо сложновато пока.

Легкий пример про структуры - C++
Задача заключается в том чтобы присвоить значения переменной х и всем объектам к которым она имеет отношение.

Нужен пример объявления структуры - C++
прошу помощи разобраться любая структура struct human { int age; int height; }; если я знаю какое именно количество будет...

Указатели на структуры. Программа-пример из книги Шилдта - C++
Здравствуйте. Прошу проверить, правильно ли я поняла значение каждой строчки, т.к. в книге построчного объяснения не дается. Еще хотелось...

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

Программа для вывода картинок (карточки для изучения ин.яз) - C++
Люди добрые, меня зовут Иляна. Извините что я к вам обращаюсь. Дело в том что сейчас я и моя группа изучаем иностранный язык (а именно...

37
Genn55
368 / 215 / 41
Регистрация: 26.12.2012
Сообщений: 708
11.10.2013, 22:50 #2
Посмотрите здесь
http://ci-plus-plus-snachala.ru/?p=30
1
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
12.10.2013, 11:42  [ТС] #3
Ваша ссылка помогла,но не во всём.
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 1, Описать структуру с именем WORKER, содержащую следующие поля:
// - фамилия и инициалы работника;
// - название занимаемой должности;
// - год поступления на работу.
// 2. Написать программу, выполняющую следующие действия:
// - ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; записи должны быть размещены по алфавиту.
// - вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;
// - если таких работников нет, вывести на дисплей соответствующее сообщение.
 
#include "stdafx.h"
#include "iostream"
#include <locale>
#include <conio.h>
#include <string>
using namespace std;
 
struct WORKER
{
    int F;
    int I;
    int O;
    int Name;
    int Year;
};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    const int size = 10;
    int i,b,c = 0;
    WORKER a[size];
    for ( i = 0; i < size; i++ )
    {
        cout << "Введите Ф.И.О. "
             << i + 1
             << "-ого работника "
             << endl;
        cout << "Фамилия: ";
        cin >> a[i].F;
        cout << "Имя: ";
        cin >> a[i].I;
        cout << "Отчество ";
        cin >> a[i].O;
        cout << endl;
        cout << "Его должность: ";
        cin >> a[i].Name;
        cout << endl;
        cout << "Год поступления на работу: ";
        cin >> a[i].Year;
        cout << endl;
    }
    cout << "Введите стаж работы";
    cin >> b;
    cout << endl;
    for ( i = 0; i < size; i++)
    {
        if ( b < a[i].Year )
        {
            cout << a[i].F
                 << " ";
            c++;
        }
        else if ( i == size - 1 && c > 0 )
        {
            cout << "Работников с более высоким стажом нет.";
        }
    }
 
system("pause");
return 0;
}
При вводе текста на Русском или Английском языке,вся программа прокручивается без последующих запросов ввода(cin)
При цифрах всё в порядке.
К тому же не понятно как сделать сортировку по алфавиту.
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.10.2013, 12:20 #4
Цитата Сообщение от StriBog45 Посмотреть сообщение
При цифрах всё в порядке.
Ну у тебя только цифры можно вводить int стоить, что бы можно вводить строку нужно ставить char*
C++
1
2
3
4
5
6
7
8
struct WORKER
{
    int F;
    int I;
    int O;
    int Name;
    int Year;
};
Наверно нужно как то так сделать:
C++
1
2
3
4
5
6
7
8
struct WORKER
{
    char F[30];
    char I[30];
    char O[30];
    int Name;
    int Year;
};
Добавлено через 4 минуты
Цитата Сообщение от StriBog45 Посмотреть сообщение
К тому же не понятно как сделать сортировку по алфавиту.
Просто сравнивай первую букву, операциями > <, ну например как то так сортировку по F
if(a[i].F[0]>a[j].F[0]) то меняешь местами.
0
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
12.10.2013, 13:59  [ТС] #5
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "stdafx.h"
#include "iostream"
#include <locale>
#include <conio.h>
#include <string>
using namespace std;
 
struct WORKER
{
    char F;
    char I;
    char O;
    char Name;
    int Year;
};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    const int size = 10;
    int i,b,c = 0;
    WORKER a[size];
    for ( i = 0; i < size; i++ )
    {
        cout << "Введите Ф.И.О. "
             << i + 1
             << "-ого работника "
             << endl;
        cout << "Фамилия: ";
        cin >> a[i].F;
        cout << "Имя: ";
        cin >> a[i].I;
        cout << "Отчество ";
        cin >> a[i].O;
        cout << endl;
        cout << "Его должность: ";
        cin >> a[i].Name;
        cout << endl;
        cout << "Год поступления на работу: ";
        cin >> a[i].Year;
        cout << endl;
    }
    cout << "Введите стаж работы";
    cin >> b;
    cout << endl;
    for ( i = 0; i < size; i++)
    {
        if ( b < a[i].Year )
        {
            cout << a[i].F
                 << " ";
            c++;
        }
        else if ( i == size - 1 && c > 0 )
        {
            cout << "Работников с более высоким стажом нет.";
        }
    }
 
system("pause");
return 0;
}
Теперь при вводе одной буквы,программа работает. При вводе двух букв в Фамилии,строка Имя пропускается и переходит сразу на Отчество. Если Вводить три и более букв,то сразу вся программа прокручивается

Добавлено через 2 минуты
Цитата Сообщение от ninja2 Посмотреть сообщение
Просто сравнивай первую букву, операциями > <, ну например как то так сортировку по F
if(a[i].F[0]>a[j].F[0]) то меняешь местами.
Если первые буквы одинаковы,то должны сравниваться вторые,вторые одинаковы и сравниваются третие... и.т.д
И неизвестно сколько должно быть сравнений. Нужен какой-то цикл
0
Tsin
713 / 458 / 132
Регистрация: 30.12.2012
Сообщений: 1,250
Записей в блоге: 2
Завершенные тесты: 3
12.10.2013, 14:01 #6
StriBog45, тогда Вам следует начать с чего-то более простого, чем структуры
Цитата Сообщение от StriBog45 Посмотреть сообщение
При вводе двух букв в Фамилии,строка Имя пропускается
Так происходит, потому что типы переменных в структуре - char-ы. Они хранят по одному символу.
При вводе нескольких символов вы заполняете сразу несколько полей по одному символу в каждый.
1
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
12.10.2013, 15:31  [ТС] #7
Цитата Сообщение от Tsin Посмотреть сообщение
Так происходит, потому что типы переменных в структуре - char-ы. Они хранят по одному символу.
При вводе нескольких символов вы заполняете сразу несколько полей по одному символу в каждый.
Разве нет способа для пользователя вводить целые имена(Володя,Эдик... т.п.)?

Добавлено через 36 минут
Есть такая мысль,что можно задать массив для каждого заполнения,и каждую букву приравнивать к B[ i + 1 ],но как он это будет считывать...
0
Tsin
713 / 458 / 132
Регистрация: 30.12.2012
Сообщений: 1,250
Записей в блоге: 2
Завершенные тесты: 3
12.10.2013, 18:08 #8
Цитата Сообщение от StriBog45 Посмотреть сообщение
Разве нет способа для пользователя вводить целые имена
Конечно есть! можно сделать поля либо фиксированного размера, как сказал вам ninja2, либо типа указателя на char.
C++
1
2
3
char F[30];    
//либо 
char* F;
1
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
12.10.2013, 18:24  [ТС] #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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 1, Описать структуру с именем WORKER, содержащую следующие поля:
// - фамилия и инициалы работника;
// - название занимаемой должности;
// - год поступления на работу.
// 2. Написать программу, выполняющую следующие действия:
// - ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; записи должны быть размещены по алфавиту.
// - вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;
// - если таких работников нет, вывести на дисплей соответствующее сообщение.
 
#include "stdafx.h"
#include "iostream"
#include <locale>
#include <conio.h>
#include <string>
using namespace std;
 
struct WORKER
{
    char F[30];
    char I[30];
    char O[30];
    char Name[30];
    int Year;
};
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    const int size = 10;
    int i,b,c = 0;
    WORKER a[size];
    for ( i = 0; i < size; i++ )
    {
        cout << "Введите Ф.И.О. "
             << i + 1
             << "-ого работника "
             << endl;
        cout << "Фамилия: ";
        cin >> a[i].F;
        cout << "Имя: ";
        cin >> a[i].I;
        cout << "Отчество ";
        cin >> a[i].O;
        cout << endl;
        cout << "Его должность: ";
        cin >> a[i].Name;
        cout << endl;
        cout << "Год поступления на работу: ";
        cin >> a[i].Year;
        cout << endl;
    }
    cout << "Введите стаж работы ";
    cin >> b;
    cout << endl;
    for ( i = 0; i < size; i++)
    {
        if ( b < 2013 - a[i].Year )
        {
            cout << a[i].F
                 << " ";
            c++;
        }
        else if ( i == size - 1 && c > 0 )
        {
            cout << "Работников с более высоким стажом нет.";
        }
    }
 
system("pause");
return 0;
}
Вот такой код получился в данный момент. Работает,но при выводе русских слов получается "ыЧждлг"....
Не корректно выводит русский.
Так же остался вопросов с сортировкой по алфавиту. Как и говорил ранее: если первые буквы одинаковы,то должны сравниваться вторые,вторые одинаковы и сравниваются третьи... и.т.д.
И неизвестно сколько должно быть сравнений. Нужен какой-то цикл
0
Tsin
713 / 458 / 132
Регистрация: 30.12.2012
Сообщений: 1,250
Записей в блоге: 2
Завершенные тесты: 3
13.10.2013, 00:06 #10
StriBog45, проблему кракозябр можно попробовать решить так :
C++
1
2
3
#include <Windows.h>;
 
SetConsoleCP(1251);
Сравнение строк в лексикографическом порядке выглядит так :
C++
1
2
3
4
5
6
7
8
9
10
#include <string.h>;
 
char F1[30] = "Иванов";
char F2[30] = "Сидоров";
 
int result = strcmp(F1, F2);
 
// result < 0 - значит, F1 < F2
// result = 0 - значит, F1 = F2
// result > 0 - значит, F1 > F2
1
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
13.10.2013, 09:07  [ТС] #11
Цитата Сообщение от Tsin Посмотреть сообщение
#include <string.h>;
char F1[30] = "Иванов";
char F2[30] = "Сидоров";
int result = strcmp(F1, F2);
// result < 0 - значит, F1 < F2
// result = 0 - значит, F1 = F2
// result > 0 - значит, F1 > F2
Если я правильно понял,то
#include <string.h> нужен для strcmp
F1,F2 входные данные
result = strcmp тот самый цикл который сравнивает алфавит
result < 0 значит, что всё стоит по алфавиту
result = 0 значит, что слова полностью одинаковы
result > 0 значит, что в первом слове буквы алфавита более поздние чем во втором,их надо менять местами.

Попытался это сделать методом пузырька,но программе он не нравится...
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// 1, Описать структуру с именем WORKER, содержащую следующие поля:
// - фамилия и инициалы работника;
// - название занимаемой должности;
// - год поступления на работу.
// 2. Написать программу, выполняющую следующие действия:
// - ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; записи должны быть размещены по алфавиту.
// - вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;
// - если таких работников нет, вывести на дисплей соответствующее сообщение.
 
#include "stdafx.h"
#include "iostream"
#include <locale>
#include <conio.h>
#include <string.h>    // Для алфавита,strcmp
#include <Windows.h>   // Для SetConsoleCP(1251);
using namespace std;
 
struct WORKER
{
    char F[30];
    char I[30];
    char O[30];
    char Name[30];
    int Year;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    const int size = 10;
    int i,b,c = 0;
    char* d;
    WORKER a[size];
    for ( i = 0; i < size; i++ )
    {
        cout << "Введите Ф.И.О. "
             << i + 1
             << "-ого работника "
             << endl;
        cout << "Фамилия: ";
        cin >> a[i].F;
        cout << "Имя: ";
        cin >> a[i].I;
        cout << "Отчество ";
        cin >> a[i].O;
        cout << endl;
        cout << "Его должность: ";
        cin >> a[i].Name;
        cout << endl;
        cout << "Год поступления на работу: ";
        cin >> a[i].Year;
        cout << endl;
    }
 
    for ( i = 0; i < size; i++)
    {
        int result = strcmp(a[i].F, a[i + 1].F);
        if ( a[i].F > a[i + 1].F )
        {
            d = a[i].F;
            a[i].F = a[i + 1].F;
            a[i + 1] = d;
        }
    }
    cout << "Список рабочих: "
         << endl;
    for ( i = 0; i < size; i++)
    {
        cout << a[i].F
             << endl;
    }
 
    cout << "Введите стаж работы ";
    cin >> b;
    cout << endl;
    SetConsoleCP(1251); // Переводит крякозябру на русский язык
    for ( i = 0; i < size; i++)
    {
        if ( b < 2013 - a[i].Year )
        {
            cout << a[i].F
                 << " ";
            c++;
        }
        else if ( i == size - 1 && c > 0 )
        {
            cout << "Работников с более высоким стажом нет.";
        }
    }
 
system("pause");
return 0;
}
0
Tsin
713 / 458 / 132
Регистрация: 30.12.2012
Сообщений: 1,250
Записей в блоге: 2
Завершенные тесты: 3
13.10.2013, 12:04 #12
StriBog45, если я тебя правильно понял, то тебе надо сравнивать фамилии у разных структур.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Пусть a - массив из N структур.
 
//Цикл до N-2, потому что последними будут сравниваться a[N-2] и a[N-1] элементы,
//a[N-1] - последний. Значит, цикл обойдет все пары
for(int i = 0; i < N - 2; i++) 
{
    char[30] temp;
    //Сортировка по возрастанию, от 'А' до 'Я'
    if(strcmp(a[i].F, a[i + 1].F) < 0) 
    {
        strcpy(temp, a[i].F);
        strcpy(a[i].F, a[i + 1].F);
        strcpy(a[i + 1].F, temp);
    }
}
1
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
13.10.2013, 15:07  [ТС] #13
Цитата Сообщение от Tsin Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
for(int i = 0; i < N - 2; i++) 
{
    char[30] temp;
    //Сортировка по возрастанию, от 'А' до 'Я'
    if(strcmp(a[i].F, a[i + 1].F) < 0) 
    {
        strcpy(temp, a[i].F);
        strcpy(a[i].F, a[i + 1].F);
        strcpy(a[i + 1].F, temp);
    }
}
Error: идентификатор "temp" не определён.
0
Tsin
713 / 458 / 132
Регистрация: 30.12.2012
Сообщений: 1,250
Записей в блоге: 2
Завершенные тесты: 3
13.10.2013, 17:41 #14
C++
1
2
//Да, я забыл. Задай какое-нибудь начальное значение для temp, например
char[30] temp = " ";
1
StriBog45
6 / 6 / 2
Регистрация: 03.09.2013
Сообщений: 81
13.10.2013, 17:51  [ТС] #15
И всё равно идентификатор не определён,ещё и точку с запятой требует перед temp
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// 1, Описать структуру с именем WORKER, содержащую следующие поля:
// - фамилия и инициалы работника;
// - название занимаемой должности;
// - год поступления на работу.
// 2. Написать программу, выполняющую следующие действия:
// - ввод с клавиатуры данных в массив, состоящий из десяти структур типа WORKER; записи должны быть размещены по алфавиту.
// - вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;
// - если таких работников нет, вывести на дисплей соответствующее сообщение.
 
#include "stdafx.h"
#include "iostream"
#include <locale>
#include <conio.h>
#include <string.h>    // Для алфавита,strcmp
#include <Windows.h>   // Для SetConsoleCP(1251);
using namespace std;
 
struct WORKER
{
    char F[30];
    char I[30];
    char O[30];
    char Name[30];
    int Year;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    const int size = 10;
    int i,b,c = 0;
    char* d;
    WORKER a[size];
    for ( i = 0; i < size; i++ )
    {
        cout << "Введите Ф.И.О. "
             << i + 1
             << "-ого работника "
             << endl;
        cout << "Фамилия: ";
        cin >> a[i].F;
        cout << "Имя: ";
        cin >> a[i].I;
        cout << "Отчество ";
        cin >> a[i].O;
        cout << endl;
        cout << "Его должность: ";
        cin >> a[i].Name;
        cout << endl;
        cout << "Год поступления на работу: ";
        cin >> a[i].Year;
        cout << endl;
    }
 
 
    for(int i = 0; i < N - 2; i++) 
 
    {    
        char[30] temp = " ";
        if(strcmp(a[i].F, a[i + 1].F) < 0)     
        {        
            strcpy(temp, a[i].F);        
            strcpy(a[i].F, a[i + 1].F);        
            strcpy(a[i + 1].F, temp);    
        }
    }
    cout << "Список рабочих: "
         << endl;
    for ( i = 0; i < size; i++)
    {
        cout << a[i].F
             << endl;
    }
 
    cout << "Введите стаж работы ";
    cin >> b;
    cout << endl;
    SetConsoleCP(1251); // Переводит крякозябру на русский язык
    for ( i = 0; i < size; i++)
    {
        if ( b < 2013 - a[i].Year )
        {
            cout << a[i].F
                 << " ";
            c++;
        }
        else if ( i == size - 1 && c > 0 )
        {
            cout << "Работников с более высоким стажом нет.";
        }
    }
 
system("pause");
return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2013, 17:51
Привет! Вот еще темы с ответами:

Приведите пример, как можно связать знания консольного C++ (где алгоритмы, структуры, массивы) с WinAPI? - C++
WinAPI это чтобы взаимодействовать с виндой а вся сложность c++ обучают в консоли Вопрос:как можно связать знания по шаблонным...

Сайты для изучения с++ - C++
Привет всем!Народ не подскажете есть ли еще сайты по изучению с++ на подобие ''интуит''-а? Заранее всем спасибо:)

Материалы для изучения - C++
Подскажите пожалуйста какие-нибудь статьи по ссылкам и указателям.

Литература для изучения С++ - C++
Посоветуйте книгу которую можно взять как основной учебник по С++, я купил &quot;Полный справочник по С++ Г. Шилдт&quot; прочитал около половины и...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
13.10.2013, 17:51
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru