• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Задача: Файловый ввод/вывод, Строки, разные методы сортировки строк

  • Автор темы Nstudent
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

Nstudent

помогите найти ошибку
само задание-два массива строк, каждый из них чортируется методом пузырька, а затем оба в один-слиянием.
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef char *pChar;
typedef char **ppChar;

FILE*out1,*out2,*out3;
void main()
{out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
out3=fopen("text3.txt","w");
int i,j,m,n,kolstrA,kolstrB;
char in[80];
char an[80];
char*pa[100];
char*pb[100];
char*pc[100];
char*pk[100];
char a[100][80];
char b[100][80];
char c[200][80];


for (kolstrA=0;kolstrA<100;kolstrA++)
{if(fgets(in,80,out1)==NULL)
{break;};
in[80]='\0';
strncpy(a[kolstrA],in,80);};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{if(fgets(an,80,out2)==NULL)
{break;};
an[80]='\0';
strncpy(b[kolstrB],an,80);};
fclose(out2);

for(i=0;i<=kolstrA;i++)
{pa=a;};
for(j=0;j<=kolstrB;j++)
{pb[j]=b[j];};
for(m=0;m<=(kolstrA+kolstrB);m++)
{pc[m]=c[m];};
i=0;
j=0;
m=0;
for(i=0;i<=kolstrA-2;i++)
for(j=i+1;j<=kolstrA-1;j++)
{if(strcmp(pa,pa[j])<0)
{strcpy(pk,pa);
strcpy(pa,pa[j]);
strcpy(pa[j],pk);};};
for(i=0;i<=kolstrB-2;i++)
for(j=i+1;j<=kolstrB-1;j++)
{if(strcmp(pb,pb[j])<0)
{strcpy(pk,pb);
strcpy(pb,pb[j]);
strcpy(pb[j],pk);};};
do
{if(strcmp(pa,pb[j])<0)
{pc[m]=pa;
i=i+1;
m=m+1;}
else
{pc[m]=pb[j];
j=j+1;
m=m+1;};}
while(i<kolstrA||j<kolstrB);
while(j<=kolstrB)
{pc[m]=pb[j];
j=j+1;
m=m+1;};
while(i<=kolstrA)
{pc[m]=pa;
i=i+1;
m=m+1;};
cout<<"rezultat"<<"\n";
for(m=0;m<(kolstrA+kolstrB);m++)
{printf("%s\n",pc[m]);};
return;
}
выводит:
error C2664: strcpy: невозможно преобразовать параметр 2 из 'char *[100]' в 'const char *'
Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
 
D

DarkKnight

typedef char *pChar;
typedef char **ppChar;
Объясните пожалуйста вот этот момент?
Это зачем?

Добавлено:
Я в алгоритм не вникал, просто все ошибки которые ярко бросились в глаза я вам прокомментировал
C++:
#include<iostream>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//typedef char *pChar;
//typedef char **ppChar;

//Код читать очень-очень сложно
FILE*out1,*out2,*out3;
void main()
{
out1=fopen("text1.txt","r");
out2=fopen("text2.txt","r");
out3=fopen("text3.txt","w");
int i,j,m,n,kolstrA,kolstrB;
char in[80];
char an[80];
char*pa[100];
char*pb[100];
char*pc[100];
char*pk[100];
char a[100][80];
char b[100][80];
char c[200][80];

for (kolstrA=0;kolstrA<100;kolstrA++)
{
if(fgets(in,80,out1)==NULL)
{
break;
};
in[80]='\0';
strncpy(a[kolstrA],in,80);
};
fclose(out1);
for(kolstrB=0;kolstrB<100;kolstrB++)
{
if(fgets(an,80,out2)==NULL)
{
break;
};
an[80]='\0';
strncpy(b[kolstrB],an,80);};
fclose(out2);

for(i=0;i<=kolstrA;i++)
{
pa[i]=a[i];
};
for(j=0;j<=kolstrB;j++)
{
pb[j]=b[j];
};
for(m=0;m<=(kolstrA+kolstrB);m++)
{
pc[m]=c[m];
};
i=0;
j=0;
m=0;
for(i=0;i<=kolstrA-2;i++)
{
for(j=i+1;j<=kolstrA-1;j++)
{
if(strcmp(pa[i],pa[j])<0)
{
strcpy(pk,pa[i]); // Вот смотрите в этом месте у вас pk определена как массив строк(указатель на массив указателей)
// иными словами как char** prk; А strcpy - не работает с массивом строк, а только с массивом символов char*
//Так что добавьте индекс pk[i] 
strcpy(pa[i],pa[j]);
strcpy(pa[j],pk);};}; //Тут та же история
for(i=0;i<=kolstrB-2;i++)
{
for(j=i+1;j<=kolstrB-1;j++)
{
if(strcmp(pb[i],pb[j])<0)
{
strcpy(pk,pb[i]); // И тут таже история
strcpy(pb[i],pb[j]);
strcpy(pb[j],pk); //И тут
};
}; 
do
{
if(strcmp(pa[i],pb[j])<0)
{
pc[m]=pa[i];
i=i+1;
m=m+1;
}
else
{
pc[m]=pb[j];
j=j+1;
m=m+1;
};
}
while(i<kolstrA||j<kolstrB); //В этом месте совершенно не понял что вы этим хотели сказать
while(j<=kolstrB)
{
pc[m]=pb[j];
j=j+1;
m=m+1;
};
while(i<=kolstrA)
{
pc[m]=pa[i];
i=i+1;
m=m+1;
};
cout<<"rezultat"<<"\n";
for(m=0;m<(kolstrA+kolstrB);m++)
{
printf("%s\n",pc[m]);
};
return;
}
}
}
 
N

Nstudent

с pk сразу выдает ошибку о преобразовании типов. я попробовала заменить так:
char pk[80];
и
{strcpy(pk,pa);
strcpy(pa,pa[j]);
strcpy(pa[j],pk);}

теперь компилятор ошибок не выдает, но при запуске выводятся некие непонятные символы(вроде скобок)
 
D

DarkKnight

Скажи что именно делает (или должна делать), твоя программа, так будет легче о чем то конкретном говорить :)
 
N

Nstudent

Она должна 1)считать строки двух текстовых файлов 2) в обоих файлах отсортировать строки методом пузырька 3) из эти двух файлов создать третий, отсортировав строки слиянием. Ну и обязательно должны использоваться указатели.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!