URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7257
[ Назад ]

Исходное сообщение
"Учебная задача по С++"

Отправлено Dmitriy , 14-Мрт-08 14:44 
Приветствую всех!

не пинайте сильно если глупости спрошу, начал С++ изучать столкнулся с непонятностями.
подскажите пожалуйста можно ли строку состоящую из нескольких слов, разделённых запятыми или побелами, введённую с помощью gets разбить на отдельные слова и сохранить эти слова в разнве переменные для последующего анализа например на предмет наличия слов не содержащих гласных букв: если можно то какими функциями и из какого пакета?

и вотрой вопрос - есть шаблон структуры "Государство - наименование, столица, численность и площадь" - написал свою функцию для формирования экземпляра структуры что бы очередной экземпляр вносился при помощи этой функции

int i;
struct empire{char name[],capital[]; int public,area;}
empire str[];

for (i=0;i<10;++i){
str[i]=state(i)
}

char state(i){
cout << "ввести название"; cin >> str[i].name;
cout << "ввести столицу"; cin >> str[i].capital;
cout << "ввести население"; cin >> str[i].public;
cout << "ввести площадь"; cin >> str[i].area;
return ХЗ
}  

собственно вопрос в том как вернуть из подпрограммы все эти значения для одного экземпляра структуры, т.е. умеет ли return возвращать одновременно нескеолько значений?


Содержание

Сообщения в этом обсуждении
"Учебная задача по С++"
Отправлено anonymous , 14-Мрт-08 14:54 
Основная проблема у тебя на текущий момент -- абсолютное непонимание того, что такое указатель, как и кем выделяется память, и как работают строки в Си.  Возьми обычного Кернигана и Ритчи "Язык программирования Си" и прочитай там главу про указатели.  Потом снова посмотришь на свой код.

"Учебная задача по С++"
Отправлено anonymous , 14-Мрт-08 14:56 
Да, и ещё: если сразу захотел изучить C++ "наскоком", то не выйдет.  Лучше изучи сначала чистый Си.  При регулярной ежедневной работе по тому же Кернигану и Ритчи это займёт максимум три-четыре недели.

"Учебная задача по С++"
Отправлено primus , 14-Мрт-08 15:36 
>>Лучше изучи сначала чистый Си.  

Ни в коем разе.
Только чистый С++.


"Учебная задача по С++"
Отправлено anonymous , 14-Мрт-08 17:29 
>>>Лучше изучи сначала чистый Си.  
>
>Ни в коем разе.
>Только чистый С++.

Почему же вдруг?  Хотя наверное знаю: редко в какой книге будет написано, что C++ это не Си, и тут думать надо по-другому...

Но извините, если не понимать указателей, то в C++ по-любому рано ещё.


"Учебная задача по С++"
Отправлено DeadMustdie , 18-Мрт-08 21:38 
>Но извините, если не понимать указателей, то в C++ по-любому рано ещё.

Изучение чистого C крайне вредит пониманию C++.
Хотя изучать C++ как первый язык программирования очень непросто.


"Учебная задача по С++"
Отправлено anonymous , 18-Мрт-08 23:01 
>>Но извините, если не понимать указателей, то в C++ по-любому рано ещё.
>
>Изучение чистого C крайне вредит пониманию C++.

Только при условии, что преподаватель забьёт на всё не будет говорить "а вот так в C++ не делают, есть вот такие-то и такие-то средства".  Хотя это настолько часто встречается... Учат писать на C++ в процедурном стиле, причём из C++'ных возможностей используют только cin и cout.

В принципе, с таким же успехом можно говорить что изучение паскаля вредит пониманию ООП.  Главное чтобы преподаватель акцентировал внимание на том, что C++ это не просто Си со свистелками в виде классов, это другой язык.  Похож только синтаксис.

>Хотя изучать C++ как первый язык программирования очень непросто.

Согласен.  А Си очень важен для понимания принципов работы машины.  Те же указатели.  Строки.  Память.  Автоматические и глобальные переменные.


"Учебная задача по С++"
Отправлено phpcoder , 14-Мрт-08 15:04 
[...]
>подскажите пожалуйста можно ли строку состоящую из нескольких слов, разделённых запятыми или
>побелами, введённую с помощью gets разбить на отдельные слова и сохранить

Можно. Для этого используйте ф-ции типа find() и в вектор добавляйте. (В Java, кажется, для этого есть что-то готовое..)

И это, забудьте про gets(), он, во-первых, дырявый, во-вторых, он для Си, а не для С++.

[...]
>собственно вопрос в том как вернуть из подпрограммы все эти значения для
>одного экземпляра структуры [...]

- Возвращайте из ф-ции указатель
- используйте std::string вместо char arr[]
- используйту getline() для считывания строк из стандартного ввода



