Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
1

Работа с функцией strcmp

10.12.2017, 18:59. Показов 1486. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
добрый вечер . создала структуру . реализовала почти все условия . нужно вывести на экран количество иногородних пациентов . понимаю что нужно использовать STRCMP , но как не кручу выбивает 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
void File_zadanie()
{
    puts("\n Выберите условие :");
    puts("1 - Вывод  количества иногородних пациентов");
    puts("2 - Сортировка по диагнозу");
    int num;
    char key;
    do
        key = _getche();
 
    while ((key != '1') && (key != '2'));
    if (key == '1')
    {
        File_read();
        int j = 0; int sum = 0; 
        FILE *f;
        if (!(f = fopen("Poliklinika_File.dat", "rb"))) // r  –  файл открывается только для чтения ,b – файл открывается в бинарном режиме 
        {
            printf("\nОшибкa открытия файла\n");
            
        }
        while (fread(&b[j], sizeof(a), 1, f))
            if (feof(f)) break;
 
        
        for (i = 0; i < j; i++) {
            if (!strcmp(a.gorod, "Kiev") == 0) {
                j++;
            }
            sum++;
        }
        cout << " \n Количество иногородних пациентов = " << sum << endl; 
 
        fclose(f);
        printf("----------------------------------------------------------------\n");
        return;
 
    }
Добавлено через 23 минуты
т е нужно вывести количество пациентов которые проживают не в Киеве
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2017, 18:59
Ответы с готовыми решениями:

Ошибка в коде с функцией strcmp
строка с функцией strcmp не работает,пробовал делать элементы структуры char,но все равно говорит...

Сравнение двух строк функцией strcmp
Напишите программу, которая использует функцию strcmp для сравнения двух строк, вводимых...

Неправильная работа Функции strcmp
Здравствуйте,не могу разобраться,почему не работает блок с проверкой на те слова, которые не...

Работа с функцией
Привет Всем!!! Помогите пожалуйста. Нужно: Определить функцию, которая возвращает натуральное...

12
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
10.12.2017, 19:12 2
Попробуйте так
C
1
if( !(strcmp(a.gorod, "Kiev") == 0) ){
или
C
1
if( strcmp(a.gorod, "Kiev") != 0 ){
0
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
10.12.2017, 19:24  [ТС] 3
спасибо за ответ , к сожалению всё равно выдаёт 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
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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#define _CRT_SECURE_NO_WARNINGS 
#include <fstream> // библ. C++, включающая набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл. 
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <Windows.h>
#include <iostream>
#include <algorithm> 
using namespace std; 
 
typedef struct Poliklinika  
{
    char Familiya[30];          
    int vozrost;                
    char pol[300];              
    char gorod[300];             // город
    char diagnoz[300];            // диагноз 
 
}   polik;
polik a, b[30], c[30];
 
void File_write()  
{
    printf("\nСоздание файла и заполнение структуры.\n<ENTER> - продолжить; <ESC> - отмена\n");
    char key = _getch();
    if (key != '\r')return;
    FILE *f;
    if (!(f = fopen("Poliklinika_File.dat", "wb"))) // режим открытия файла ,w – запись в текстовом режиме; b – файл открывается в бинарном режиме ;
    {
        puts("Файл не может быть создан или открыт."); return;
    }
    while (true)
    {
        int w;                          
        while ((w = getchar()) != '\n' && w != EOF);
        //flushall();
        puts("Введите фамилию пациента:"); gets_s(a.Familiya);   
        puts("Возраст:"); scanf("%d", &a.vozrost);  
        puts("Пол:"); scanf("%s", &a.pol);
        puts("Город:"); scanf("%s", &a.gorod);
        puts("Диагноз:"); scanf("%s", &a.diagnoz);
 
        fwrite(&a, sizeof(a), 1, f);    //Сохранение в файл блока данных                          
        printf("--------------------------------------------------------------\n<ESC> - для окончания записи; <ENTER> - для добавления продукции\n");
        key = _getch();
        if (key == 27)break;
    }
    fclose(f);
    printf("\nКонец создания записи\n");
}
 
int File_read() // просмотр файла созданного 
{
    int j = 0;
    FILE *f;
    if (!(f = fopen("Poliklinika_File.dat", "rb"))) // r  –  файл открывается только для чтения ,b – файл открывается в бинарном режиме 
    {
        printf("\nОшибкa открытия файла\n");
        return 0;
    }
    printf("\n[Содержимое файла Poliklinika_File.dat]\n\n № |Фамилия пациента |Возраст |Пол |   Город    |    Диагноз   |\n----------------------------------------------------------------\n");
    while (fread(&b[j], sizeof(a), 1, f))
    {
        if (feof(f)) break;
        printf("%2d | %10s      | %3d    | %2s |%7s     |%9s     | \n", j, b[j].Familiya, b[j].vozrost, b[j].pol, b[j].gorod , b[j].diagnoz);
        j++;
    }
    fclose(f);
    printf("----------------------------------------------------------------\n");
    return j;
}
 
void File_redactor()
{
    puts("\nМеню редактирование файла:"); 
    puts("1 - Добавление пациента");
    puts("2 - Удаление пациента");
    puts("3 - Редактирование пациента");
    puts("4 - Возврата в главное меню");
 
    int n = 0, i = 0, j;
    char key;
    do
        key = _getche();
    while ((key != '1') && (key != '2') && (key != '3') && (key != '4'));
    
    if (key == '3')  //   РЕДАКТИРОВАНИЕ
    {
        j = File_read();                        
        printf("Для редактирования введите номер из списка:\n");
        do scanf("%d", &n);                     
 
        while (!(n <= j));
        FILE *f;
        if (!(f = fopen("Poliklinika_File.dat", "wb")))     
        {
            printf("Ошибкa открытия файла\n");    return;
        }
        for (i = 0; i < j; i++)
        {
            if (i == n)                         
            {
                int r;
                while ((r = getchar()) != '\n' && r != EOF);
                printf("Введите фамилию пациента:"); gets_s(c[n].Familiya);
                printf("Возраст:"); scanf("%d", &c[n].vozrost);
                printf("Пол: "); scanf("%s", &c[n].pol);
                printf("Город:"); scanf("%s", &c[n].gorod);
                printf("Диагноз:"); scanf("%s", &c[n].diagnoz);
                fwrite(&c[n], sizeof(a), 1, f);//вводим вместо редактируемой записи свой элемент и продолжаем цикл
            }
            if (i != n)                         
                fwrite(&b[i], sizeof(a), 1, f);
        }
        fclose(f);
    }
    
    else if (key == '2')  // удаление пациента
    {
        j = File_read();                        
        printf("Для удаления введите номер из списка:\n");
        do scanf("%d", &n);                     
        while (!(n <= j));
        FILE *f;
        if (!(f = fopen("Poliklinika_File.dat", "wb")))     //открываем с целью полностью переписать из памяти
        {
            printf("Ошибкa открытия файла\n");    return;
        }
        for (i = 0; i < j; i++)                 //считаем по удаляемой записи
        {
            if (i == n)
            {
                printf("Удаляемая запись:\n");
                printf("%2d | %10s      | %3d    | %2s |%7s     |%9s     |\n[Подтвердите удаление!] <yes>/<no>:\n", n, b[n].Familiya, b[n].vozrost, b[n].pol, b[n].gorod, b[n].diagnoz);
                key = _getche();
                if (key == 'y') i++; else fwrite(&b[i], sizeof(a), 1, f);   //после подтверждения проскакиваем удаляемый элемент, либо отказываемся его удалять и просто продолжаем цикл
            }
            if (i != n) fwrite(&b[i], sizeof(a), 1, f);     //пишем в файл прочитанный список исключая удаляемую запись
        }
        fclose(f);
    }
    
    else if (key == '1')  // добавленіе паціента
    {
        FILE *f;
        if (!(f = fopen("Poliklinika_File.dat", "ab")))
        {
            printf("Ошибкa открытия файла\n");    return;
        }
        for (;;) {
            printf("--------------------------------------------------------------\n<ENTER> - Добавить пациентаммм <ESC> - отмена.\n");
            char h = _getch();                              
            if (h == 27)break;
            int d;
            while ((d = getchar()) != '\n' && d != EOF);
            printf("Введите фамилию пациента:"); fflush(stdin);   gets_s(a.Familiya);
            printf("Возраст:"); scanf("%d", &a.vozrost);
            printf("Пол:"); scanf("%s", &a.pol);
            printf("Город:"); scanf("%s", &a.gorod);
            printf("Диагноз:"); scanf("%s", &a.diagnoz);
            fwrite(&a, sizeof(a), 1, f);                    
        }
        fclose(f);  printf("\nКонец создания записи\n");
    }
    else if (key == '4')return;                             
}
 
 
void File_zadanie()
{
    puts("\n Выберите условие :");
    puts("1 - Вывод  количества иногородних пациентов");
    puts("2 - Сортировка по диагнозу");
    int num; char diag;  int m, l = 0;
    int x; char y;
    char key;
    do
        key = _getche();
 
    while ((key != '1') && (key != '2'));
    if (key == '1')
    {
        File_read();
        int j = 0; int sum = 0; int n = 0; int i = 0;
        FILE *f;
        if (!(f = fopen("Poliklinika_File.dat", "rb"))) // r  –  файл открывается только для чтения ,b – файл открывается в бинарном режиме 
        {
            printf("\nОшибкa открытия файла\n");
            //  return ();
        }
        while (fread(&b[j], sizeof(a), 1, f))
            if (feof(f)) break;
 
        
        for (i = 0; i < j; i++) {
            if (strcmp(a.gorod, "Kiev") != 0) {
                j++;
                
            }
            sum++;
 
        }
        cout << " \n Количество иногородних пациентов = " << sum << endl; // просто стоит левое число тк стркмп работает криво 
 
 
        fclose(f);
        printf("----------------------------------------------------------------\n");
        return;
 
    }
 
    else if (key == '2')  // х -лет y діагноз 
    {
        
    }
 
 
}
 
 
 
void main()
{
    setlocale(LC_CTYPE, "Russian");
    while (true)
    {
        system("cls");
        fflush(stdin);
        puts("Главное меню программы:");
        puts("1 - Создание нового файла");
        puts("2 - Просмотр файла");
        puts("3 - Корректировка записей файла(добавление/удаление/редактирование)");
        puts("4 - Cортировка по возрасту и диагнозу");
        puts("5 - Выход");
        char key = _getche();
        switch (key)
        {
        case '1': File_write(); break;
        case '2': File_read(); break;
        case '3': File_redactor(); break;
        case '4': File_zadanie(); break;
        case '5': printf("  [Выход] \n"); exit(0);
        }
        _getch();
    }
}
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
10.12.2017, 20:28 4
Код
$ i686-w64-mingw32-g++ main.cpp
main.cpp:7:21: fatal error: Windows.h: Нет такого файла или каталога
 #include <Windows.h>
Похоже, просто ошибка регистра. Названия заголовочных файлов обычно с маленькой буквы
Код
$ i686-w64-mingw32-g++ main.cpp
main.cpp: In function ‘void File_write()’:
main.cpp:38:83: error: too few arguments to function ‘char* gets_s(char*, rsize_t)’
         puts("Введите фамилию пациента:"); gets_s(a.Familiya);
Если уж отказались от использования микрософтовских извращений (#define _CRT_SECURE_NO_WARNINGS), зачем их используете. Причем, похоже, неправильно.
Кликните здесь для просмотра всего текста
Код
$ i686-w64-mingw32-g++ main.cpp -Wall
main.cpp: In function ‘void File_write()’:
main.cpp:40:44: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
         puts("Пол:"); scanf("%s", &a.pol);
                                            ^
main.cpp:41:50: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
         puts("Город:"); scanf("%s", &a.gorod);
                                                  ^
main.cpp:42:56: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
         puts("Диагноз:"); scanf("%s", &a.diagnoz);
                                                        ^
main.cpp: In function ‘void File_redactor()’:
main.cpp:108:58: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
                 printf("Пол: "); scanf("%s", &c[n].pol);
                                                          ^
main.cpp:109:63: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
                 printf("Город:"); scanf("%s", &c[n].gorod);
                                                               ^
main.cpp:110:69: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
                 printf("Диагноз:"); scanf("%s", &c[n].diagnoz);
                                                                     ^
main.cpp:159:50: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
             printf("Пол:"); scanf("%s", &a.pol);
                                                  ^
main.cpp:160:56: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
             printf("Город:"); scanf("%s", &a.gorod);
                                                        ^
main.cpp:161:62: warning: format ‘%s’ expects argument of type ‘char*’, but argument 2 has type ‘char (*)[300]’ [-Wformat=]
             printf("Диагноз:"); scanf("%s", &a.diagnoz);
                                                              ^
main.cpp: In function ‘void File_zadanie()’:
main.cpp:185:37: warning: unused variable ‘n’ [-Wunused-variable]
         int j = 0; int sum = 0; int n = 0; int i = 0;
                                     ^
main.cpp:175:9: warning: unused variable ‘num’ [-Wunused-variable]
     int num; char diag;  int m, l = 0;
         ^~~
main.cpp:175:19: warning: unused variable ‘diag’ [-Wunused-variable]
     int num; char diag;  int m, l = 0;
                   ^~~~
main.cpp:175:30: warning: unused variable ‘m’ [-Wunused-variable]
     int num; char diag;  int m, l = 0;
                              ^
main.cpp:175:33: warning: unused variable ‘l’ [-Wunused-variable]
     int num; char diag;  int m, l = 0;
                                 ^
main.cpp:176:9: warning: unused variable ‘x’ [-Wunused-variable]
     int x; char y;
         ^
main.cpp:176:17: warning: unused variable ‘y’ [-Wunused-variable]
     int x; char y;
                 ^

Первые ошибки это необходимость передачи в scanf() не указателя на строку а ее саму.
Когда все исправил, выяснилось что русская локаль не включается. Что, кстати, странно.
0
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
10.12.2017, 20:46  [ТС] 5
что самое странное показывала код преподавателю , его всё устроило
просто сказал реализовать ещё 2 условия ..можете помочь с реализацией задачи поставленной ?или нужно всё с начала пересматривать ?
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
10.12.2017, 20:49 6
Ужасно. Оно вообще не работает. Даже _getch() по нажатии ESC выдает -1.
Скажите, обязательно было писать в таком неудобном стиле?

Добавлено через 1 минуту
Единственный способ помочь вам, который я вижу - переписать по-нормальному. Но код довольно большой, мне этим заниматься неохота. А вносить точечные правки не выйдет, поскольку нет возможности проверить
0
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
10.12.2017, 21:06  [ТС] 7
а почему стиль неудобный ?укажите пожалуйста что не так . как видите преподу вообще всё равно ...

а помочь функцию написать можете ? а там уже буду сама пытаться

Добавлено через 8 минут
и может можете помочь со вторым условием ? "вывести на печать список пациентов ( фамилий ) старше Х лет с диагнозом Y (Х и Y с клавиатуры ) " , заранее спасибо
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
10.12.2017, 21:48 8
Цитата Сообщение от ALEXANDRA1995 Посмотреть сообщение
а почему стиль неудобный ?укажите пожалуйста что не так . как видите преподу вообще всё равно ...
Использование gets_s(), _getch() и прочих непереносимых вещей. Ничего виндоспецифичного у вас не используется, так зачем привязываться по таким мелочам. Скомпилировать это можно разве что кросскомпилятором, а там свои особенности. Причем если бы использовали только стандартные функции, программа была бы куда более предсказуемой и тестируемой.
Цитата Сообщение от ALEXANDRA1995 Посмотреть сообщение
а помочь функцию написать можете ? а там уже буду сама пытаться
Что за функция?
Вот простой код, который работает
C
1
2
3
4
5
6
7
#include <stdio.h>
#include <string.h>
int main(){
  char str[300];
  scanf("%s", str);
  if(strcmp(str, "Город")==0)printf("равны\n"); else printf("не равны\n");
}
Цитата Сообщение от ALEXANDRA1995 Посмотреть сообщение
и может можете помочь со вторым условием ? "вывести на печать список пациентов ( фамилий ) старше Х лет с диагнозом Y (Х и Y с клавиатуры ) " , заранее спасибо
Помочь могу, если скажете как. Учитывая что ваш код работает непредсказуемо.
0
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
10.12.2017, 22:00  [ТС] 9
Цитата Сообщение от ALEXANDRA1995 Посмотреть сообщение
и может можете помочь со вторым условием ? "вывести на печать список пациентов ( фамилий ) старше Х лет с диагнозом Y (Х и Y с клавиатуры ) " , заранее спасибо
Как данное условие реализовать ..
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
10.12.2017, 22:22 10
C
1
2
3
4
5
6
7
8
9
int X;
char Y[300];
scanf("%i", &X);
fgets(Y, 299, stdin);
for(i=0; i<n; i++){
  if( (patient[i].age > X) && (strcmp(patient[i].diagnosis, Y) == 0) ){
    output( patient[i] );
  }
}
0
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
10.12.2017, 22:28  [ТС] 11
можете ещё подсказать как перед выводом фамилий отсортировать их по алфавиту ?

Добавлено через 13 секунд
спасибо за ответ !
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
10.12.2017, 22:46 12
А в базе они не по алфавиту хранятся? Может проще сначала отсортировать а уже потом по условиям выбрать только нужные?
Этот-то код к себе встроили?
0
0 / 6 / 0
Регистрация: 16.11.2017
Сообщений: 36
11.12.2017, 22:44  [ТС] 13
работаю над этим )
проще конечно но условие требует перед выводом отсортировать и вывести на печать ..

Добавлено через 23 часа 6 минут
Большое спасибо за помощь , разобралась , оба условия реализовать удалось
0
11.12.2017, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.12.2017, 22:44
Помогаю со студенческими работами здесь

Работа с функцией

Работа с функцией
Задание : Отсортировать массив по возрастанию #include &quot;stdafx.h&quot; #include &lt;iostream&gt;...

Работа с функцией
Всем привет! Столкнулся с одной проблемой. По моему заданию функция должна возвращать новый размер...

Работа с функцией
Описать функцию smooth(A,n), заменяющую каждый элемент вещественного массива A размера n на его...


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

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