Консультация № 174551
26.11.2009, 08:46
0.00 руб.
0 15 1
Уважаемые эксперты,прошу вашей помощи в решении задачи.
Задание:Дан текст из нескольких строк.Необходимо найти в строке (номер строки вводится пользователем) самое длинное слово.Найденное слово необходимо вернуть в главную функцию.
Условия: Первое окно программы содержит меню, предлагающее выбрать одно из возможных действий. Среди этих действий должны присутствовать:
• ввод текста,
• вывод текста,
• выход из программы,
• а также действия, определяемые вариантом.

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


Приложение:
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
char** VvodStrok(int N,int S);
char** VivodStrok(int N,char**Mas);
char* ModStrok(int N,int S,char**Mas,int n);
main()//(int argc, char* argv[])
{
int N,n,S;
char**text,T,*link;

M2:cout<<"a.VVOD STROK"<<endl;
cout<<"b.MODIFIKACIY STROK"<<endl;
cout<<"c.VIVOD STROK"<<endl;
cout<<"d.VIVOD MODIFIKACIY STROKi"<<endl;
cout<<"e.VIXOD IZ PROGRAMMI"<<endl;
cout<<endl;
cout<<"viberrite deistvie ";cin>>T;

if((int)T==97)
{ clrscr();printf("vvedite kollichestvo strok = ");
cin>>N;
printf("vvedite kollichestvo elementov v stroke = ");
cin>>S;
puts ("Vvedite stroki:");
text=VvodStrok(N,S);clrscr();goto M2;}else
if((int)T==98)
{clrscr();
printf("vvedite nomer stroki dly modifikacii = ");
cin>>n;
link=ModStrok(N,S,text,n);clrscr();goto M2;}else
if((int)T==99)
{clrscr();
VivodStrok(N,text); getch();clrscr();goto M2;}else
if((int)T==101){goto M1;}else
if((int)T==100){clrscr();
puts(link); getch();clrscr();goto M2;}

getch();

M1:return 0;
}

char** VvodStrok(int N,int S)
{
char **Mas;
int i;
Mas=new char*[N];
for(i=0;i<N;i++)
Mas[i]=new char[S];
for(i=0;i<N;i++)
gets(Mas[i]);
return Mas;
}

char** VivodStrok (int N,char**Mas)
{
for(int i=0;i<N;i++)
puts (Mas[i]);
}

char* ModStrok(int N,int S,char**Mas,int n)\\вот сдесь я застрял.нужно найти самое длинное слово в массиве.
{
char**v;
int i;
n--;
v=new char*[N];
for(i=0;i<N;i++)
v[i]=new char[S];
for(i=0;i<N;i++) {
if(n==i)
{
v[i]=Mas[i];
return Mas[n];
}
}
return 0;
}

Обсуждение

Неизвестный
26.11.2009, 10:29
общий
Jekaiseburga:
Все функции, в том числе и работы со строками, должны быть разработаны самостоятельно

Что это значит? Например Вы используете функции printf(),puts(),gets(),getch() и др.
Неизвестный
26.11.2009, 11:01
общий
точнее будет звучать так:функции отыскания максимального слова в указанной пользователем строке.
Неизвестный
26.11.2009, 11:25
общий
Jekaiseburga:
Так таких стандартных функций и нет
Неизвестный
26.11.2009, 11:37
общий
Извиняюсь, что ввел в заблуждение.
Вот полный текст задания.
Целью данной лабораторной работы является создание модульных программ с помощью языка Си++. Программа, созданная в ходе выполнения задания должна содержать несколько функций (как минимум три: функция, заполняющая массив, содержащий исходный текст, функция вывода исход-ного текста на экран, функция, выполняющая обработку массива в соответ-ствии со своим вариантом задания).
Кроме того, нужно уделить внимание возможностям передачи данных в функции. При разработке программы не следует использовать глобальные переменные, все необходимые данные должны передаваться в функции через параметры.
2. Требования к программе
Первое окно программы содержит меню, предлагающее выбрать одно из возможных действий. Среди этих действий должны присутствовать:
• ввод текста,
• вывод текста,
• выход из программы,
• а также действия, определяемые вариантом.

