Ввод, вывод массива структур, поиск по заданному пользователем полю - 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) не используются.