• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Конструктор класса, C++, Visual Studio 2008

Алина_Д

Ученик
Регистрация
14 Июн 2011
Сообщения
3
Реакции
0
Баллы
0
Конструктор класса, C++, Visual Studio 2008

Добрый день!
Помогите разобраться с ошибкой.

Задание программы:
Ввести в программу текст, отсортировавать слова по количеству повторений - от большего к меньшему, вывести текст на экран.

Код программы:

//Объявите класс с именем text. Объявите функцию show(), функция сортирования текста по возрастанию.
//Текст можно вставить любой, а сортировать по количеству букв в слове от меньшего к большему ну или на оборот.

//подключаемые файлы
#include <ctype>
#include <fstream>
//
#include <windows>
#include <iomanip>
#include "stdafx.h"
#include <string.h>
#include <locale>
#include <stdio.h>
#include <iostream>
//подключение поля namespase
using namespace std;

//класс текст
class Text
{
//скрытые элементы класса
private:
//указатель на слово
char* str;
//разсер
int size;
//количество овторений
int* k;
//буфер

public:
//Функция возврата массива символов
const char* Show(void);

//Функция сортировки слов (по возрастанию)
void SortWord(void);

//Перегрузка конструктора копирование по умолчанию
Text (char ttext);
//Конструктор по умолчанию
Text();
//Деструктор класса
~Text();
};

//Перегрузка конструктора копирование по умолчанию
Text (char ttext)
{
//delete str[];
//в прееменнуб длины записывает длину слова
size = strlen(ttext.str);
//заводим символьную переменную с вычисленны м размером
str = new char[size+1];
//заводим числовой массив частоты слов
k= new int[size+1];
//копируем в str строку
strcpy(str,ttext.str);
//возвращаемуказатель *this
return *this;
}

//Функция возврата массива символов
const char* Text::Show(void) // константный символьный указатель на функцию класса возвращает значение str
{
int Word = 0; //Счетчик слов
char** ArrWord = new char*[size+1]; //Массив слов
char *buffer = new char[size+1]; //Буферная переменная
char *ptr = buffer; //Указатель на буферную переменную
memset(buffer,0,size+1); //Обнулим буфрную переменную
char *pl;
char c = ' ';

for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку


*pl = *strrchr(str, c);

int i = 0;

if (!pl) //Если не пробел
{
char *ptr;
*ptr++ = str; //Пишим в буферную переменную и сдвигаем указатель
i++;

}
else
if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
{
ArrWord[Word] = new char[size+1]; //Выделим память под слово
strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
memset(buffer,0,size+1); //Обнулим память буферной переменной
ptr = buffer; //Поставим указатель на начало буферной переменной
}
else {}


char buf='0';
const char *buff = &buf;
strcpy(str,ArrWord[0]);
strcpy(str, buff);
strcpy(str, ArrWord[Word]);

//const int Word;
//const int kо=k[0];
//const int kw=k[Word];

//struct stroka
//{char str;
//int ko;
//int kw;};

return str;
k[0];
k[Word];
}

