Записать в третий файл строки из первых двух файлов, чтобы они тоже располагались по алфавиту - 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 для определения того, какие элементы следует поместить в отсортированный массив. Код работает следующим образом:

  1. Пользователь вводит количество элементов в первом массиве.
  2. Код создает первый массив и запрашивает у пользователя ввод всех его элементов.
  3. Пользователь вводит количество элементов во втором массиве.
  4. Код создает второй массив и запрашивает у пользователя ввод всех его элементов.
  5. Код создает третий массив, который будет содержать отсортированные элементы.
  6. Код проходит по всем элементам первого и второго массивов и помещает их в третий массив в алфавитном порядке.
  7. Код выводит отсортированный массив.
  8. Код освобождает память, выделенную под массивы.

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


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

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

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