|
|
|
| char text;
cout<<"Vvedite text="<<endl;cin>>text;
Как подсчиат все слова в этом тексте и найти максимальное?
} | |
|
|
|
|
|
|
|
для: ols
(26.03.2007 в 13:37)
| | используй функцию strtok | |
|
|
|
|
|
|
|
для: ols
(26.03.2007 в 13:37)
| | Под максимальным что имеется в виду? Содержащий наибольшее количество символов? | |
|
|
|
|
|
|
|
для: cheops
(26.03.2007 в 21:12)
| | Например дана строка, содержащая текст:
programmirovanie, eto estj nechto klassnoe
|
Так вот, необходимо найти в этой строке слово, которое содержит максимальное кол-во элементов, и соответственно слово, которое содержит минимальное кол-во символов, ну или букв иными словами.
Может использовать for, который увеличивает на каждый символ слова и сбрасывает его при обнаружении пробела. | |
|
|
|
|
|
|
|
для: ols
(27.03.2007 в 20:21)
| | Вот, весьма эффективное решение:
#include <stdio.h>
#include <limits.h>
inline bool IsDelimiter(char c)
{
return c==' ' || c==',';
}
void FindMinMax(const char *str, char *maxword, char *minword)
{
const char *maxp=0, *minp=0; // pointers to max and min words inside input str
int maxlen=0, minlen=INT_MAX; // length of max and min words
while (*str)
{
// skip delimiters
while (IsDelimiter(*str)) str++;
// get current word
const char *p=str; // ptr to current word
int n=0; // number of letters in current word
while (*str && !IsDelimiter(*str)) {str++; n++;}
// compare with max and min
if (n>maxlen) {maxlen=n; maxp=p;}
if (n<minlen) {minlen=n; minp=p;}
}
// copy max and min words to output buffers
for (; maxlen; maxlen--) *maxword++ = *maxp++;
*maxword = 0;
if (minlen != INT_MAX) for (; minlen; minlen--) *minword++ = *minp++;
*minword = 0;
}
int main(int argc, char **argv)
{
char *string = "programmirovanie, eto estj nechto klassnoe";
char maxword[100], minword[100];
FindMinMax(string, maxword, minword);
printf("max: %s\n", maxword);
printf("min: %s\n", minword);
}
|
| |
|
|
|
|
|
|
|
для: oleg_alexeev
(27.03.2007 в 22:30)
| | а зачем тут выводит с форматным выводом???
у меня ошибку выдает.
эти строчки
printf("max: %s\n", maxword);
printf("min: %s\n", minword);
|
выдают такую ошибку
C:\Program Files\Microsoft Visual Studio\MyProjects\nbnvb\nvvbvb.cpp(45) : error C2065: 'printf' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\MyProjects\nbnvb\nvvbvb.cpp(48) : warning C4508: 'main' : function should return a value; 'void' return type assumed
Error executing cl.exe.
|
я вот так сделал:
cout<<"Maksimalnoe slovo="<<maxword<<endl;
cout<<"Minimalnoe slovo="<<minword<<endl;
|
и нармально работает.
p.s. А чем форматный вывод отличается? так и не пойму | |
|
|
|
|
|
|
|
для: ols
(31.03.2007 в 00:56)
| | а как теперь можно сделать так чтобы для указателя char *string можно было задать значение с клавиатры? | |
|
|
|
|
|
|
|
для: ols
(31.03.2007 в 01:36)
| | Для этого удобно воспользоваться функцией fgets() из библиотеки <stdio>
#include <stdio>
#include <iostream>
using namespace std;
int main()
{
char input[80];
int number = 0;
cout << "Введите строку " << endl;
fgets(input, 80, stdin);
while(input[number++]);
cout << "Строка содержит " << number << " символов " << endl;
return 0;
}
|
| |
|
|
|
|
|
|
|
для: ols
(31.03.2007 в 00:56)
| | Чтобы компилятор не ругался на функцию printf надо включить её объявление:
>> p.s. А чем форматный вывод отличается? так и не пойму
printf входит в набор стандартных библиотечных функций языка С. С++ включает в себя С вместе с его стандартными функциями, поэтому в С++ можно пользоваться как объектно-ориентированным вводом-выводом, так и обычным, основанным на функциях. Набор возможностей одного и другого способа одинаков, разный только стиль написания программы.
Кстати я написал этот пример в стиле С. От языка С++ там только тип bool. Если писать в стиле С++, то кроме замены printf на cout надо бы вместо буферов для строк использовать класс std::string. | |
|
|
|
|
|
|
|
для: oleg_alexeev
(31.03.2007 в 17:37)
| | Хм, что-то не получается внедирить код cheopsa в код oleg'a_alexeev'a. Помогите пожалуйста. Еще несовсем ясно
Это объявления тип'а переменной? | |
|
|
|
|
|
|
|
для: ols
(01.04.2007 в 15:43)
| | Что вызывает затруднение? Прикрепите к сообщению архив с тем, что у вас сейчас имеется? | |
|
|
|
|
|
|
|
для: cheops
(01.04.2007 в 16:36)
| | Затруднение с указателем *string.
int main(int argc, char **argv)
{
char *string = "programmirovanie, eto estj nechto klassnoe";
char maxword[100], minword[100];
FindMinMax(string, maxword, minword);
printf("max: %s\n", maxword);
printf("min: %s\n", minword);
}
|
Тоесть в данном случае здесь уже задано в программе значение - char *string = "programmirovanie, eto estj nechto klassnoe";
|
Я пытался зделать так, чтобы текст (к примеру - programmirovanie, eto estj nechto klassnoe) можно было ввести с клавиатуры. а затем уже далее ясно - программа выводит слово с минимальным и макситмальным значением:
cout<<"Vvedite text="<<endl;cin>>*string;
|
и в общем случае изменил код вот так:
[/codint main(int argc, char **argv)
{
char *string;
cout<<"Vvedite text="<<endl;cin>>*string;
char maxword[100], minword[100];
FindMinMax(string, maxword, minword);
printf("max: %s\n", maxword);
printf("min: %s\n", minword);
}
|
Но видимо так нельзя делать, простите, наверное грубая ошибка. | |
|
|
|
|
|
|
|
для: cheops
(01.04.2007 в 16:36)
| | Затруднение с указателем *string.
int main(int argc, char **argv)
{
char *string = "programmirovanie, eto estj nechto klassnoe";
char maxword[100], minword[100];
FindMinMax(string, maxword, minword);
printf("max: %s\n", maxword);
printf("min: %s\n", minword);
}
|
Тоесть в данном случае здесь уже задано в программе значение - char *string = "programmirovanie, eto estj nechto klassnoe";
|
Я пытался зделать так, чтобы текст (к примеру - programmirovanie, eto estj nechto klassnoe) можно было ввести с клавиатуры. а затем уже далее ясно - программа выводит слово с минимальным и макситмальным значением:
cout<<"Vvedite text="<<endl;cin>>*string;
|
и в общем случае изменил код вот так:
[/codint main(int argc, char **argv)
{
char *string;
cout<<"Vvedite text="<<endl;cin>>*string;
char maxword[100], minword[100];
FindMinMax(string, maxword, minword);
printf("max: %s\n", maxword);
printf("min: %s\n", minword);
}
|
Но видимо так нельзя делать, простите, наверное грубая ошибка. | |
|
|
|
|
|
|
|
для: ols
(01.04.2007 в 16:50)
| |
действительно не объявление переменной. В С++ имеются так называемые пространства имен. Они придуманы для решения проблемы конфликта имен переменных и функций в больших проектах, где в программу включаются десятки заголовочных файлов и есть большая вероятность, что имена могут совпасть. У пространства имен есть свое имя, например std - это пространство имен стандартной библиотеки С++. Есть еще безымянное пространство имен для совместимости с Си. Как это работает?
обычное объявление
объявляет функцию в глобальном пространстве имен, а
namespace my
{
void MyFunc();
}
|
объявляет функцию в пространстве имен my.
Для вызова этих функций надо писать
MyFunc(); // для вызова первой
::MyFunc(); // для вызова первой
my::MyFunc(); // для вызова второй
|
Директива using позволяет использовать имена из некоторого пространства имен не приписывая к ним имя пространства имен, т.е. писать cout вместо std::cout
Для ввода текста с клавиатуры можно написать еще и так:
char string[256];
cout << "Vvedite text: ";
cin >> string;
|
| |
|
|
|
|
|
|
|
для: oleg_alexeev
(02.04.2007 в 09:12)
| |
256 в даенном случае это кол-во символов допустимых? | |
|
|
|
|
|
|
|
для: ols
(02.04.2007 в 11:38)
| | Да. Если пользователь введет больше, программа аварийно завершится. | |
|
|
|
|
|
|
|
для: oleg_alexeev
(02.04.2007 в 11:42)
| | 255. Если пользователь введет больше, поведение программы перестанет быть предсказуемым. | |
|
|
|