"Учебная задача по С++"
Отправлено Dmitriy , 14-Мрт-08 16:14 
toanonymous
K&R нету и быстро взять негде, но есть С.Прата там нужного примера нету но что то близкое к тому есть. Да просто С тоже пытаюсь поднять.

toprimus
а почему только С++?
тут вроде как в школе учат что С++ это надстройка над С с возможностью объектного программирования + несколько функций добавлено
или обманывают?

tophpcoder
пасибо большое,

т.е. получается без указателей задача не решается?
да кстати вместо gets нельзя ничего использовать в противном случае эта учебная задача будет считаться решённой неверно :( c gets - пока глухо получается
а с указателями будет примерно так?

int i;
struct empire{char name[],capital[]; int public,area;}
empire str[10];
char p=&str[10];

for (i=0;i<10;++i){
str[i]=state(char *p,int i)
}
char state(char *p,int i){
cout << "ввести название"; cin >> *(p+i).name;
cout << "ввести столицу"; cin >> *(p+i).capital;
cout << "ввести население"; cin >> *(p+i).public;
cout << "ввести площадь"; cin >> *(p+i).area;
}  


"Учебная задача по С++"
Отправлено phpcoder , 14-Мрт-08 16:27 
[...]
>тут вроде как в школе учат что С++ это надстройка над С
>с возможностью объектного программирования + несколько функций добавлено
>или обманывают?

Многие так и пишут и даже так думают. Это уже давно не так.

[...]
>т.е. получается без указателей задача не решается?

Как правило, нет. Можно выделять память в куче (с помощью new) и возвращать этот указатель (и потом не забыть вызвать delete для него). Либо возвращать указатель на статически выделенную память. Либо передать указатель в ф-цию и она уже будет сразу создавать где надо. Либо.. можно, кажется, вернуть прям так структуру. Но так почти никто не делает, чтобы стек не раздувать.

>да кстати вместо gets нельзя ничего использовать в противном случае эта учебная
>задача будет считаться решённой неверно :(

BUGS
       Never  use  gets().   Because it is impossible to tell without knowing the data in
       advance how many characters gets() will read, and because gets() will continue  to
       store characters past the end of the buffer, it is extremely dangerous to use.  It
       has been used to break computer security.  Use fgets() instead.

И вообще: "LSB deprecates gets()."

>получается
>а с указателями будет примерно так?
>
>int i;
>struct empire{char name[],capital[]; int public,area;}

Почему не используете std::string вместо массивов?

Ладно, раз уж хотите их использовать (Я ПРЕДУПРЕЖДАЛ!), так используйте правильно:

char name[] <-- это что? Кто будет размерность указывать?!


>char p=&str[10];

char p -- это вы создали один символ.

Кроме того, не надо обращаться к str[10] -- такого элемента нет. ЭТО ОШИБКА! Последний элемент имеет индекс 9!

>for (i=0;i<10;++i){
>str[i]=state(char *p,int i)
>}
>char state(char *p,int i){
>cout << "ввести название"; cin >> *(p+i).name;
>cout << "ввести столицу"; cin >> *(p+i).capital;
>cout << "ввести население"; cin >> *(p+i).public;
>cout << "ввести площадь"; cin >> *(p+i).area;
>}

Таааак. Вы это хотя бы компилировать пробовали?! Тут ошибка на ошибке...

И вместо *(p+i) пишите p[i] для удобства чтения кода.


"Учебная задача по С++"
Отправлено anonymous , 14-Мрт-08 17:37 
>toanonymous
>K&R нету и быстро взять негде, но есть С.Прата там нужного примера
>нету но что то близкое к тому есть. Да просто С
>тоже пытаюсь поднять.

Да простят меня все присутствующие.  Держи книгу: http://rapidshare.com/files/99483248/kr.zip.html

>а почему только С++?
>тут вроде как в школе учат что С++ это надстройка над С
>с возможностью объектного программирования + несколько функций добавлено
>или обманывают?

Абсолютно неверно.  В C++ совершенно по-другому нужно думать, так как доступен новый набор средств.  Код на Си скомпилируется компилятором C++, но он *никогда* не станет настоящим кодом на C++ только из-за использования cin и cout.  То, что хорошо в Си, решается другими методами в C++.  Но вот общие концепции, такие как указатель, глобальные/статические/автоматические/динамические (из кучи) переменные -- общие.  И их проще всего понять в Си.  Это просто о том, как работает машина.


"Учебная задача по С++"
Отправлено Dmitriy , 14-Мрт-08 19:58 
пасибо всем - углубился в чтение :)

"Учебная задача по С++"
Отправлено Андрей , 14-Мрт-08 20:22 
И если уж C++ то можно и наверно нужно использовать ссылку (reference) вместо указателя (pointer)


"Учебная задача по С++"
Отправлено freewin , 16-Мрт-08 22:23 
Можно описать структуру как тип