Си.Разделить маленькую программку на две функции
Мне нужно переписать данную программу на две функции, а точнее, разделить, чтобы всё не валялось в мэйне. А вот, собственно , и нужные мне функции:
1.Считывание данных из текстового файла в массив
2.Поиск нужной информации в полученном массиве.
Но только вот, я не знаю, как прописывать ф-ции при работе со структурами.Компилятор выдает кучу ошибок.
(Еще раз повторюсь.Мне бы только переписать программу с использованием этих 2-х функий.Сама программа работает корректно.Остался лишь вопрос оформления. И будьте добры, не кидайтесь тапками, я в этом новичок и буду благодарна за помощь :))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
int j , i;
FILE *f;
char name [25];
printf ("enter the name of the file: ");
scanf ("%s", name);
if((f = fopen(name, "r")) == NULL)
{
printf ("file not found");
system ("PAUSE");
}
typedef struct{
char Name[30];
char Price[30];
char Shelf_life[30];
}stuff;
int n=0,k;
stuff a;
stuff *x=NULL;
while (!feof(f)){
if(fscanf (f,"%s", a.Name)!=1)
break;
fscanf (f,"%s",a.Price);
fscanf (f,"%s",a.Shelf_life);
x=(stuff*)realloc(x,sizeof(stuff)*(n+1));
x[n]=a;
n++;
}
fclose(f);
for (i=0;i<n;i++){
printf("%s %s %s\n", x[i].Name,x[i].Price,x[i].Shelf_life);}
char Name[30];
printf("enter the product name : \n");
scanf (" %s", Name);
int t,s,min=0;
for (i=0;i<n;i++){
if (strcmp(x[i].Name, Name) == 0){
t=i;
break;
}
}
min=t;
//printf("%d \n", t);
for (s=t+1;s<n;s++ ){
if (strcmp(x[s].Name, Name) == 0){
if (strcmp(x[s].Price, x[min].Price) < 0){
min=s;
}
}
}
printf("minimum price : %s \n", x[min].Price);
system("PAUSE");
free(x);
return 0;
}
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Ну наверно как-то так:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char Name[30];
char Price[30];
char Shelf_life[30];
} stuff;
//Принимает открытый файл и указатель на int
//куда будет записан размер структуры
stuff* getData(FILE* f, int* n) {
*n = 0;
stuff a;
stuff* arr = NULL;
while (!feof(f)) {
if (fscanf(f, "%s", a.Name) != 1)
break;
fscanf(f, "%s", a.Price);
fscanf(f, "%s", a.Shelf_life);
arr = (stuff*)realloc(arr, sizeof(stuff) * (*n + 1));
arr[*n] = a;
(*n)++;
}
return arr;
}
//Принимает введенное имя, массив и его размер
//возвращает -1 если имя не найдено, иначе индекс минимальной цены
int getMinByName(char* Name, stuff* x, int n) {
int t = -1;
for (int i = 0; i < n; i++) {
if (strcmp(x[i].Name, Name) == 0) {
t = i;
break;
}
}
if (t == -1) return -1;
int min = t;
for (int s = t + 1; s < n; s++) {
if (strcmp(x[s].Name, Name) == 0) {
if (strcmp(x[s].Price, x[min].Price) < 0) {
min = s;
}
}
}
return min;
}
int main(int argc, char* argv[]) {
//Открываем файл
FILE* f;
char name[25];
printf("enter the name of the file: ");
scanf("%s", name);
if ((f = fopen(name, "r")) == NULL)
{
printf("file not found");
system("PAUSE");
}
//Получаем данные
int n = 0;
stuff* x = getData(f, &n);
//Закрываем файл
fclose(f);
for (i = 0; i < n; i++) {
printf("%s %s %s\n", x[i].Name, x[i].Price, x[i].Shelf_life);
}
char Name[30];
printf("enter the product name : \n");
scanf(" %s", Name);
//Ищем минимальную стоимость продукта
int min = getMinByName(Name, x, n);
if (min < 0) printf("Name is not found!\n");
else printf("minimum price : %s \n", x[min].Price);
system("PAUSE");
free(x);
return 0;
}