Все функции, в том числе и работы со строками, должны быть разработаны самостоятельно (т.е. не использовать стандартных функций работы со стро-ками из библиотек языка Си). Массив, содержащий исходный текст, должен передаваться в функции через параметры
Неизвестный
26.11.2009, 12:04
общий
Jekaiseburga:
Давайте я Вам выложу как это все можно сделать при помощи STL, а Вы сами определите потом, что самостоятельно, а что нет.
Неизвестный
26.11.2009, 12:22
общий
это ответ
Здравствуйте, Jekaiseburga.
Так это можно сделать при помощи STL. Microsoft Visual C++/Visual Studio 2008.
Самое главное прокомментировано.
Программа.
Код:
#include <iostream>
#include <iomanip>
#include <valarray>
#include <locale>
#include <limits>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

// Тип - вектор для хранения строк
typedef vector<wstring> string_vector;

int menu();
void addStrings(string_vector& strings);
void showStrings(const wstring& message,const string_vector& strings);
void findMaxWord(const string_vector& strings);

int main()
{
locale::global(locale("russian_russia.866"));
string_vector strings;
while(true)
{
switch(menu())
{
case 0:
return 0;
case 1:
addStrings(strings);
break;
case 2:
showStrings(L"Имеются следующие строки:",strings);
break;
case 3:
findMaxWord(strings);
break;
}
}
return 0;
}

// Выводит меню
int menu()
{
while(true)
{
wcout<<L"Сделайте свой выбор:"<<endl
<<L"1 - Добавление строк"<<endl
<<L"2 - Показать строки"<<endl
<<L"3 - Поиск самого длинного слова в строке"<<endl
<<L"0 - Выход"<<endl;
wint_t choice=_getwche();
wcout<<endl;
switch(choice)
{
case L'0':
case L'1':
case L'2':
case L'3':
return choice-L'0';
default:
wcout<<L"Будьте внимательней"<<endl;
}
}
}

// Добавляет строки к вектору
void addStrings(string_vector& strings)
{
wcout<<L"Вводите строки(пустая строка для завершения):"<<endl;
while(true)
{
wstring str;
getline(wcin,str);
if(str.empty())
{
return;
}
strings.push_back(str);
}
}

// Выводит строки на stdout
void showStrings(const wstring& message,const string_vector& strings)
{
wcout<<message<<endl;
string_vector::size_type i=0,size=strings.size();
streamsize width=static_cast<streamsize>(log10(static_cast<double>(size))+1);
while(i<size)
{
wcout<<setw(width)<<i+1<<L" - ""<<strings[i]<<L'"'<<endl;
++i;
}
}

// Ищет все слова с максимальной длиной в строке
string_vector maxWord(const wstring& str)
{
// Результат будет здесь
string_vector result;

// Итераторы на начало и конец
wstring::const_iterator it=str.begin(),end=str.end();

// Найденная максимальная длина слова
wstring::size_type maxLength=0;

// Этот адаптер для того, чтоб использовать функцию iswspace() в качестве предиката
static pointer_to_unary_function<wint_t,int> wsPredicate=ptr_fun(iswspace);

// Пока не конец строки
while(it!=end)
{
// Ищем начало слова
wstring::const_iterator beginWord=find_if(it,end,not1(wsPredicate));
// Ищем конец слова
wstring::const_iterator endWord=find_if(beginWord,end,wsPredicate);

// Если не пусто
if(beginWord!=endWord)
{
// Наше слово
wstring word(beginWord,endWord);
// Его длина
wstring::size_type wordSize=word.size();
// Если нашли более длинное
if(wordSize>maxLength)
{
// Очистим результат
result.clear();
// И установим новую длину
maxLength=wordSize;
}
// Если нашли с такой же длиной
if(wordSize==maxLength)
{
// Сохраним
result.push_back(word);
}
}
it=endWord;
}
return result;
}

