Найти наибольшее значение в файле
Задачи состоит в том,что есть файл содержащий базу данных ,которая содержит информацию о вкладчиках:номер счета,ФИО,категория счета(срочный или долгосрочный),сумма вклада и дата операции.Нужно при вводе ФИО выводить наибольшую сумму вклада в категории"срочный"ю.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
struct inf
{
char account_number [7];
char passport_dannye [30];
char deposit_category[20];
int deposit_sum[i];
char date[9];
};
int i;
void sozd_add(char *);
void show(char *);
void search(char *);
main()
{
char file_name[25];
int ans;
setlocale (LC_ALL, "Rus");
puts("\n Vvedi name fila: \n");
gets(file_name);
while (1)
{
system ("cLs");
puts(" \n MENU");
puts(" \n 1.Sozd or Add");
puts(" \n 2.Show is fila");
puts(" \n 3.Search for a Deposit");
puts(" \n 4.Exit");
puts(" \n Vvedite punkt menu ans= \n");
scanf("%d",&ans);
switch (ans)
{
case 1 : sozd_add (file_name);break;
case 2 : show (file_name);break;
case 3: search (file_name);break;
case 4 : system ("cLs");
printf("\n\n rabota programmy end\n\n\n");
system ("pause");
return 0;
default :
{
system ("cLs");
printf("\n\n net takogo punkta v menu\n\n\n");
system ("pause");
return (2);
}
}
}
}
struct inf vklada(void)
{
struct inf st;
printf(" vvedite nomer scheta\n ");
scanf("%30s",st.account_number);
printf("\n vvedite vvedite FIO \n ");
scanf("%10s",st.passport_dannye);
printf("\n vvedite kategoriyu vklada(srochniy or dolgosrochniy) : \n ");
scanf("%10s",st.deposit_category);
printf("\n vvedite summu: \n ");
scanf("%d",&st.deposit_sum);
printf("\n datu: \n ");
scanf("%s", st.date);
return st;
}
void sozd_add (char *file)
{
FILE *f;
inf st;
int i=1,n;
system ("cLs");
if((f=fopen(file,"ab"))==NULL)
{
perror("\n Ошибка открытия файла");
puts("\n Нажмите любую клавишу, чтобы вернуться в меню...\n");
system("pause");
return;
}
printf("\n Vvedite kol-vo \n");
scanf("%d",&n);
for(i;i<=n;i++)
{
st=vklada();
fwrite(&st, sizeof(inf),1,f);
}
printf(" \n Ввод закончен \n\n");
system ("pause");
fclose(f);
}
void out (struct inf st)
{
printf("\n %6s %10s %27s %15d %15s\n", st.account_number,st.passport_dannye,st.deposit_category,st.deposit_sum,st.date);
}
void show(char *file)
{
FILE *f;
inf st;
system ("cLs");
if((f=fopen(file,"rb"))==NULL)
{
perror("\n Ошибка открытия файла");
puts("\n Нажмите любую клавишу, чтобы вернуться в меню...\n");
system("pause");
return;
}
printf(" nomer scheta passportnye dannye categorya vklada summa vklada data \n");
while (fread(&st, sizeof(inf),1,f))
out ( st);
system ("pause");
fclose(f);
}
void search(char * file)
{
FILE *f;
inf st;
char fio[50],v[9]="srochniy" ;
bool f1=true;
system ("cLs");
f=fopen(file, "rb");
puts("\n Vvedite FIO\n");
fflush (stdin);
gets(fio);
while (fread(&st,sizeof(inf),1,f))
if (!strcmp(fio,st.passport_dannye)&&!strcmp(v,st.deposit_category))
{
f1=false;
out (st);
}
if (f1)
{
printf("\n no such depositor\n");
}
system ("pause");
fclose(f);
}
у меня получилось сообразить только как выводить все платежи в категории "срочный",а вот как найти наибольший платеж - ума не приложу.
void search(char * file)
{
FILE *f;
inf st;
char fio[50],v[9]="srochniy" ;
bool f1=true;
system ("cLs");
f=fopen(file, "rb");
puts("\n Vvedite FIO\n");
fflush (stdin);
gets(fio);
while (fread(&st,sizeof(inf),1,f))
if (!strcmp(fio,st.passport_dannye)&&!strcmp(v,st.deposit_category))
{
f1=false;
out (st);
}
if (f1)
{
printf("\n no such depositor\n");
}
system ("pause");
fclose(f);
}
Ответы (1 шт):
Автор решения: DSuhoi
→ Ссылка
Вклады в банке записываются в массив (вместо int deposit_sum[i]; лучше записать int deposit_sum[LEN];, где LEN - константа). С помощью подобной функции можно найти наибольший элемент этого массива:
int maxElem(int *arr, size_t len){
int max = arr[0];
for(size_t i = 0; i < len; i++)
if(max<arr[i]) max = arr[i];
return max;
}