//Функция сортировки слов (по возрастанию)
void Text::SortWord(void)
{

int Word = 0; //Счетчик слов
char** ArrWord = new char*[size+1]; //Массив слов
char *buffer = new char[size+1]; //Буферная переменная
char *ptr = buffer; //Указатель на буферную переменную
memset(buffer,0,size+1); //Обнулим буфрную переменную
char *pl;
char c = ' ';

for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
{


*pl = *strrchr(str, c);

if (!pl) //Если не пробел
{
char *ptr;
*ptr++ = str; //Пишим в буферную переменную и сдвигаем указатель
k=1;
}
else
if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
{
ArrWord[Word] = new char[size+1]; //Выделим память под слово
strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
memset(buffer,0,size+1); //Обнулим память буферной переменной
ptr = buffer; //Поставим указатель на начало буферной переменной
}
else {}

}
for (int i=0; i<Word-1; i++) /*в цикле обходим все лова*/
{for (int j=1; j<Word; j++)

{if (ArrWord==ArrWord[j]) /*если слова под обоими объектами одинаковы */
{k = k + 1;}/* количество повторений увеличиваем на 1*/
}}

//const char *bufer= &buffer;

//int k[size] = {1};

//int str_len = strlen(buffer);

//int i;
// for(i = 0; i < str_len; i++)
// {
// k[(unsigned char)str]++;
// }


memset(str,0,size+1); //Обнулим строку
//Сортируем слова по длине

//char Arrword[100];

for (int i = 0; i<Word-1; i++)//Обойдем весь массив слов
{
int mkol=k;//mkol присваивается значение k текущее
char * Max = ArrWord;// символьной переменной Max присваивается указатель на пермененную с индексом i массива Arrword
int pos = i; // значению целочисленной переменной pos присваивается значение i

for (int j=i; j<Word; j++) //Обойдем все слова с i
{
if (mkol < k[pos])
{
Max = ArrWord[j];
mkol = k[j];
pos = j;
}


if (ArrWord==Max)
{}
else
{strcpy(buffer, ArrWord);
strcpy (ArrWord,ArrWord[j]);
strcpy (ArrWord[j], buffer);
}

Max = ArrWord;
mkol = k;
pos = i;
strcat(str,ArrWord);
}
if ( (i+1) != Word) strcat(str," ");
}
for (int i = 0; i<Word; i++)
{
delete[] ArrWord;
}
delete [] buffer;
delete [] ArrWord;
}

//Деструктор класса
Text::~Text()
{
delete[] str;
}


// главный код программы
int _tmain(int argc, _TCHAR* argv[])
{
//поключение русского языка
setlocale(LC_ALL, "Russian");

//Тестирование класса Text
//инициализируем k

char ttext;
cout<<"введите текст"<< endl;
cin>> ttext;
//char * Value= &ttext;
Text K(ttext);
//выполняе выполнение функции для K объекта с текстом
K.SortWord();
//печатаем результат
std::cout<<K.Show()<<std::endl;
return 0;
}



Выдаваемые компилятором ошибки:
Ошибка 5 error C2062: тип "char" не требуется k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 48 la3
Ошибка 6 error C2143: синтаксическая ошибка: отсутствие ";" перед "{" k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 49 la3
Ошибка 7 error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) k:\учёба\разработка и стандартизация\la3\la3\la3.cpp 49 la3


В строках:
//Перегрузка конструктора копирование по умолчанию
Text (char ttext)
{
//delete str[];
//в прееменнуб длины записывает длину слова
size = strlen(ttext.str);
//заводим символьную переменную с вычисленны м размером
str = new char[size+1];
//заводим числовой массив частоты слов
k= new int[size+1];
//копируем в str строку
strcpy(str,ttext.str);
//возвращаемуказатель *this
return *this;
}
 
тут просто куча ошибок!!!!
как можно вызывать конструктор Text K(ttext);??? только Text(ttext) инициализуруете свой конструктор, потом если хотите вызвать какие то методы своего класса,
то можно сделать так
Text K;
K.Show();
K.SortWord();

это пока что я вижу, и лучше сделайте свой код более читабельным!!!
class Text
{
public:
Text();
~Text();
Text (char ttext);
const char* Show(void);
void SortWord(void);
private:
char* str;
int size;
int* k;
};
если хотите писать комментарии, то обычно используются /* comment */
 
//Составить частотный словарь слов заданного текста. Текст может вводится с клавиатуры или из файла. В качестве текста можно использовать текст программы. Определить слова, встречающиеся чаще всех и реже всех. Пользователь выбирает вариант варианты ввода текста:
//· с клавиатуры,
//· из файла, с указанием имени файла,
//· текст данной программы.
//
//Производится сохранение самого часто и реже встречающегося слова в файл.

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////