// Ищет максимальное слово в заданной строке
void findMaxWord(const string_vector& strings)
{
string_vector::size_type size=strings.size();
if(!size)
{
wcout<<L"Список пуст"<<endl;
return;
}
string_vector::size_type strNo;
wcout<<L"Введите номер строки:";
wcin>>strNo;
if(wcin.fail())
{
wcout<<L"Неверный ввод"<<endl;
wcin.clear();
wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
return;
}
wcin.ignore(numeric_limits<streamsize>::max(),L'\n');
if(strNo>0 && strNo<size+1)
{
string_vector words=maxWord(strings[strNo-1]);
if(words.size())
{
showStrings(L"Найдены следующие слова(слово) с максимальной длиной:",words);
}
else
{
wcout<<L"Нет слов в выбранной строке"<<endl;
}
return;
}
else
{
wcout<<L"Неверный номер строки"<<endl;
}
}

Пример работы:
Код:
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
1
Вводите строки(пустая строка для завершения):
Как известно, с одним оператором try
можно связывать несколько операторов catch.
Именно такой вариант используется чаще всего.
Однако каждый оператор catch должен перехватывать
отдельный тип исключительной ситуации

Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
2
Имеются следующие строки:
1 - "Как известно, с одним оператором try"
2 - "можно связывать несколько операторов catch."
3 - "Именно такой вариант используется чаще всего."
4 - "Однако каждый оператор catch должен перехватывать
5 - "отдельный тип исключительной ситуации"
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
3
Введите номер строки:1
Найдены следующие слова(слово) с максимальной длиной:
1 - "оператором"
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
3
Введите номер строки:2
Найдены следующие слова(слово) с максимальной длиной:
1 - "операторов"
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
3
Введите номер строки:3
Найдены следующие слова(слово) с максимальной длиной:
1 - "используется"
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
4
Будьте внимательней
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
3
Введите номер строки:4
Найдены следующие слова(слово) с максимальной длиной:
1 - "перехватывать"
Сделайте свой выбор:
1 - Добавление строк
2 - Показать строки
3 - Поиск самого длинного слова в строке
0 - Выход
3
Введите номер строки:5
Найдены следующие слова(слово) с максимальной длиной:
1 - "исключительной"


По Вашей просьбе добавил пример без STL.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

struct string_array
{
char** data;
size_t count;
string_array()
:data(0)
,count(0)
{}
};

int menu();
void addStrings(string_array& strings);
void showStrings(const char* const message,const string_array& strings);
void findMaxWord(const string_array& strings);
void delArray(string_array& strings);

int main()
{
setlocale(LC_ALL,"russian");

string_array strings;

while(true)
{
switch(menu())
{
case 0:
delArray(strings);
return 0;
case 1:
addStrings(strings);
break;
case 2:
showStrings("Имеются следующие строки:",strings);
break;
case 3:
findMaxWord(strings);
break;
}
}
return 0;
}

int menu()
{
while(true)
{
printf("Сделайте свой выбор:\n"\
"1 - Добавление строк\n"\
"2 - Показать строки\n"\
"3 - Поиск самого длинного слова в строке\n"\
"0 - Выход\n"\
":");
int choice=_getche();
printf("\n");
switch(choice)
{
case '0':
case '1':
case '2':
case '3':
return choice-'0';
default:
printf("Будьте внимательней\n");
}
}

}

#pragma warning(disable:4996 4800)

void getString(char** str)
{
char* result=0;
const size_t BufferSize=512;
char buffer[BufferSize];
bool not_eos=true;
while(not_eos)
{
char* ptr=fgets(buffer,BufferSize,stdin);
if(ptr)
{
size_t len=strlen(ptr);
if(!(not_eos=ptr[len-1]!='\n'))
{
ptr[len-1]='\0';
--len;
}
if(result)
{
len+=strlen(result)+1;
char* newPtr=(char*)realloc(result,len);
if(newPtr)
{
result=newPtr;
strcat(result,ptr);
}
else
{
printf("Невозможно выделить память\n");
return;
}
}
else
{
result=(char*)malloc(len+1);
if(result)
{
strcpy(result,ptr);
}
else
{
printf("Невозможно выделить память\n");
return;
}
}

}
else
{
printf("Ошибка ввода");
return;
}
}
*str=result;
}

