Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 17:42   #1
Ktulu
 
Регистрация: 22.12.2010
Сообщений: 5
По умолчанию C++ задача по символьным массивам

Всем здравствуйте и извините за беспокойство. Нужно решить такую задачу.
Отредактировать заданное предложение, удаляя из него слова встречающиеся определённое количество раз. При этом есть 2 условия. Во-первых, нельзя использовать дополнительные библиотеки, только iostream. Во-вторых, должно быть меню. То что я написал, ниже (Код, наверное, корявый, но я новичок, не во всём соображаю.) Вместо нужного результата программа выводит какие-то буквы и цифры. Как это исправить не знаю. Помогите, пожалуйста.
Цитата:
#include "stdafx.h"
#include <iostream>

using namespace std;


void GetWord(char* сStr, int iSize,char* &cWord,int& iNumWord)
{
cWord = new char[iSize];
memset(cWord,0,iSize*sizeof(char));

int iCurWord = 0, k=0;// Текущее слово равно нулю
for (int i=0; i < iSize; i++)// Пробегаем по всем данным символам
{
if (сStr[i] == ' ')// Проверить текущее слово, если пробел, то проверить следущее слово
{
iCurWord++; // Проверить следующее слово
continue; // Продолжать, пока не переберем все слова
}

if (iCurWord == iNumWord)//Если текущее слово по символам совпадает с другим словом
{
cWord[k] = сStr[i];// Пока посивмвольно равны слова
k++; // Перебираем все символы
}
if (iCurWord != iNumWord)// Если не совпадает, то пропускаем
break;
}

iCurWord = k+1;
}

int GetLenStr(char* cStr)//Функция для подсчета длины предложения
{
int iLen = 0;
while (cStr[iLen]!= 0) //Находит конец предложения
{
iLen++;
}

return iLen;
}

int GetWordAmount(char* cStr, int iSize)// Функция для подсчета количества слов в предложении
{
int iAmount = 0;// Первоначально количество слов присваивают к нулю
for (int i=0; i < iSize; i++)// Пробегает по символам в строке
{
if (cStr[i] == ' ')//Находит пробелы
iAmount++;// Если нашли пробел, значит проверяем следующее слово
}
return iAmount+1;
}

int FindWords(char* cStr, int iStr, char* pWord, int iWord)
{
int iRes = 0, k=0;
bool bFlag = false;

for (int i=0; i<iStr; i++)
{
if (cStr[i] == pWord[k])// Если буквы совпадают, то продолжаем сравнивать

bFlag = true;


if (bFlag == true)
{

if (cStr[i] != pWord[k])// Если буквы не совпадают, то перестаём сравнивать и возвращаемся к первой букве иначе

bFlag = false; // Иначе переходим к следующей букве
k=0;
}
else
k++;

if (bFlag == false)// Eсли перестали сравнивать, то переходим к пробелу и продолжаем сравнивать со следующего символа
{
(cStr [i]== ' ');
i++;
continue;
}


if (k == iWord + 1)// Если сравнили последнюю букву в слове, а строка ещё не закончилась, то увеличиваем счётчик

// переходим снова к первой букве и начинаем сравнивать дальше
{
if (i != iStr)


iRes++;
k=0;
bFlag = false;
}

}
return iRes;
}

void CopyWord(char* сStr, int iStr, char* pWord, int iWord)
{int k=0;
for (int i=0; i < iStr; i++)// Пробегаем по символам слов

{for (int k=0; k < iWord; k++)
сStr[i] = pWord[k];
if (k == iWord+1)
{
k=0;
i++;
continue;
}

}
}

//Бежим по двум массивам. Присваиваем слово массиву. Если присвоили последнюю букву слова,
//то снова начинаем присваивать уже следующее слово.

char Menu()
//Выводит меню на экран, возвращает выбранный пункт меню
{
char c;
cout << "1. Ввод предложения "<<endl;
cout << "2. Найти слова"<<endl;
cout << "3. Вывести результат"<<endl;
cout << "4. Выход"<<endl;
cout << "Выбрать пункт: ";
cin >> c;

return c;
}
Ktulu вне форума Ответить с цитированием
Старый 22.12.2010, 17:44   #2
Ktulu
 
Регистрация: 22.12.2010
Сообщений: 5
По умолчанию

продолжение кода:
Цитата:
int main()
{
setlocale(LC_ALL, "Russian");

char cPkt = '0';

int iResword;
int iDoubleWord;
char cString[255];
memset(cString,0,255*sizeof(char));
char cStringCopy[255];
memset(cStringCopy,0,255*sizeof(cha r));


while (cPkt != '4')
{
switch(cPkt)
{
case '1':
{
cout << "Введите предложение: ";
cin >> cString;
cout << "Введите число удаляемых одинаковых слов: ";
cin >> iResword;
cin.sync();// Очищаем поток от лишних символов
cin.clear();
cin.getline(cString,255);
cPkt = '0';
break;

}
case '2':
{ //Посчитать количество слов
int iStrLen = GetLenStr(cString); // Длина строки
int iCountWord = GetWordAmount(cString,iStrLen); // Текущее слово
int iWord = 0;
char* pWord = 0;

//Сравнить слова. Найти одинаковые слова. Запомнить их.
for (int i=0; i < iCountWord; i++) // Если символ

{
GetWord(cString,iStrLen,pWord,iWord );// Получить слово

int iDoubleWord = FindWords(cString,iCountWord,pWord, iWord); // Ищем повторяющиеся слова
{
if (iDoubleWord != iResword)// Если количество раз, которое слово встретилось в строке не совпадает с заданым
CopyWord(cStringCopy, iStrLen, pWord, iWord); // То копируем слово во второй массив

}


}

cPkt = '0';
break;
}
case '3':
{
// Одинаковые слова удалить
int iStrLen = GetLenStr(cString); // Длина строки
int iWord = 0;
char* pWord = 0;

CopyWord(cStringCopy, iStrLen, pWord, iWord);
cout << "Отредактированное предложение: "<< CopyWord <<endl;
cPkt = '0';
break;
}
case '4':
{

break;
}
default:
{
cPkt = Menu();
break;
}
}

}
return 0;

}
Ktulu вне форума Ответить с цитированием
Старый 24.12.2010, 07:52   #3
Ktulu
 
Регистрация: 22.12.2010
Сообщений: 5
По умолчанию

Извините, конечно, но пожалуйста, кто-нибудь обратите внимание на задачу и помогите с решением, доделывать вроде бы осталось не так уж много, но я не знаю как.
Ktulu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по массивам С++ Valera24 Помощь студентам 8 22.12.2010 21:23
Задача по массивам) Flo Помощь студентам 1 30.11.2010 22:09
Вопрос по символьным массивам. Как улучшить код. Aerial Общие вопросы C/C++ 4 13.04.2010 10:54
Задача по массивам в си amerhant Помощь студентам 2 08.11.2009 22:17
задача по массивам с++ nurai Общие вопросы C/C++ 6 28.10.2009 13:22