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

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

Войти
Регистрация
Восстановить пароль
 
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,204
#1

Почему склеиваются две строки, которые просто последовательно считываются - C++

06.12.2015, 09:59. Просмотров 158. Ответов 3
Метки нет (Все метки)

В функции ReadEmployee склеиваются date и married. Но там же нет никакой конкатенации... Как это исправить?
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;
 
struct Employee
{
    int number;
    char firstname[20], secondname[20],
        date[10],
        married[50],
        position[50];
    int year;
};
 
void PrintEmployee(Employee emp)
{
    cout << "Номер записи: " << emp.number << endl
        << "Фамилия: " << emp.secondname << endl
        << "Имя: " << emp.firstname << endl
        << "Должность: " << emp.position << endl
        << "Год поступления на должность: " << emp.year << endl
        << "Стаж: " << 2015 - emp.year << endl
        << "Дата рождения: " << emp.date << endl
        << "Семейное положение: " << emp.married << endl << endl;
}
 
Employee ReadEmployee()
{
    cout << "Зашли в Read...\n";
    Employee newemp;
    cout << "Введите № записи: ";
    cin >> newemp.number;
    fflush(stdin);
    cout << "Введите имя: ";
    gets(newemp.firstname);
    cout << "Введите фамилию: ";
    gets(newemp.secondname);
    cout << "Дата рождения: ";
    fflush(stdin);
    gets(newemp.date);
    cout << "Семейное положение: ";
    fflush(stdin);
    gets(newemp.married);
    cout << "Должность: ";
    gets(newemp.position);
    cout << "Год поступления на должность: ";
    cin >> newemp.year;
    cout << endl;
    PrintEmployee(newemp);
    return newemp;
}
 
void Add(Employee a[], int &n)
{
    Employee newemp = ReadEmployee();
    cout << "Зашли в Add...\n";
    PrintEmployee(newemp);
    for (int i = 0; i < n; i++)
        if (strcmp(newemp.secondname, a[i].secondname) <= 0)
        {
            for (int j = n; j > i; j--)
                a[j] = a[j - 1];
            a[i] = newemp;
            break;
        }
    n++;
}
 
void Print(Employee a[], int n)
{
    for (int i = 0; i < n; i++)
        PrintEmployee(a[i]);
}
 
void Edit(Employee a[], int n)
{
    int number, pos;
    cout << "Введите номер записи: ";
    cin >> number;
    for (pos = 0; pos < n && a[pos].number != number; pos++);
    if (pos == n)
        cout << "Запись с указанным номером не найдена!\n";
    else
    {
        a[pos] = ReadEmployee();
        cout << "Запись успешно изменена!\n";
    }
}
 
void Delete(Employee a[], int &n)
{
    int number, pos;
    cout << "Введите номер записи: ";
    cin >> number;
    for (pos = 0; pos < n && a[pos].number != number; pos++);
    if (pos == n)
        cout << "Запись с указанным номером не найдена!\n";
    else
    {
        for (int i = pos; i < n - 1; i++)
            a[i] = a[i + 1];
        n--;
        cout << "Запись успешно удалена!\n";
    }
}
 
void SearchBySecondname(Employee a[], int n)
{
    char secondname[20];
    cout << "Введите фамилию: ";
    fflush(stdin);
    gets(secondname);
    for (int i = 0; i < n; i++)
        if (strcmp(a[i].secondname, secondname) == 0)
        {
            PrintEmployee(a[i]);
            break;
        }
}
 
void SearchByPos(Employee a[], int n)
{
    char word[20];
    cout << "Введите ключевое слово: ";
    fflush(stdin);
    gets(word);
    for (int i = 0; i < n; i++)
        if (strstr(a[i].position, word) != NULL)
            PrintEmployee(a[i]);
}
 
int Menu()
{
    int choice;
    system("cls");
    cout << "1 - Вывод списка сотрудников на экран\n"
        << "2 - Добавление новой записи\n"
        << "3 - Редактирование записи с указанным номером\n"
        << "4 - Удаление записи с указанным номером\n"
        << "5 - Поиск записи по фамилии\n"
        << "6 - Поиск записи по ключевому слову в должности\n"
        << "0 - Выход из программы\n"
        << "Ваш выбор: ";
    cin >> choice;
    cout << endl;
    return choice;
}
 
