Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 14.06.2011, 16:10   #1 (permalink)
Алина_Д
Новичок
 
Регистрация: 14.06.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Question Конструктор класса, 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]; //Пишим в буферную переменную и сдвигаем указатель
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[i]; //Пишим в буферную переменную и сдвигаем указатель
k[i]=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[i]==ArrWord[j]) /*если слова под обоими объектами одинаковы */
{k[i] = k[i] + 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[i]]++;
// }


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

//char Arrword[100];

for (int i = 0; i<Word-1; i++)//Обойдем весь массив слов
{
int mkol=k[i];//mkol присваивается значение k текущее
char * Max = ArrWord[i];// символьной переменной 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[i]==Max)
{}
else
{strcpy(buffer, ArrWord[i]);
strcpy (ArrWord[i],ArrWord[j]);
strcpy (ArrWord[j], buffer);
}

Max = ArrWord[i];
mkol = k[i];
pos = i;
strcat(str,ArrWord[i]);
}
if ( (i+1) != Word) strcat(str," ");
}
for (int i = 0; i<Word; i++)
{
delete[] ArrWord[i];
}
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;
}
Алина_Д вне форума   Ответить с цитированием

Старый 14.06.2011, 16:10
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Возможно, что решение вашего вопроса имеется где то тут

Visual Basic 2008 программирование очень нужна помощь
Microsoft Visual C 2008 redistributable x86

Старый 14.06.2011, 23:03   #2 (permalink)
Хаус
Новичок
 
Регистрация: 14.06.2011
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

тут просто куча ошибок!!!!
как можно вызывать конструктор 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 */
Хаус вне форума   Ответить с цитированием
Старый 16.06.2011, 02:38   #3 (permalink)
Алина_Д
Новичок
 
Регистрация: 14.06.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

//Составить частотный словарь слов заданного текста. Текст может вводится с клавиатуры или из файла. В качестве текста можно использовать текст программы. Определить слова, встречающиеся чаще всех и реже всех. Пользователь выбирает вариант варианты ввода текста:
//· с клавиатуры,
//· из файла, с указанием имени файла,
//· текст данной программы.
//
//Производится сохранение самого часто и реже встречающегося слова в файл.

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

//подключаемые файлы
#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[i]; //Пишим в буферную переменную и сдвигаем указатель
k[i]=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[i]==ArrWord[j]) /*если слова под обоими объектами одинаковы */
{k[i] = k[i] + 1;}/* количество повторений увеличиваем на 1*/
}}



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

//char Arrword[100];

for (int i = 0; i<Word-1; i++)//Обойдем весь массив слов
{
int mkol=k[i];//mkol присваивается значение k текущее
char * Max = ArrWord[i];// символьной переменной 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[i]==Max)
{}
else
{strcpy(buffer, ArrWord[i]);
strcpy (ArrWord[i],ArrWord[j]);
strcpy (ArrWord[j], buffer);
}

Max = ArrWord[i];
mkol = k[i];
pos = i;
strcat(str,ArrWord[i]);
}
if ( (i+1) != Word) strcat(str," ");
}
for (int i = 0; i<Word; i++)
{
delete[] ArrWord[i];
}
delete [] buffer;
delete [] ArrWord;
}
Алина_Д вне форума   Ответить с цитированием
Старый 16.06.2011, 02:38   #4 (permalink)
Алина_Д
Новичок
 
Регистрация: 14.06.2011
Сообщений: 3
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

/////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////Функция вывода слов 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[i];
}
//иначе:
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;
}
Алина_Д вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 10:51.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.