Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: renesans в May 22, 2010, 19:38



Титла: Грешка в С++ програма.
Публикувано от: renesans в May 22, 2010, 19:38
Ето го кода:
Код
GeSHi (C++):
  1. struct infoSastezateli {
  2.  
  3.        unsigned int nomer;
  4.        string ime;
  5.  
  6.        int postijenie;
  7.        string darjava;
  8.  
  9.  
  10.  
  11. };
  12.  
  13. int vavejdane()
  14. {
  15.        int i;
  16.        cout<<"Въведете броя на състезателите: "; cin>>i;
  17.                struct infoSastezateli sastezatel[i];
  18.  
  19.                for(int br=0; br<i; br++ )
  20.                {
  21.                     cout<<"Въведете номер на състезателя: ";cin>>sastezatel[br].nomer;
  22.                     cout<<"Въведете име и фамилия на състезателя: ";cin>>sastezatel[br].ime;
  23.                     cout<<"Въведете постижение на състезателя: ";cin>>sastezatel[br].postijenie;
  24.                     cout<<"Въведете държава на състезателя: ";cin>>sastezatel[br].darjava;
  25.  
  26.  
  27.                }
  28.  
  29.                for(int br=0; br<i; br++ )
  30.                {
  31.                     cout<<sastezatel[br].nomer<<endl;
  32.                }
  33. }


Обаче при опит да въведа Име и Фамилия между които има шпация нещата стават много омазани.
Пробвах да е:
char ime[60];
char *ime;

обаче нещата са същите.
Някакви идеи?


Титла: Re: Грешка в С++ програма.
Публикувано от: b2l в May 22, 2010, 19:50
Код:
man gets


Титла: Re: Грешка в С++ програма.
Публикувано от: borovaka в May 22, 2010, 20:05
Миля, че това ще ти помогне:
http://www.cplusplus.com/reference/iostream/istream/getline/ ($2)


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 22, 2010, 20:06
Код:
man gets
Това не е ли чиста С функция?


Титла: Re: Грешка в С++ програма.
Публикувано от: borovaka в May 22, 2010, 20:16
Ето ти цитат от " Програмиране на С++ първа част" на Магдалина Тодорова.

Функция getline
    Синтаксис

    cin.getline(<var_str>, <size> [,<char>]опц)
където
  • <var_str> е променлива от тип низ;
  • <size> е цял израз;
  • <char> е произволен символ.
Ако параметърът <char> е пропуснат, подразбира се символът '\n'

   Семантика

Въвежда от буфера на клавиатурата редица от символи с максимална дължина <size>-1. Въвеждането продължава до срещане на символа зададен в <char>, или до въвеждане на <size>-1 символа (ако междувременно не е достигнат символа <char>). Въведената редица от символи се преобразува в низ и става стойност на променливата <var_str>.

п.с. Между другото този учебник е хубав, ако не си го чел го прегледай. Аз тепърва се захващам с С++ и пише на достатъчно достъпен език.


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 22, 2010, 20:23
Ами благодаря за инфото, задачата е на приятелката ми обаче аз нямам никакво голямо желание да се захващам със С++ в детайли но тя пък се ужасява от програмирането още (не питайте какво учи) има  някакво понятие от С но някой неща не са ми ясни в С++ за да и помогна.
Ще погледна линковете, но неразбрах коя е книгата всъщност.
Мисля че ще ми се наложи да питам още за задачата ако не се справя или поне за полезни линкове.


Титла: Re: Грешка в С++ програма.
Публикувано от: borovaka в May 22, 2010, 20:25
Книгата ти я казах "Програмиране на С++ първа част" се казва автор е Магдалина Тодорова от СУ е мисля.

п.с. Има я и в нета обаче си я намери сам тъй като не знам дали има съгласие от автора за електронно разпространение.


Титла: Re: Грешка в С++ програма.
Публикувано от: chen_dzen в May 22, 2010, 20:33
ами ти си дефинирал масив от 60 символа .След исписването на специален символ интервал следващите данни отивът във входния буфер .По добре помисли вариант с три променливи или двумерен масив.
ама всъщност има много готина функция getline().
 ???  ;D


Титла: Re: Грешка в С++ програма.
Публикувано от: c111100101 в May 22, 2010, 21:14
Що не дадеш условието на задачата?


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 22, 2010, 23:06
Да се състави програма за обслужване на ски-състезание. За всеки състезател се въвежда следната информация: номер, име и фамилия, постижение, държава. Програмата да дава възможност за получаване на следните резултати:

1.      Извеждане на списък на всички състезатели с въведените данни за тях;

2.      Извеждане на списък на всички  състезатели, подредени в низходящ  ред на постиженията им. Ако има състезатели с едно и също постижение, по-напред в списъка да се изведе този, чието име започва с по-предна буква от азбуката.

