Задача на классы C++

  • Автор темы Famous
  • Дата начала
F

Famous

Гость
#1
Помогите пожалуйста написать код...хотя бы само начало...трудно начать с чего-то

Написать программу, которая сканирует текст на русском языке и формирует массив указателей на список слов, каждый узел в которой по условию длин не более 4.
Мама пьёт молоко, а папа кефир

________.JPG
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#2
Не самый конечно наилучший пример, но во всяком с задачей точно справится

C++:
#include <iostream>
#include <ctype.h>
using namespace std;

//Класс список слов
struct Words
{
char* Word; //Строка (макс. 5 символов)
Words* NextWord; //Указатель на класс

public:
void Add(char *str) //Функция добавления слова
{
int len = strlen(str); //Определим размерность строки 
Words *This = this; //Создадим указатель на текущий объект класса
while (len>0) //Пока размер строки > 0 
{
This->Word = new char[5]; //Создадим объект типа char размерностью 5 байт (4 символа + 1 завершающий строки)
This->NextWord = NULL; //Указатель на клас поставим в null
if (len > 4) //Если размер слова(строки) >4 
{
This->NextWord = new Words; //Выделим память под след. элемент
strncpy(This->Word,str,4); //Скопируем 4 символа в СписокСлов-Строка
This->Word[4] = 0; //Завершающий символ строки
str+=4; //Сместим указатель входящей строки на 4 байта (отбросим 4 символа в начале строки)
len -= 4; //Уменьшим длину на 4 ед.

} 
else //Если размер строки слова <= 4
{
strncpy(This->Word,str,strlen(str));//Скопируем [длину строки] символа в СписокСлов-Строка
This->Word[strlen(str)] = 0; //Поставим завершающий символ строки
len -= strlen(str); //Уменьшим размер *ну можно еще и сдвинуть но так как циклим мы len а не strlen(str) этого не понадобится
}

This = This->NextWord;		//Сместим указатель на сл. элемент списка
}
}

void Print(void) //Функция вывода на экран по цепочки
{
Words *Temp = this;
while (Temp) //Пока Temp не NULL
{
cout<<Temp->Word<<" -> ";
Temp = Temp->NextWord; // Temp = след. элемент списка
}
cout<<"!!!"; 
}

};

int AddString (Words *Arr, char *str) //Функция добавления строки (со словами) в массив Arr - массив объектов (списка), str - строка.. На выходе кол-во заполненых
//Элементов массива
{
char *buffer = new char [1024]; //Буферная переменная
int cnt = 0; //Кол-во символов промежуточное
int ArrCount = 0; //Кол-во эл. массива (которые заполнили)
while (strlen(str) != 0) //Пока не достигнут конец строки (Обойдем всю строку другими словами)
{
if (isalnum((unsigned char)str[0])) //Если символ в строке цифра или буква то значит мы в слове
{
buffer[cnt] = str[0]; //Запишим в буфер этот символ
cnt++; //Увеличим счетчик
}
else if (cnt != 0) //Иначе - тоесть разделитель между строк и подтра*цензура*ся на случей идущих подряд разделителей
{
buffer[cnt] = 0; //Поставим в буфере символ конца строки
Arr->Add(buffer); //Вызовим функцию класса на добавление слова в список 
cnt = 0; //Обнулим промежуточное кол-во символов, т.к. уже будем искать новое слово
Arr++; //Сдвиним указатель на массив объектов на 1 элемент
ArrCount++; //Увеличим кол-во заполненых эл. массива
delete[] buffer; //Отчистим буферную переменную
buffer = new char[1024]; //И заново выделим ей память
}
str++; //сдвиним указатель на строку, тем самым отбросив 1 символ из начала
}

if (cnt != 0) //Если на выходе из цикла пром. кол-во не нулевое, значит в буфере находится последнее слово
{
buffer[cnt] = 0; //Завершающий символ
Arr->Add(buffer); //Запишим это слово в наш список
ArrCount++; //Увеличим кол-во заполненых эл-ов
}
delete[] buffer; //почистим буферную переменную
return ArrCount; //Вернем кол-во заполненых элементов
}


