Ввод, вывод массива структур, поиск по заданному пользователем полю - C (СИ)
Формулировка задачи:
Здравствуйте. Необходимо написать 3 функции. Ввод, вывод массива структур, поиск по заданному пользователем полю. Проблемма с 3-й функцией. Не могу добиться, что бы поиск работал правильно. Всегда находит совпадение в первом элементе с введённым значением, а когда ищем в полях с символами, то даже вывод работает неправильно. Помогите исправиль ошибку.
#include <stdlib.h> #include <stdio.h> #include <string.h> int f=0; struct koshki { char klichka[20]; char poroda[20]; int vozrast; float ves; float dlina; }; void Input(struct koshki*, int); void Output(struct koshki*, int); int Find(struct koshki*, int); int main() { int kol = 0, n, i, n1; struct koshki A[200]; clrscr(); printf("enter amount elements: "); scanf("%d", &n); for (i = 0; i < n; i++) { printf("enter %d element massiva struktur\n", i + 1); Input(A, kol); kol++; } printf("vivod massiva struktur:\n"); Output(A, n); n1=Find(A, n); if(f==1) { printf("-----------------------------------------------------------\n"); printf("| number | klichka | poroda | vozrast | ves | dlina |\n"); printf("-----------------------------------------------------------\n"); printf("|%7d |%10s |%9s |%8d |%6.1f |%6.1f |\n", n1+1, A[n1].klichka, A[n1].poroda, A[n1].vozrast, A[n1].ves, A[n1].dlina); printf("-----------------------------------------------------------\n"); } system("pause"); return 0; } void Input(struct koshki* array, int number) { int i; struct koshki b; printf("klichka_koshki: "); scanf("%s", &b.klichka); printf("poroda_koshki: "); scanf("%s", &b.poroda); printf("vozrast: "); scanf("%d", &b.vozrast); printf("ves_v_kg: "); scanf("%f", &b.ves); printf("dlina_v_sm: "); scanf("%f", &b.dlina); array[number] = b; } void Output(struct koshki* array, int size) { int i; printf("-----------------------------------------------------------\n"); printf("| number | klichka | poroda | vozrast | ves | dlina |\n"); for (i = 0; i < size; i++) { printf("-----------------------------------------------------------\n"); printf("|%7d |%10s |%9s |%8d |%6.1f |%6.1f |\n", i + 1, array[i].klichka, array[i].poroda, array[i].vozrast, array[i].ves, array[i].dlina); } printf("-----------------------------------------------------------\n"); } int Find(struct koshki* array, int size) { int i, p, k1; float k2; char *str; printf("vvedite nomer polya dlya poiska:\n" " 1 - klichka\n" " 2 - poroda\n" " 3 - vozrast\n" " 4 - ves\n" " 5 - dlina\n"); scanf("%d", &p); printf("vvedite iskomiy element: "); switch(p) { case 1: { scanf("%s",&str); for(i=0;i<size;i++) { if(strcmp(array[i].klichka, str)==0); { printf("sovpadenie naydeno:\n"); f=1; return i; } } break; } case 2: { scanf("%s",&str); for(i=0;i<size;i++) { if(strcmp(array[i].poroda, str)==0); { printf("sovpadenie naydeno:\n"); f=1; return i; } } break; } case 3: { scanf("%d",&k1); for(i=0;i<size;i++) { if(k1==array[i].vozrast); { printf("sovpadenie naydeno:\n"); f=1; return i; } } break; } case 4: { scanf("%f",&k2); for(i=0;i<size;i++) { if(k2==array[i].ves); { printf("sovpadenie naydeno:\n"); f=1; return i; } } break; } case 5: { scanf("%f",&k2); for(i=0;i<size;i++) { if(k2==array[i].dlina); { printf("sovpadenie naydeno:\n"); f=1; return i; } } break; } default: printf("error! vvedite pravilniy nomer polya\n"); } printf("sovpadeniy ne naydeno\n"); return 0; }
Решение задачи: «Ввод, вывод массива структур, поиск по заданному пользователем полю»
textual
Листинг программы
#include <stdlib.h> #include <stdio.h> #include <string.h> struct koshki { char klichka[20]; char poroda[20]; int vozrast; float ves; float dlina; }; void Input(struct koshki*, int); void Output(struct koshki*, int); int Find(struct koshki*, int); int main() { int kol = 0, n, i, n1; struct koshki A[200]; printf("enter amount elements: "); scanf("%d", &n); for (i = 0; i < n; i++) { printf("enter %d element massiva struktur\n", i + 1); Input(A, kol); kol++; } printf("vivod massiva struktur:\n"); Output(A, n); n1 = Find(A, n); if (n1 > -1) { printf("sovpadenie naydeno:\n"); printf("-----------------------------------------------------------\n"); printf("| number | klichka | poroda | vozrast | ves | dlina |\n"); printf("-----------------------------------------------------------\n"); printf("|%7d |%10s |%9s |%8d |%6.1f |%6.1f |\n", n1 + 1, A[n1].klichka, A[n1].poroda, A[n1].vozrast, A[n1].ves, A[n1].dlina); printf("-----------------------------------------------------------\n"); } else { printf("sovpadeniy ne naydeno\n"); } system("pause"); return 0; } void Input(struct koshki* array, int number) { struct koshki b; printf("klichka_koshki: "); scanf("%s", b.klichka); printf("poroda_koshki: "); scanf("%s", b.poroda); printf("vozrast: "); scanf("%d", &b.vozrast); printf("ves_v_kg: "); scanf("%f", &b.ves); printf("dlina_v_sm: "); scanf("%f", &b.dlina); array[number] = b; } void Output(struct koshki* array, int size) { int i; printf("-----------------------------------------------------------\n"); printf("| number | klichka | poroda | vozrast | ves | dlina |\n"); for (i = 0; i < size; i++) { printf("-----------------------------------------------------------\n"); printf("|%7d |%10s |%9s |%8d |%6.1f |%6.1f |\n", i + 1, array[i].klichka, array[i].poroda, array[i].vozrast, array[i].ves, array[i].dlina); } printf("-----------------------------------------------------------\n"); } int Find(struct koshki* array, int size) { int i, p, k1; float k2; char str[256]; printf("vvedite nomer polya dlya poiska:\n" " 1 - klichka\n" " 2 - poroda\n" " 3 - vozrast\n" " 4 - ves\n" " 5 - dlina\n"); scanf("%d", &p); printf("vvedite iskomiy element: "); switch (p) { case 1: scanf("%s", str); for (i = 0; i < size; i++) { if (strcmp(array[i].klichka, str) == 0) { return i; } } break; case 2: scanf("%s", str); for (i = 0; i < size; i++) { if (strcmp(array[i].poroda, str) == 0) { return i; } } break; case 3: scanf("%d", &k1); for (i = 0; i < size; i++) { if (k1 == array[i].vozrast) { return i; } } break; case 4: scanf("%f", &k2); for (i = 0; i < size; i++) { if (k2 == array[i].ves) { return i; } } break; case 5: scanf("%f", &k2); for (i = 0; i < size; i++) { if (k2 == array[i].dlina) { return i; } } break; default: printf("error! vvedite pravilniy nomer polya\n"); } return -1; }
Объяснение кода листинга программы
- Ввод, вывод массива структур и поиск по заданному пользователем полю.
- Структура koshki содержит поля: klichka (строка, 20 символов), poroda (строка, 20 символов), vozrast (целое число), ves (вес, тип float), dlina (длина, тип float).
- Функция Input заполняет поля структуры koshki, используя ввод пользователя.
- Функция Output выводит на экран поля структуры koshki.
- Функция Find осуществляет поиск в массиве структур по заданному полю.
- В начале программы пользователю предлагается ввести количество элементов массива (kol).
- Затем пользователю предлагается ввести элемент массива (n).
- Далее происходит заполнение массива структур (A) с помощью функции Input.
- Выводится на экран весь массив структур с помощью функции Output.
- Пользователю предлагается ввести номер поля для поиска (p).
- В зависимости от выбранного поля (1-5) происходит поиск в массиве структур с помощью функции Find.
- Если элемент найден, его номер выводится на экран, иначе выводится сообщение об ошибке.
- Для поиска используется операция сравнения строк (strcmp).
- Если количество элементов массива (n) равно 0, выводится сообщение об ошибке.
- В конце программы пользователю предлагается нажать любую клавишу для выхода из программы (system(
pause
)). - Значения переменных (kol, n, i, n1, k1, k2, p) сохраняются в пределах функции main и не сохраняются после ее завершения.
- Значения переменных (kol, n, i, n1, k1, k2, p) изменяются в пределах функций Input, Output, Find и не изменяются после их завершения.
- Для ввода и вывода данных используются функции scanf и printf соответственно.
- Для поиска используется цикл for.
- Вложенные массивы структур (в структуре koshki) не используются.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д