3.      Пресмятане и извеждане на средното постижение на състезателите;

4.      Извеждане на списък на всички състезатели от дадена държава, които имат постижение по-ниско от средното за състезанието.


Титла: Re: Грешка в С++ програма.
Публикувано от: Arvigeus в May 22, 2010, 23:36
Елементарно предложение: съхрани името и фамилията като 2 отделни променливи. cin>> има навика да разделя думите. И после cin>>Ime>>Familia;


Титла: Re: Грешка в С++ програма.
Публикувано от: borovaka в May 22, 2010, 23:49
Абе какъв е тоя мазохизъм какво му е на getline че предлагате да се заемат две променливи със cin? Не съм програмист и съм зле със С++ ако е по-удачно така моля някой да ми каже защо?


Титла: Re: Грешка в С++ програма.
Публикувано от: schemer в May 22, 2010, 23:51
Елементарно предложение: съхрани името и фамилията като 2 отделни променливи. cin>> има навика да разделя думите. И после cin>>Ime>>Familia;

// offtopic

Компютрите нямат навици, а ясно дефинирано поведение.


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 23, 2010, 22:54
Добре де какво правя не както трябва че cin.getline() не работи коректно?
При компилация компилатора не отчита грешка обаче при изпълнение редовете в които извиквам фикцията се прескачат и се минава направо на тези дето са си само с cin?

Как може да мога да я направя да работи нормално в С а в С++ да не става?


Титла: Re: Грешка в С++ програма.
Публикувано от: remotex в May 25, 2010, 08:45
1. Какво значи "се прескачат" - така се получава когато начинещите слагат по много оператори на един ред - пробвай да ги разделиш само по един оператор на ред и тогава пак кажи дали се прескачат.
2. Покажи кода да видим как точно я викаш тази функция getline()
3. borovaka правилно те е насочил. И аз миcля, че това ще ти помогне:
http://www.cplusplus.com/reference/iostream/istream/getline/
Като трябва да внимаваш : според това какво ще ползваш string или char * да извикаш правилния вариаант на функцията


Титла: Re: Грешка в С++ програма.
Публикувано от: borovaka в May 25, 2010, 15:19
Ето пример за програма използваща getline със string:

Код
GeSHi (C++):
  1. // getline with strings
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5.  
  6. int main () {
  7.  string str;
  8.  cout << "Please enter full name: ";
  9.  getline (cin,str);
  10.  cout << "Thank you, " << str << ".\n";
  11. }

А ето пример и с използване на char.
Код
GeSHi (C++):
  1. // istream getline
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main () {
  6.  char name[256], title[256];
  7.  
  8.  cout << "Enter your name: ";
  9.  cin.getline (name,256);
  10.  
  11.  cout << "Enter your favourite movie: ";
  12.  cin.getline (title,256);
  13.  
  14.  cout << name << "'s favourite movie is " << title;
  15.  
  16.  return 0;
  17. }

п.с. Примерите са от сайта който ти дадох. Тъй като и аз съм съвсем начинаещ моля ако давам грешни съвети някой да ме поправи.


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 27, 2010, 16:31
Айде сега да видим къде съм сгрешил?


Код
GeSHi (C++):
  1. struct infoSastezateli {
  2.  
  3.        unsigned int nomer;
  4.        string ime;
  5.  
  6.        int postijenie;
  7.        char darjava[20];
  8.  
  9.  
  10.  
  11. };
  12.  
  13. int vavejdane()
  14. {
  15.        int i;
  16.  
  17.                struct infoSastezateli sastezatel[5];
  18.  
  19.                for(int br=0; br<5; br++ )
  20.                {
  21.                        cout<<"Въведете име и фамилия на състезателя: ";
  22.                         getline(cin,sastezatel[br].ime);
  23.                     cout<<"Въведете номер на състезателя: ";
  24.                     cin>>sastezatel[br].nomer;
  25.  
  26.                     cout<<"Въведете постижение на състезателя: ";
  27.                     cin>>sastezatel[br].postijenie;
  28.                     cout<<"Въведете държава на състезателя: ";
  29.                     cin>>sastezatel[br].darjava;
  30.  
  31.  
  32.                }
  33. }


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 27, 2010, 17:49
Оправих се като добавих cin.ignore (); на подходящо място.


Титла: Re: Грешка в С++ програма.
Публикувано от: borovaka в May 27, 2010, 17:52
Само да те попитам тази функция защо я викаш от тип int. Изходни стойности не си посочил. Извикай я с void и дай един return; накрая не, че е задължителен :)


Титла: Re: Грешка в С++ програма.
Публикувано от: renesans в May 27, 2010, 18:47
Ами не е птоблем това понеже това е само част от финкцията не е всичко което се случва в нея.