Выполнить попарное суммирование элементов массива заданным образом - 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;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.667 из 5
Похожие ответы