int main()
{
    Employee info[500];
    int N = 0, n;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    cout << "Введите количество сотрудников: ";
    cin >> n;
    for (int i = 0; i < n; i++)
        Add(info, N);
 
    while (true)
    {
        switch (Menu())
        {
        case 0:
            return 0;
        case 1:
            Print(info, N);
            break;
        case 2:
            Add(info, N);
            break;
        case 3:
            Edit(info, n);
            break;
        case 4:
            Delete(info, n);
            break;
        case 5:
            SearchBySecondname(info, n);
            break;
        case 6:
            SearchByPos(info, n);
            break;
        }
        system("pause");
    }
}
Миниатюры
Почему склеиваются две строки, которые просто последовательно считываются  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2015, 09:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему склеиваются две строки, которые просто последовательно считываются (C++):

вывести из строки те слова ,которые содержат две буквы z. - C++
вывести из строки те слова ,которые содержат две буквы z. ПОМОГИТЕ ПОЖАЛУСТА

Пользователь вводит две строки, которые сохраняются в динамические массивы - C++
Кто знает, как решить задачу на С++?Задание на строки. Пользователь вводит две строки, которые сохраняются в динамические массивы. ...

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

Если в матрице найдутся две соседние строки, которые состоят из четных элементов, поменять их местами - C++
Отладка идет, результат не верный. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;conio.h&gt; #include &lt;clocale&gt; int main() ...

Почему в этой программе (n+2) и [m+2] а не просто n и m? - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; void main() { setlocale(LC_ALL, &quot;rus&quot;); ...

Почему не работает программа на проверку просто числа? - C++
#include &quot;stdafx.h&quot; #include&lt;iostream&gt; using namespace std; int main() { int a,i,b; cin&gt;&gt;a; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5309 / 4629 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
06.12.2015, 10:16 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Потому что для date мало 10 элементов, больше делай. И что это за смесь iostream с древними функциями? gets() вообще не входит в стандарт. Есть же cin.getline().
zss
Модератор
Эксперт С++
6359 / 5923 / 1920
Регистрация: 18.12.2011
Сообщений: 15,223
Завершенные тесты: 1
06.12.2015, 10:17 #3
У меня (VS 2008) не склеиваются, но функция Add неправильная.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Add(Employee a[], int &n)
{
    Employee newemp = ReadEmployee();
    cout << "Зашли в Add...\n";
    PrintEmployee(newemp);
    a[n++] = newemp; // добавил эту строку
    /*
    for (int i = 0; i < n; i++)
        if (strcmp(newemp.secondname, a[i].secondname) <= 0)
        {
            for (int j = n; j > i; j--)
                a[j] = a[j - 1];
            a[i] = newemp;
            break;
        }
    n++;
    */
}
И, естественно, поддерживаю nmcf. Не надо смешивать Сишные и потоковые функции ввода.
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,204
06.12.2015, 12:12  [ТС] #4
zss, понятно - в начале цикл-то не выполнялся ни разу... А почему в таком варианте происходит Access violation?
C++
1
2
3
4
5
6
7
8
9
10
11
void Add(Employee a[], int &n)
{
    Employee newemp = ReadEmployee();
    int pos = 0;
    while (strcmp(newemp.secondname, a[pos].secondname) > 0)
        pos++;
    for (int i = n; i > pos; i--)
        a[i] = a[i - 1];
    a[pos] = newemp;
    n++;
}
Добавлено через 1 час 36 минут
мды, забыла про количество элементов))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2015, 12:12
Привет! Вот еще темы с ответами:

Почему нельзя написать просто - using namespace boost; - C++
Доброго времени суток. В общем, есть программа, в которой я использую тип cpp_int. Вроде его объявление содержится в заголовочном файле...

Две программы которые последовательно запускаются - C#
Нужно написать программу с текстом &quot;Hello World&quot; которая автоматически запустит вторую пустую. Вторая не должна работать без...

Множества.Даны две строки. Напечатать те символы, которые входят в первую но не во вторую строки - Pascal ABC
Помогите решить:) Можно только циклы,остальное сделаю сам. Даны две строки. Напечатать те символы, которые входят в первую но не во...

Почему на считываются данные ? - PHP
Почему не считываються данные ? Парни помогите!!! Вроде все правильно, но он показывает как будто бы переменная пустая ... ...


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

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

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