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