void addStrings(string_array& strings)
{
printf("Вводите строки(пустая строка для завершения):\n");
while(true)
{
char* str=0;
getString(&str);
if(!(str && strlen(str)))
{
return;
}
size_t newSize=strings.count+1;
char** newPtr;
if(strings.data)
{
newPtr=(char**)realloc(strings.data,sizeof(char**)*newSize);
}
else
{
newPtr=(char**)malloc(sizeof(char**)*newSize);
}
if(newPtr)
{
strings.data=newPtr;
strings.count=newSize;
strings.data[newSize-1]=str;
}
else
{
printf("Невозможно выделить память\n");
}
}
}

void showStrings(const char* const message,const string_array& strings)
{
printf("%s\n",message);
char* const* const dataPtr=strings.data;
char* const* const end=dataPtr+strings.count;
size_t width=strings.count?(size_t)log10((double)strings.count)+1:0;
for(size_t i=0;i<strings.count;++i)
{
printf("%*u - "%s"\n",width,i+1,strings.data[i]);
}
}

void delArray(string_array& strings)
{
if(strings.data)
{
for(size_t i=0;i<strings.count;++i)
{
free(strings.data[i]);
}
free(strings.data);
strings.data=0;
strings.count=0;
}
}

const char* find_if(const char* it,bool (predicate)(char))
{
if(it)
{
while(*it && !predicate(*it))
{
++it;
}
}
return it;
}

bool isNotWS(char ch)
{
return !isspace(ch);
}

bool isWS(char ch)
{
return isspace(ch);
}

void findMaxWord(const string_array& strings)
{
if(!strings.count)
{
printf("Нет строк\n");
return;
}
size_t numStr;
printf("Введите номер строки:");
scanf("%u",&numStr);
if(--numStr<strings.count)
{
size_t maxLength=0;
const char* pos=0;
const char* ch=strings.data[numStr];
while(*ch)
{
const char* beginWord=find_if(ch,isNotWS);
const char* endWord=find_if(beginWord,isWS);
if(beginWord!=endWord)
{
size_t wordSize=endWord-beginWord;
if(wordSize>maxLength)
{
maxLength=wordSize;
pos=beginWord;
}
}
ch=endWord;
}
if(pos)
{
printf("Самое длинное слово:");
for(size_t i=0;i<maxLength;++i)
{
putch(pos[i]);
}
printf("\n");
}
else
{
printf("Слов нет\n");
}
}
else
{
printf("Нет такой строки\n");
}
}
5
Неизвестный
26.11.2009, 12:45
общий
Micren:
Все конечно замечательно.Но есть одно НО:STL мы не изучали,преподаватель просто сразу поймет, и сдать лабу будет просто не возможно.тем более, что сам преподаватель сказал писать ее с помощью динамического массива.Какое-то начало программы я написал, а на поиске застрял.Буду признателен, если вы сможете модифицировать мою программы, как вы сделали с работой над списками, которая была спешно защищена.
Неизвестный
26.11.2009, 19:03
общий
Jekaiseburga:
Я, конечно, могу переписать без использования STL. Но это не значит, что программа по стилю будет похожа на Вашу. Править же эту Вашу программу не вижу смысла. Т.к. она написана неважнецки и ее лучше переписать заново.
Неизвестный
26.11.2009, 20:20
общий
Micren:
Ну чтож.Перепешите, если возможно,пожалуйста.Очень нужно.последняя работа.
Неизвестный
26.11.2009, 23:44
общий
Jekaiseburga:
А классы Вы изучали? Шаблоны?
Неизвестный
26.11.2009, 23:49
общий
нет, я вообще не программист.что знаю, я уже продемонстрировал.и в основном мы программируем в турбо си++,или борланд си++.
Неизвестный
27.11.2009, 19:35
общий
я так понимаю, что программу без классов и шаблонов написать невозможно?
Неизвестный
27.11.2009, 21:49
общий
Jekaiseburga:
В ответ добавил пример без STL.

я так понимаю, что программу без классов и шаблонов написать невозможно?

Как видите возможно, но так уже никто не пишет.
Неизвестный
27.11.2009, 22:06
общий
Спасибо.
Неизвестный
27.11.2009, 22:21
общий
Micren:
Скажите а в WinAPI программируете?Среда Borland C++ Builder.
Форма ответа