//подключаемые файлы
#include <ctype>
#include <fstream>
#include <windows>
#include <iomanip>
#include "stdafx.h"
#include <string.h>
#include <locale>
#include <stdio.h>
#include <iostream>
//подключение поля namespase
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////класс текст/////////////////////////////////////
//должен включать в себя: переменные слов str; длины текста, из которого формируются слова size;
//количества повторений слов k;; функции сортировки слов Sortword(сперва находится количество повторений
//каждого слова в тексте, описывается в переменной k, затем сортируются слова по количеству повторений -
//от максимального к минимальному); фукнцию вывода слов Show (выводится строка, в которой содержатся max-но и
//min-но встречающеися в тексте слова); конструктор Text (принимает текст, записанный в переменной ttext,
//инициализирует str, size и k); деструктор./////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
class Text
{
//объявления:
public:
//конструктор по умолчанию
Text();
//деструктор
~Text();
//конструктор с передаваемым текствовым массивом в качестве параметра
Text (char ttext);
//функция вывода слов Show
const char* Show(void);
//функция сортировки слов
void SortWord(void);
private:
//переменная слов
char* str;
//переменная длины слова
int size;
//переменная количества повторений слов
int* k;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////Конструктор с передаваемым текствовым массивом в качестве параметра///////////////////
//должен находить длину текста size, разбивать текст на слова str, инициализировать количество повторений
//каждого слова k/////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
Text (auto char ttext)
{
//инициализируем переменную для поиска пробелов в тексте
char ch = '0';
//находим длину текста
int size = strlen(ttext);
//заводим цикл, в котором:
for (int i = 0 ; i < size ; i++)
{
//выводим указатель на первое вхождение пробела
int m = char* strrchr(char ttext, char ch);
// вычисляем количество символов от начала текста до первого пробела
int с = m-i;
// копируем эти символы из ttext в char
char *strncpy (char *ttext, char *str, int c);
//инициализируем массив повторений функции k
k= new int[size+1];}
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////Деструктор класса//////////////////////////////////////////
//Должен чистить память от переменных слов str, длины текста size и количества повторений k
////////////////////////////////////////////////////////////////////////////////////////////////
Text::~Text()
{
//очищаем память массива слов
delete[] str;
//очищаем память длины текста
delete size;
// очищаемпамть количества повторений слов
delete[] k;
}
//Функция сортировки слов (по возрастанию)
void Text::SortWord(void)
{

int Word = 0; //Счетчик слов
char** ArrWord = new char*[size+1]; //Массив слов
char *buffer = new char[size+1]; //Буферная переменная
char *ptr = buffer; //Указатель на буферную переменную
memset(buffer,0,size+1); //Обнулим буфрную переменную
char *pl;
char c = ' ';

for (int i=0; i <= strlen(str); i++) //Обойдем по-символьно всю строку
{


*pl = *strrchr(str, c);

if (!pl) //Если не пробел
{
char *ptr;
*ptr++ = str; //Пишим в буферную переменную и сдвигаем указатель
k=1;
}
else
if (strlen(buffer)>0) //Если же управляющий или разделитель и длина буферной переменной >0
{
ArrWord[Word] = new char[size+1]; //Выделим память под слово
strcpy(ArrWord[Word++],buffer); //Скопируем буферную переменную в слово
memset(buffer,0,size+1); //Обнулим память буферной переменной
ptr = buffer; //Поставим указатель на начало буферной переменной
}
else {}

}
for (int i=0; i<Word-1; i++) /*в цикле обходим все лова*/
{for (int j=1; j<Word; j++)

{if (ArrWord==ArrWord[j]) /*если слова под обоими объектами одинаковы */
{k = k + 1;}/* количество повторений увеличиваем на 1*/
}}



memset(str,0,size+1); //Обнулим строку
//Сортируем слова по длине

//char Arrword[100];

for (int i = 0; i<Word-1; i++)//Обойдем весь массив слов
{
int mkol=k;//mkol присваивается значение k текущее
char * Max = ArrWord;// символьной переменной Max присваивается указатель на пермененную с индексом i массива Arrword
int pos = i; // значению целочисленной переменной pos присваивается значение i

for (int j=i; j<Word; j++) //Обойдем все слова с i
{
if (mkol < k[pos])
{
Max = ArrWord[j];
mkol = k[j];
pos = j;
}


if (ArrWord==Max)
{}
else
{strcpy(buffer, ArrWord);
strcpy (ArrWord,ArrWord[j]);
strcpy (ArrWord[j], buffer);
}

Max = ArrWord;
mkol = k;
pos = i;
strcat(str,ArrWord);
}
if ( (i+1) != Word) strcat(str," ");
}
for (int i = 0; i<Word; i++)
{
delete[] ArrWord;
}
delete [] buffer;
delete [] ArrWord;
}
 
/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////Функция вывода слов Show///////////////////////////////////////////////
//функция должна принимать отсортированный относительно количества повторений k массив слов str,
//выделять в нём максимально и минимально встречающиеся слова, выводить в главную функцию
///////////////////////////////////////////////////////////////////////////////////////////////////
const char* Text::Show(void)
{
////вводим слова: str
//объявления:
//переменная, определяющая количество слов
int Word = 0;
//массив слов
char** ArrWord = new char*[size+1];
//Буферная переменная
char *buffer = new char[size+1];
//Указатель на буферную переменную
char *ptr = buffer;

//Обнуление буфрной переменной
memset(buffer,0,size+1);

//выделение слов из текста и запись в массив
//объявление:
//указателя на вхождение пробела
char *pl;
// переменной для пробела
char c = ' ';
// цикл для всего текста
for (int i=0; i <= strlen(str); i++)
{
//находим указатель на вход пробела в тексте
//Условие:
//Если не пробел,
if (!pl)
{
//объявляем указатель
char *ptr;
//Пишим в переменную str и сдвигаем указатель
*ptr++ = str;
}
//иначе:
else
// Условие 2:
//Если управляющий или разделитель и длина буферной переменной >0
if (strlen(buffer)>0)
{
//Выделим память под слово
ArrWord[Word] = new char[size+1];
//Скопируем буферную переменную в переменную слово
strcpy(ArrWord[Word++],buffer);
//Обнулим память буферной переменной
memset(buffer,0,size+1);
//Поставим указатель на начало буферной переменной
ptr = buffer;
}
//иначе:
else {}
////закончили ввод слов


////вывод на печать максимально и минимально встречающегося слова:
//копируем переменные max и min встречающихся слов в сроку str
//объявляем и инициализируем переменную пробела
char buf='0';
//объявляем указатель на переменную
const char *buff = &buf;
//копируем в переменную str переменную слова с индексом 0 (Максимально встречающееся слово)
strcpy(str,ArrWord[0]);
//копируем в переменную str переменную пробела
strcpy(str, buff);
// копируем в переменную str переменную слова с индексом Word (минимально встречающееся слово)
strcpy(str, ArrWord[Word]);

//ВЫВОД СТРОКИ
return str;

////также ещё дожно быть реализовано вывод количество повторений max иmin встречающихся слов
//k[0];
//k[Word];
////
}
////цикл по i завершился
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////главная функция программы//////////////////////////////////////////////////
//должен производиться ввод текста - с командной строки и из файла; создание объекта класса и
//передача ему текста в качестве параметра; реализованы функция сортировки слов и функция вывода слов;
//сохранение максимально и минимально встречающегося слова в отдельный файл/////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
//поключение русского языка
setlocale(LC_ALL, "Russian");

////здесь должен быть предложен ввод из файла или из командной строки

//с командной строки:
//инициализируем переменную для текста
auto char* ttext;
// ввод текста
cout<<"введите текст"<< endl;
cin>> ttext;

//ввод из файла:
////

//выполнение программы:
//объявление класса
Text K;
//сортировка слова
K.SortWord();
//вывод слов
K.Show();

////здеь должен быть предложен вывод слов - на экран или соханение в файл

//на экран:
//std::cout<<K.Show()<<std::endl;

//в файл:
////
return 0;
}
 
Назад
Сверху