Выполнить попарное суммирование элементов массива заданным образом - C (СИ)
Формулировка задачи:
Ввести одномерный целочисленный массив размерностью N в память ПЭВМ. Память под массив выделить динамически, сначала под один элемент, затем под остальные. Вывести массив на экран по пять элементов в строке. Записать массив в файл.
После записи элементов массива в файл информация должна быть сохранена, и при последующем выходе из программы и новой её загрузке должно произойти корректное считывание информации из файла и дальнейшее её использование.
Вывести массив из файла на экран по пять элементов в строке. Выполнить попарное суммирование элементов массива следующим образом: на первом этапе суммировать попарно рядом стоящие элементы, на втором - результаты первого этапа аналогичным образом, и т.д., пока не останется один элемент.
Результат вывести на экран. Работу программы построить в виде меню.
Решение задачи: «Выполнить попарное суммирование элементов массива заданным образом»
textual
Листинг программы
#include <windows.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <errno.h>
#define SIZE 81
#define HALT ""
char* Rus(const char* text);
void main(void);
int input_text(void);
int read_file_text(int base);
int read_file_text_add(int base);
int write_file_text(int base, unsigned int pos, char* rea);
unsigned int get_rec_count(int base);
char **ptstr; /*указатель на массив указателей, которые содержат адреса строк*/
char **ptwords; /*указатель на массив указателей, которые содержат адреса слов в строке*/
int ct=0; /* счетчик вводимых строк */
int ct_words=0; /* счетчик слов в строке */
int ct_dob_nach=0; /* счетчик введенных строк для добавления в начало файла*/
int ct_dob_konec=0; /* счетчик введенных строк для добавления в конец файла*/
int* inp_1;
int* inp_zap;
int count_massiv;
void main(void)
{
int count;
int var;
int var_ch=-1;
int read_c;
int base;
int i=0;
int priz_vvod;
int rea;
int priz_otr=0;
int priz_pol=0;
int priz_work;
static char buffer_read[1];
base=open("base.dat",O_RDONLY);
if(base==-1)
{
base=open("base.dat",O_CREAT|O_BINARY,S_IREAD|S_IWRITE);
close(base);
base=open("base.dat",O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
system("cls");
printf(Rus("Файл для записи массива создан.Данных в нём нет.\n"));
printf(Rus("Для продолжения-ENTER.\n"));
getch();
}
else
{
read_c=read(base,buffer_read,1);
if(read_c)
{
system("cls");
printf(Rus("Файл данных уже существует.В нём имеются данные.\n"));
close(base);
base=open("base.dat",O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
printf(Rus("Для продолжения-ENTER.\n"));
getch();
}
else
{
system("cls");
printf(Rus("Файл данных уже существует.Данных в нём нет.\n"));
close(base);
base=open("base.dat",O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
printf(Rus("Для продолжения-ENTER.\n"));
getch();
}
}
do
{
system("cls");
printf(Rus("Выберите пункт меню работы программы:\n"));
printf(Rus("\n1) Ввод текста в оперативную память."));
printf(Rus("\n2) Просмотр содержимого текста в оперативной памяти."));
printf(Rus("\n3) Запись текста из оперативной памяти в файл."));
printf(Rus("\n4) Считывание текста из файла в оперативную память."));
printf(Rus("\n5) Корректировка содержимого текста в файле."));
printf(Rus("\n6) Обработка текста согласно условию."));
printf(Rus("\n7) Завершение работы.\n"));
scanf("%d",&var);
switch (var)
{
case 1: //ввод текста в оперативную память
{
getchar();
system("cls");
priz_work=0;
ct=0;
priz_work=input_text();
if(!priz_work)
printf(Rus("\nТекст введен в память успешно.\n"));
else
printf(Rus("\nПроблемы с выделением памяти при вводе текста и записи в файл.\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 2: //Просмотр содержимого текста из оперативной памяти
{
system("cls");
if(ptstr)
{
puts(Rus("\nТекст, находящийся в данный момент в оперативной памяти:\n"));
if(ct_dob_nach)
for(i=0;i<ct_dob_nach;i++)
printf("%s\n",ptstr[i]);
else
for(i=0;i<ct;i++)
printf("%s\n",ptstr[i]);
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
else
{
printf(Rus("Текст не введен в оперативную память.\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
}
break;
case 3: //Запись текста из оперативной памяти в файл.
{
getchar();
system("cls");
if(ptstr)
{
priz_work=0;
if(base)
close(base);
base=open("base.dat",O_RDWR|O_BINARY|O_TRUNC,S_IREAD|S_IWRITE);
for(i=0;i<ct;i++)
{
priz_work=write_file_text(base,strlen(ptstr[i]),ptstr[i]);
if(priz_work)
break;
}
printf(Rus("Текст записан в файл успешно.\n"));
}
else
printf(Rus("Текст не введен в оперативную память. Записывать в файл нечего\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 4: //Считывание текста из файла и вывод на экран
{
ct=0;
getchar();
system("cls");
priz_work=0;
ct_dob_nach=0;
lseek(base,0,SEEK_SET);
read_c=read(base,buffer_read,1);
if(read_c)
{
priz_work=read_file_text(base);
if(!priz_work)
puts(Rus("\nСчитывание текста из файла в оперативную память прошло успешно:\n"));
else
printf(Rus("\nПроблемы с выделением памяти при считывании текста в оперативную память из файла.\n"));
}
else
printf(Rus("Текст в файле отсутствует\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 5: //корректировка содержимого файла
{
do
{
printf(Rus("Выберите требуемый вариант пункта подменю:\n"));
printf(Rus("\n1) Добавление информации из оперативной памяти в начало файла"));
printf(Rus("\n2) Добавление информации из оперативной памяти в конец файла"));
printf(Rus("\n3) Удаление информации из файла"));
printf(Rus("\n4) Возврат в предыдущее меню\n"));
scanf("%d",&var_ch);
switch(var_ch)
{
case 1:
{
getchar();
system("cls");
priz_work=0;
if(ptstr)
{
lseek(base,0,SEEK_SET);
read_c=read(base,buffer_read,1);
if(read_c)
{
ct_dob_nach=ct;
priz_work=read_file_text_add(base);
if(!priz_work)
{
if(base)
close(base);
base=open("base.dat",O_RDWR|O_BINARY|O_TRUNC,S_IREAD|S_IWRITE);
for(i=0;i<ct;i++)
{
priz_work=write_file_text(base,strlen(ptstr[i]),ptstr[i]);
if(priz_work)
break;
}
if(!priz_work)
{
printf(Rus("\nДобавление содержимого оперативной памяти в начало файла прошло успешно:\n"));
if(ptstr)
{
for(i=ct_dob_nach;i<ct;i++)
if(ptstr[i])
free(ptstr[i]);
}
}
else
printf(Rus("\nПроблемы с добавлением текста в начало файла.\n"));
}
else
printf(Rus("\nПроблемы с добавлением текста в начало файла.\n"));
}
else
printf(Rus("Текст в файле отсутствует\n"));
}
else
printf(Rus("Текст в оперативной памяти отсутствует\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 2:
{
getchar();
system("cls");
if(ptstr)
{
priz_work=0;
if(base)
close(base);
base=open("base.dat",O_RDWR|O_BINARY|O_TRUNC,S_IREAD|S_IWRITE);
for(i=0;i<ct;i++)
{
priz_work=write_file_text(base,strlen(ptstr[i]),ptstr[i]);
if(priz_work)
break;
}
printf(Rus("Текст записан в файл успешно.\n"));
}
else
printf(Rus("Текст не введен в оперативную память. Записывать в файл нечего\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 3:
{
if(base)
close(base);
base=open("base.dat",O_RDWR|O_BINARY|O_TRUNC,S_IREAD|S_IWRITE);
printf(Rus("Информация из файла удалена.\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 4:
break;
default:
printf(Rus("Ошибка: некорректный ввод варианта работы"));
}
}
while (var_ch!=4);
var_ch=-1;
}
break;
case 6: //обработка информации
{
if(inp_1)
{
for(i=0;i<count_massiv;i++)
{
if(*(inp_1+i)<0)
{
printf(Rus("Первый отрицательный элемент стоит на %d месте и равен %d\n"),i+1,*(inp_1+i));
priz_otr++;
break;
}
}
for(i=count_massiv-1;i>0;i--)
{
if(*(inp_1+i)>0)
{
printf(Rus("Последний положительный элемент стоит на %d месте и равен %d\n"),i+1,*(inp_1+i));
priz_pol++;
break;
}
}
if(!priz_otr)
printf(Rus("Отрицательные элементы в исходном массиве отсутствуют\n"));
if(!priz_pol)
printf(Rus("Положительные элементы в исходном массиве отсутствуют\n"));
}
else
printf(Rus("Данные в исходном массиве отсутствуют\n"));
printf(Rus("\nДля продолжения-<ENTER>:\n"));
getch();
}
break;
case 7:
break;
default:
printf(Rus("Ошибка: некорректный ввод варианта работы"));
}
}
while(var!=7);
close(base);
}
int input_text(void)
{
int i;
int priz_work=0;
if(ptstr)
{
for(i=0;i<ct;i++)
if(ptstr[i])
free(ptstr[i]);
free(ptstr);
}
ct=0;
ptstr=(char **)calloc(1,sizeof(char *));
if(ptstr)
{
ptstr[ct]=(char *)malloc(81*sizeof(char));
if(ptstr[ct])
{
printf(Rus("Введите строки и они будут обработаны.\n"));
printf(Rus("Для прекращения ввода-<Enter> в начале строки.\n"));
while(gets_s(ptstr[ct],80)!=NULL && strcmp(ptstr[ct],HALT)!=0 && priz_work==0)
{
ct++;
ptstr=(char **)realloc(ptstr,(ct+1)*sizeof(char *));
if(!ptstr)
{
printf(Rus("Нет возможности перевыделить память под указатель на массив указателей, которые содержат адреса строк\n"));
priz_work++;
}
else
{
ptstr[ct]=(char*)malloc(81*sizeof(char));
if(!(ptstr[ct]))
{
printf(Rus("Нет возможности выделить память под %d строку текста\n"),ct);
priz_work++;
}
}
}
}
else
printf(Rus("Нет возможности выделить память под первую строку текста\n"));
}
else
printf(Rus("Нет возможности выделить память под указатель на массив указателей, которые содержат адреса строк\n"));
return priz_work;
}
int read_file_text(int base)
{
int i;
int read_c;
static char buffer_read[2];
int priz_work=0;
lseek(base,0,SEEK_SET);
if(ptstr)
{
for(i=0;i<ct;i++)
if(ptstr[i])
free(ptstr[i]);
free(ptstr);
}
ct=0;
ptstr=(char **)calloc(1,sizeof(char *));
if(ptstr)
{
ptstr[ct]=(char *)calloc(81,sizeof(char));
if(ptstr[ct])
{
while(!eof(base))
{
read_c=read(base,buffer_read,1);
if(read_c!=-1)
if(*buffer_read!='\n')
strcat(ptstr[ct],buffer_read);
else
{
strcat(ptstr[ct],"\0");
ct++;
ptstr=(char **)realloc(ptstr,(ct+1)*sizeof(char *));
if(!ptstr)
{
printf(Rus("Нет возможности перевыделить память под указатель на массив указателей, которые содержат адреса строк\n"));
priz_work++;
}
else
{
ptstr[ct]=(char*)calloc(81,sizeof(char));
if(!(ptstr[ct]))
{
printf(Rus("Нет возможности выделить память под %d строку текста\n"),ct);
priz_work++;
}
}
}
else
printf(Rus("Ошибка при считывании текста из файла"));
}
}
else
printf(Rus("Нет возможности выделить память под первую строку текста\n"));
}
else
printf(Rus("Нет возможности выделить память под указатель на массив указателей, которые содержат адреса строк\n"));
return priz_work;
}
int read_file_text_add(int base)
{
int i;
int read_c;
static char buffer_read[2];
int priz_work=0;
lseek(base,0,SEEK_SET);
if(ptstr)
{
ptstr=(char **)realloc(ptstr,(ct+1)*sizeof(char *));
if(ptstr)
{
ptstr[ct]=(char *)calloc(81,sizeof(char));
if(ptstr[ct])
{
while(!eof(base))
{
read_c=read(base,buffer_read,1);
if(read_c!=-1)
if(*buffer_read!='\n')
strcat(ptstr[ct],buffer_read);
else
{
strcat(ptstr[ct],"\0");
ct++;
ptstr=(char **)realloc(ptstr,(ct+1)*sizeof(char *));
if(!ptstr)
{
printf(Rus("Нет возможности перевыделить память под указатель на массив указателей, которые содержат адреса строк\n"));
priz_work++;
}
else
{
ptstr[ct]=(char*)calloc(81,sizeof(char));
if(!(ptstr[ct]))
{
printf(Rus("Нет возможности выделить память под %d строку текста\n"),ct);
priz_work++;
}
}
}
else
{
printf(Rus("Ошибка при считывании текста из файла"));
priz_work++;
}
}
}
else
{
printf(Rus("Нет возможности выделить память под первую строку текста\n"));
priz_work++;
}
}
else
{
printf(Rus("Нет возможности выделить память под указатель на массив указателей, которые содержат адреса строк\n"));
priz_work++;
}
}
else
{
printf(Rus("В оперативной памяти нет текста, который нужно добавить в начало файла.\n"));
priz_work++;
}
return priz_work;
}
int write_file_text(int base, unsigned int pos, char* rea)
{
int write_c=0;
int priz_zap=0;
lseek(base,0,SEEK_END);
write_c=write(base,rea,sizeof(char)*pos);
if(write_c == -1)
{
priz_zap=1;
printf(Rus("\nПроблемы с записью в файл непосредственно текста.\n"));
}
write_c=write(base,"\n",1);
if(write_c == -1)
{
priz_zap=2;
printf(Rus("\nПроблемы с записью в файл признака конца строки.\n"));
}
return priz_zap;
}
unsigned int get_rec_count(int base)
{
long cur_pos=tell(base);
lseek(base,0,SEEK_END);
long count_r = tell(base) / sizeof(int);
lseek(base, cur_pos, SEEK_SET);
return(count_r);
}
char bufRus[256];
char* Rus(const char* text)
{
CharToOemA(text, bufRus);
return bufRus;
}