Записать в третий файл строки из первых двух файлов, чтобы они тоже располагались по алфавиту - C (СИ)
Формулировка задачи:
Задача: даны два файла, строки в которых расположены по алфавиту,записать в третий файл строки из первых двух файлов, чтобы они тоже располагались по алфавиту.
вот программа, она составляет списки из строк файла, далее записывает строки по алфавиту из того файла, в котором они идут первые по алфавиту, потом переходит во второй файл, но печатает только первый символ из него, не могу понять почему дальше не работает, если у кого есть решение пооптимальнее с удовольствием разберу, только сдавать надо уже 5-ого
# include <stdio.h> # include <stdlib.h> # include <unistd.h> # include <sys/types.h> # include <fcntl.h> struct CharItem{ char val; struct CharItem *next; }; struct CharItem * addChar(struct CharItem *list, char ch){ list->next=(struct CharItem *)malloc(sizeof(struct CharItem)); list=list->next; list->val=ch; list->next=NULL; return list; } int main(){ int fd1,fd2,fd3,n,p; char buf1[1],buf2[1]; struct CharItem *first1=NULL,*last1,*first2=NULL,*last2,*q; fd1=open("cat.txt",O_RDONLY); fd3=open("file2.txt",O_RDWR); while((n=read(fd1,buf1,1))>0){ if(first1==NULL){ first1=last1=(struct CharItem *)malloc(sizeof(struct CharItem)); last1->val=buf1[0]; last1->next=NULL; }else if(first1!=NULL){ last1=addChar(last1,buf1[0]); } } fd2=open("file.txt",O_RDONLY); while((p=read(fd2,buf2,1))>0){ if(first2==NULL){ first2=last2=(struct CharItem *)malloc(sizeof(struct CharItem)); last2->val=buf2[0]; last2->next=NULL; }else if(first2!=NULL){ last2=addChar(last2,buf2[0]); } } last1=first1; last2=first2; while(last1!=NULL){ printf("%c",last1->val); last1=last1->next; }last1=first1; while((first1!=NULL)&&(first2!=NULL)){ if((last1->val)<(last2->val)){ while(first1->val!='\n'){ buf1[0]=first1->val; write(fd3,buf1,1); first1=first1->next; free(q); } buf1[0]=first1->val; write(fd3,buf1,1); q=first1; first1=first1->next; free(q); last1=first1; }else if((last2->val)<(last1->val)){ while(first2->val!='\n'){ buf2[0]=first2->val; write(fd3,buf2,1); q=first2; first2=first2->next; free(q); } buf2[0]=first2->val; write(fd3,buf2,1); q=first2; first2=first2->next; free(q); last2=first2; }else { while((last2->val)==(last1->val)) { last1=last1->next; last2=last2->next; } if ((last1->val)<(last2->val)){ while(first1->val!='\n'){ buf1[0]=first1->val; write(fd3,buf1,1); q=first1; first1=first1->next; free(q); } buf1[0]=first1->val; write(fd3,buf1,1); q=first1; first1=first1->next; free(q); last1=first1; last2=first2; }else if((last2->val)<(last1->val)){ while(first2->val!='\n'){ buf2[0]=first2->val; write(fd3,buf2,1); q=first2; first2=first2->next; free(q); } buf2[0]=first2->val; write(fd3,buf2,1); q=first2; first2=first2->next; free(q); last2=first2; last1=first1; } }last1=first1; last2=first2; } if (first1==NULL){ while(first2!=NULL){ buf2[0]=first2->val; write(fd3,buf2,1); q=first2; first2=first2->next; free(q); } }else if(first2==NULL){ while(first1!=NULL){ buf1[0]=first1->val; write(fd3,buf1,1); q=first1; first1=first1->next; free(q); } } return 0; }
все разобралась со своим кодом, может кто-нибудь покороче код предложить, а то вижу что можно короче а как не соображу
Решение задачи: «Записать в третий файл строки из первых двух файлов, чтобы они тоже располагались по алфавиту»
textual
Листинг программы
#include <iostream> using namespace std; int main() { int *arr1; int *arr2; int *arr3; int n1 = 0; int n2 = 0; cout << "Enter quantity of elements in first array: "; cin >> n1; arr1=new int[n1]; for(int i = 0; i < n1; i++) { cout << "Enter [" << i << "] element of array: "; cin >> *arr1++; } arr1-=n1; cout << "Enter quantity of elements in second array: "; cin >> n2; arr2=new int[n2]; for(int i = 0; i < n2; i++) { cout << "Enter [" << i << "] element of array: "; cin >> *arr2++; } arr2-=n2; arr3=new int[n1+n2]; int all=n1+n2; for(int i = 0; i < all; i++) { if(!n1 || !n2) { while(n1) { *arr3++=*arr1++; n1--; } while(n2) { *arr3++=*arr2++; n2--; } break; } if (*arr1 < *arr2) *arr3++=*arr1++,n1--; else *arr3++=*arr2++,n2--; } arr3-=all; cout << "Resulting array: "; for(int i = 0; i < all; i++) { cout << *arr3++<< " "; } delete arr1;delete arr2; delete arr3; system("PAUSE"); return 0; }
Объяснение кода листинга программы
В этом коде пользователь вводит два массива целых чисел, а затем их сортирует. Код выводит отсортированный массив, используя оператор new для выделения памяти под массивы и оператор delete для освобождения этой памяти. Код также использует ввод-вывод для общения с пользователем и использует цикл for для прохода по всем элементам массива. Он также использует условный оператор if для определения того, какие элементы следует поместить в отсортированный массив. Код работает следующим образом:
- Пользователь вводит количество элементов в первом массиве.
- Код создает первый массив и запрашивает у пользователя ввод всех его элементов.
- Пользователь вводит количество элементов во втором массиве.
- Код создает второй массив и запрашивает у пользователя ввод всех его элементов.
- Код создает третий массив, который будет содержать отсортированные элементы.
- Код проходит по всем элементам первого и второго массивов и помещает их в третий массив в алфавитном порядке.
- Код выводит отсортированный массив.
- Код освобождает память, выделенную под массивы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д