Выполнить попарное суммирование элементов массива заданным образом - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д