void main (void)
{
setlocale(LC_ALL,"Russian_Russia");

Words s[20]; //За размерностью следить в этом месте нужно... ЧТо бы за пределы не выйти
char st[1024];
gets(st); //Получим строку

setlocale(LC_ALL,".866");
int CountEl = AddString(s,st);



for (int i=0; i< CountEl; i++) //Обойдем все элементы и выведим на экран
{
s[i].Print();
cout<<endl;
}



system("pause");


}
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#3
Глаза разуйте....
Если мне книжку по русскому языку нужно взять, то вам помойму следует по синтаксису C++ литературы почитать....
И не забудьте уделить внимание на определения слова "класс"...

И не стоит доколебываться до моих кодов... Чего вы ко мне прицепились, я могу только догадываться (возможно см. прикрепл. файл).

Я никому не навязываю свой код, либо свое мнение, я не пытаюсь заработать на студентах, у них и так денег вечно не хватает, я просто отвечаю на фразы ("помогите пожалуйста" и т.д.)...

Я всегда пытаюсь организовать свой код таким образом, что бы автор мог разобратся в нем или хотя бы понять принцип и написать свой...
Я не ставлю при написании кода задачи жесткой оптимизации как длины кода, так и памяти при работе программы, у меня никогда нет финансовых отношений с автором и поэтому автор впринципи не может меня упрекнуть, принцип "не нравится - ни читайте"... Я всегда стараюсь описать (откомментировать) ход своей мысли в алгоритме, что бы человек смог понять и разобратся...

И у меня нет ни одного сообщения, которое бы было написанно "на ..бись"...
Так что товарищ, с запавлей буквой r при регистрации, лучше бы дельным чем-нибудь занялись....
 

Вложения

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#4
<table valign="top" style='margin:0;width:100%;border:1px dashed red;'>[tr]<td align='middle' bgcolor='#ff6060' valign='top' width='1%'>
<FONT color='#ffffff' size='+3'> ! </font>
</td><td align="midle" valign='top' style='background:#fff;'>Аккуратнее или отправлю в 3хдненвый перекур обоих.</td>[/tr]</table>

Добавлено: ЛУчше бы не спорили, а код задачи до идеального довели.
 

DarkKnight

Well-Known Member
01.08.2010
653
0
33
Владивосток
#5
rrrFer, ладно уж, я правда бываю не внимателен, не спорю....И важное иной раз тоже упускаю...
Ты меня извини за это "про изучения синтаксиса", я читал твои посты и прекрасно понимаю, что когда писал очень приувеличил, ну эт я психанул просто :)
Я же видел прекрасно что ты прямо доколебывался в мои кода :) Если чесно, и про кирпич можно сказать что он круглый, если очень постараться..... :)
Без обид, ты хороший кодер, я перегнул....:)
Постараюсь в предь более или менее придерживаться правил...
"Мир, дружба жвачка вообщем"....
Правда извини, я и после того как запостил прошую мессагу, хотел ее удалить, но уж сильно злой был....
Вообщем я правда переборщил...
 

Гость
#6
люди!!! Срочно!!!! помогите, пожалуйста, написать программу на c++!!! Задача такая: Реализовать указанные классы с закрытыми полями, для каждого из которых кроме методов, указанных в задании, должны быть реализованы следующие методы:
-методы, которые возвращают значение полей
-метод инициализации
-ввод значения полей
-вывод на экран
-преобразование в строку
там, где необходимо организовать проверку корректности данных.

Реализовать класс Money для работы с денежными суммами. Объекты класс определяются парой чисел(рубли, копейки). Реализовать методы сложения, вычитания, деления сумм, сравнение двух сумм, умножение и деление на число.

ПОЖАЛУЙСТА!!! очень надо!
 
I

ierofant

Гость
#7
Василиска
Для своей задачи ты должна открыть свою тему, а не в чужой писать её.