Задача на строки
Дан текст, состоящий из 2 строк с максимальной длиной 80 символов. Необходимо вывести в обратном алфавитном порядке те слова, которые не присутствуют в обеих строках одновре-менно. Считать, что текст написан синтаксически грамотно, в качестве знаков препинания ис-пользуются точка и запятая, слова состоят только из букв, перенос слов по слогам отсутствует. Для выделения слов из строки создать пользовательскую функцию.
Решение на С++ через string.h c использованием функции помогите пожалуйста...
Код:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <string>
#include <fstream>
#include <iostream>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
bool compare(string str1, string str2)
{
bool b = 1;
unsigned int ii = 0;
while((str1[ii] != '\0') && (str2[ii] != '\0'))
{
if(str1[ii] != str2[ii])
b = 0;
ii++;
}
return b;
}
unsigned int wcount(string str)
{
unsigned int count = 0;
for(unsigned int ii = 0;ii < str.length();ii++)
if((str[ii] == ' ') || (str[ii] == ',') || (str[ii] == '.') || (str[ii] == '\n'))
count++;
return count;
}
char ** divide(string str)
{
char ** tmp = new char * [wcount(str)];
unsigned int j = 0, k = 0;
tmp[0] = new char [25];
for(unsigned int ii = 0;ii <= str.length();ii++)
if((str[ii] != ' ') && (str[ii] != ',') && (str[ii] != '.') && (str[ii] != '\n'))
{
tmp[j][k] = str[ii];
k++;
}
else
{
tmp[j][k] = '\0';
j++;
k = 0;
tmp[j] = new char [25];
}
return tmp;
}
char ** chck(string str1, string str2)
{
char ** cstr1, ** cstr2;
cstr1 = divide(str1);
cstr2 = divide(str2);
char ** tmp = new char * [20];
unsigned int count = 0;
for(unsigned int ii = 0;ii <= wcount(str1);ii++)
{
bool b = 1;
for(unsigned int j = 0;j <= wcount(str2);j++)
if(compare(cstr1[ii],cstr2[j]))
b = 0;
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr1[ii];
count++;
}
}
//////////////////////////////////
for(unsigned int ii = 0;ii <= wcount(str2);ii++)
{
bool b = 1;
for(unsigned int j = 0;j <= wcount(str1);j++)
if(compare(cstr2[ii],cstr1[j]))
b = 0;
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr2[ii];
count++;
}
}
tmp[count] = new char [1];
tmp[count] = '\0';
return tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream in("in.txt",ios::in);
string str1, str2;
char * tmp = new char [80];
in.getline(tmp,80,'\n');
str1.append(tmp);
in.getline(tmp,80,'\n');
str2.append(tmp);
delete [] tmp;
char ** arw;
arw = chck(str1,str2);
unsigned int ii = 0;
while(arw[ii]!='\0')
{
cout << arw[ii] << endl;
ii++;
}
char c;
cin >> c;
return 0;
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include <string>
#include <fstream>
#include <iostream>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
bool compare(string str1, string str2)
{
bool b = 1;
unsigned int ii = 0;
while((str1[ii] != '\0') && (str2[ii] != '\0'))
{
if(str1[ii] != str2[ii])
b = 0;
ii++;
}
return b;
}
unsigned int wcount(string str)
{
unsigned int count = 0;
for(unsigned int ii = 0;ii < str.length();ii++)
if((str[ii] == ' ') || (str[ii] == ',') || (str[ii] == '.') || (str[ii] == '\n'))
count++;
return count;
}
char ** divide(string str)
{
char ** tmp = new char * [wcount(str)];
unsigned int j = 0, k = 0;
tmp[0] = new char [25];
for(unsigned int ii = 0;ii <= str.length();ii++)
if((str[ii] != ' ') && (str[ii] != ',') && (str[ii] != '.') && (str[ii] != '\n'))
{
tmp[j][k] = str[ii];
k++;
}
else
{
tmp[j][k] = '\0';
j++;
k = 0;
tmp[j] = new char [25];
}
return tmp;
}
char ** chck(string str1, string str2)
{
char ** cstr1, ** cstr2;
cstr1 = divide(str1);
cstr2 = divide(str2);
char ** tmp = new char * [20];
unsigned int count = 0;
for(unsigned int ii = 0;ii <= wcount(str1);ii++)
{
bool b = 1;
for(unsigned int j = 0;j <= wcount(str2);j++)
if(compare(cstr1[ii],cstr2[j]))
b = 0;
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr1[ii];
count++;
}
}
//////////////////////////////////
for(unsigned int ii = 0;ii <= wcount(str2);ii++)
{
bool b = 1;
for(unsigned int j = 0;j <= wcount(str1);j++)
if(compare(cstr2[ii],cstr1[j]))
b = 0;
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr2[ii];
count++;
}
}
tmp[count] = new char [1];
tmp[count] = '\0';
return tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream in("in.txt",ios::in);
string str1, str2;
char * tmp = new char [80];
in.getline(tmp,80,'\n');
str1.append(tmp);
in.getline(tmp,80,'\n');
str2.append(tmp);
delete [] tmp;
char ** arw;
arw = chck(str1,str2);
unsigned int ii = 0;
while(arw[ii]!='\0')
{
cout << arw[ii] << endl;
ii++;
}
char c;
cin >> c;
return 0;
}
//---------------------------------------------------------------------------
if ((str == ' ') || (str == ',') || (str == '.') || (str == '\n'))
Цитата: 1n1ke1
она мне ошибку выдает а именно на строке
if ((str == ' ') || (str == ',') || (str == '.') || (str == '\n'))
if ((str == ' ') || (str == ',') || (str == '.') || (str == '\n'))
Предполагаю,всё дело в форумной разметке,которая пока ещё глючная.На деле там должно быть что-то вроде
Код:
if ((str[i] == ' ') || …
Скорее всего все ошибки будут связаны именно с этим.(Перед отправкой проверял на С++ Builder, все вроде как работало)
Программа как сказал препод не показывает уникальные слова второй строки и нету перемены букв сортировки которая выдавала бы слова с конца
Код:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <string>
#include <fstream>
#include <iostream>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
bool compare(char * str1, char * str2)
{
bool b = 1;
unsigned int ii = 0;
while((str1[ii] != '\0') && (str2[ii] != '\0') && (b))
{
if(str1[ii] != str2[ii])
b = 0;
ii++;
}
return b;
}
unsigned int wcount(char * str)
{
unsigned int count = 0;
bool b = 0;
for(unsigned int ii = 0;ii < strlen(str);ii++)
if((str[ii] == ' ') || (str[ii] == ',') || (str[ii] == '.') || (str[ii] == '\0'))
b = 1;
else
if(b)
{
count++;
b = 0;
}
count++;
// cout << count << endl;
return count;
}
bool bigger(char * str1, char * str2)
{
unsigned int t = 0;
unsigned int l;
if(strlen(str1) > strlen(str2))
l = strlen(str2);
else
l = strlen(str1);
for(unsigned int ii = 0;ii < l;ii++)
{
if((str1[ii] > str2[ii] && (t == 0)))
t = 1;
if((str1[ii] < str2[ii] && (t == 0)))
t = 2;
}
return (t == 2);
}
char ** sort(char ** source)
{
char ** tmp;
tmp = source;
unsigned int size = 0;
while(tmp[size] != '\0')
size++;
for(unsigned int ii = 0;ii < (size-1);ii++)
for(unsigned int j = ii+1;j < size;j++)
if(bigger(tmp[ii],tmp[j]))
{
char * str;
str = tmp[ii];
tmp[ii] = tmp[j];
tmp[j] = str;
}
return tmp;
}
char ** divide(char * str)
{
char ** ctmp = new char * [40];
// delete [] ctmp;
// ctmp = new char * [40];
unsigned int j = 0, k = 0;
ctmp[0] = new char [25];
bool b = 0;
for(unsigned int ii = 0;ii <= strlen(str);ii++)
if((str[ii] != ' ') && (str[ii] != ',') && (str[ii] != '.') && (str[ii] != '\0'))
{
if(b)
{
ctmp[j][k] = '\0';
// cout << tmp[j] << endl;
j++;
k = 0;
ctmp[j] = new char [25];
b = 0;
}
ctmp[j][k] = str[ii];
k++;
}
else
b = 1;
ctmp[j][k] = '\0';
// cout << tmp[j] << endl;
return ctmp;
}
char ** chck(char * str1, char * str2)
{
char ** cstr1;
char ** cstr2;
cstr1 = divide(str1);
cstr2 = divide(str2);
char ** tmp = new char * [20];
unsigned int count = 0;
for(unsigned int ii = 0;ii < wcount(str1);ii++)
{
bool b;
b = 1;
unsigned int j = 0;
while((j < wcount(str2)) && (b))
{
if(compare(cstr1[ii],cstr2[j]))
b = 0;
j++;
}
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr1[ii];//strcpy(cstr1,tmp[count]);
count++;
}
}
//////////////////////////////////
for(unsigned int ii = 0;ii < wcount(str2);ii++)
{
bool b;
b = 1;
for(unsigned int j = 0;j < wcount(str1);j++)
if(compare(cstr2[ii],cstr1[j]))
b = 0;
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr2[ii];
count++;
}
}
tmp[count] = new char [1];
tmp[count] = '\0';
return tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream in("in.txt",ios::in);
// string str1, str2;
char * str1 = new char [80];
char * str2 = new char [80];
in.getline(str1,80,'\n');
// str1.append(tmp);
in.getline(str2,80,'\n');
// str2.append(tmp);
// delete [] tmp;
char ** arw;
arw = chck(str1,str2);
arw = sort(arw);
unsigned int ii = 0;
while(arw[ii]!='\0')
{
cout << arw[ii] << endl;
ii++;
}
char c;
cin >> c;
return 0;
}
//---------------------------------------------------------------------------
#pragma hdrstop
#include <string>
#include <fstream>
#include <iostream>
#include <tchar.h>
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
bool compare(char * str1, char * str2)
{
bool b = 1;
unsigned int ii = 0;
while((str1[ii] != '\0') && (str2[ii] != '\0') && (b))
{
if(str1[ii] != str2[ii])
b = 0;
ii++;
}
return b;
}
unsigned int wcount(char * str)
{
unsigned int count = 0;
bool b = 0;
for(unsigned int ii = 0;ii < strlen(str);ii++)
if((str[ii] == ' ') || (str[ii] == ',') || (str[ii] == '.') || (str[ii] == '\0'))
b = 1;
else
if(b)
{
count++;
b = 0;
}
count++;
// cout << count << endl;
return count;
}
bool bigger(char * str1, char * str2)
{
unsigned int t = 0;
unsigned int l;
if(strlen(str1) > strlen(str2))
l = strlen(str2);
else
l = strlen(str1);
for(unsigned int ii = 0;ii < l;ii++)
{
if((str1[ii] > str2[ii] && (t == 0)))
t = 1;
if((str1[ii] < str2[ii] && (t == 0)))
t = 2;
}
return (t == 2);
}
char ** sort(char ** source)
{
char ** tmp;
tmp = source;
unsigned int size = 0;
while(tmp[size] != '\0')
size++;
for(unsigned int ii = 0;ii < (size-1);ii++)
for(unsigned int j = ii+1;j < size;j++)
if(bigger(tmp[ii],tmp[j]))
{
char * str;
str = tmp[ii];
tmp[ii] = tmp[j];
tmp[j] = str;
}
return tmp;
}
char ** divide(char * str)
{
char ** ctmp = new char * [40];
// delete [] ctmp;
// ctmp = new char * [40];
unsigned int j = 0, k = 0;
ctmp[0] = new char [25];
bool b = 0;
for(unsigned int ii = 0;ii <= strlen(str);ii++)
if((str[ii] != ' ') && (str[ii] != ',') && (str[ii] != '.') && (str[ii] != '\0'))
{
if(b)
{
ctmp[j][k] = '\0';
// cout << tmp[j] << endl;
j++;
k = 0;
ctmp[j] = new char [25];
b = 0;
}
ctmp[j][k] = str[ii];
k++;
}
else
b = 1;
ctmp[j][k] = '\0';
// cout << tmp[j] << endl;
return ctmp;
}
char ** chck(char * str1, char * str2)
{
char ** cstr1;
char ** cstr2;
cstr1 = divide(str1);
cstr2 = divide(str2);
char ** tmp = new char * [20];
unsigned int count = 0;
for(unsigned int ii = 0;ii < wcount(str1);ii++)
{
bool b;
b = 1;
unsigned int j = 0;
while((j < wcount(str2)) && (b))
{
if(compare(cstr1[ii],cstr2[j]))
b = 0;
j++;
}
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr1[ii];//strcpy(cstr1,tmp[count]);
count++;
}
}
//////////////////////////////////
for(unsigned int ii = 0;ii < wcount(str2);ii++)
{
bool b;
b = 1;
for(unsigned int j = 0;j < wcount(str1);j++)
if(compare(cstr2[ii],cstr1[j]))
b = 0;
if(b)
{
tmp[count] = new char [25];
tmp[count] = cstr2[ii];
count++;
}
}
tmp[count] = new char [1];
tmp[count] = '\0';
return tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
ifstream in("in.txt",ios::in);
// string str1, str2;
char * str1 = new char [80];
char * str2 = new char [80];
in.getline(str1,80,'\n');
// str1.append(tmp);
in.getline(str2,80,'\n');
// str2.append(tmp);
// delete [] tmp;
char ** arw;
arw = chck(str1,str2);
arw = sort(arw);
unsigned int ii = 0;
while(arw[ii]!='\0')
{
cout << arw[ii] << endl;
ii++;
}
char c;
cin >> c;
return 0;
}
//---------------------------------------------------------------------------
Спасибо вам огромное, только единственная проблема программа выдает уникальные слова лишь одной строки а второй не показывает