• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

Проблеми со структура

  • Ја почнал/а темата
  • #1

maximilian

Gaining Experience
26 март 2008
1,064
74
Имам една функција со која се воведува низа од тип структура.
Структурата е следнава:

Код:
struct student
{
       int facNo;
       char ime[30];
       int ocenki[5];
};
А функцијата со која би требало да се внесат податоци за секој член од низата student a[10], ми е напишана вака:
Код:
void readStudent (int m, student ucenik [])
{
     for (int i=0; i<m; i++)
         {
              cout << "Student br:" << i+1 << endl;
              cout << "Br. na index: ";
              cin >> ucenik[i].facNo;
              cout << "Ime i prezime: ";
              [B]cin.getline (ucenik[i].ime, 30);[/B]
              cout << endl;
              for (int j=0; j<5; j++)
                  {
                       cout << "Ocenka br:" << j+1 << " ";
                       cin >> ucenik[i].ocenki[j];
                  }
              cout << endl << endl << endl;
         }
}
Но, кога се појавува на екранот Ime i prezime: , веднаш преминува на наредната команда односно печати "Ocenka br:1", и ги внесува параметрите за оценка, т.е. го игнорира фрагментот
Код:
cin.getline (ucenik[i].ime, 30);
и оди дирекно на
Код:
for (int j=0; j<5; j++)
                  {
                       cout << "Ocenka br:" << j+1 << " ";
                       cin >> ucenik[i].ocenki[j];
                  }

Шо може да биде ова? Страшно ме нервира проблемов :lut2:, па многу би ви бил благодарен доколку ми дадете некој совет околу тоа зошто не сака да внесе податоци за полето од структурата во кое се запишува името на студентот.
 

StarBuck

Intern
16 февруари 2008
1,295
48
Берлин
StarBuck's setup  
Processor & Cooler
Quad-Core Intel Xeon E5 3,7
Storage
256 GB SSD
RAM
12 GB DDR3-RAM
Video card
Dual AMD FirePro D300 GDDR5 4GB
Monitor
IPS
OS
Yosemite
со cin.get место .getline работи?
 
  • Ја почнал/а темата
  • #3

maximilian

Gaining Experience
26 март 2008
1,064
74
Пробав со cin.get и цела програма се побрка после внесувањето на полето за број на индекс, т.е. не бива, дури полошо е :D
 
  • Ја почнал/а темата
  • #5

maximilian

Gaining Experience
26 март 2008
1,064
74
Затоа што со cin>>ucenik.ime пак не бидува, го дава истиот резултат како и резултатот од предлогот на StarBuck
 
  • Ја почнал/а темата
  • #7

maximilian

Gaining Experience
26 март 2008
1,064
74
Да да, сега за сега не е целосна, само воведување и изведување на структурите, има и некои сортирања кои уште не сум ги средил заради овој проблем.
Кодот:
Код:
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<iomanip>

using namespace std;

struct student
{
       int facNo;
       char ime[30];
       int ocenki[5];
};

void readStudent (int, student[]);
void writeStudent (int, student[]);

int main()
{
    student a[10];
    cout << "Br. na studenti: ";
    int n;
    do
      {
          cin >> n;
          if (n<=0 || n>10)
             cout << "Vnesete broj megu 1 i 10" << endl << "Br. na studenti: ";
      }
      while (n<=0 || n>10);
    cout << endl << endl << endl;
    readStudent (n, a);
    writeStudent (n, a);
    system ("pause");
    return 0;
}

void readStudent (int m, student ucenik [])
{
     for (int i=0; i<m; i++)
         {
              cout << "Student br:" << i+1 << endl;
              cout << "Br. na index: ";
              cin >> ucenik[i].facNo;
              cout << "Ime i prezime: ";
              cin >> ucenik[i].ime;
              cout << endl;
              for (int j=0; j<5; j++)
                  {
                       cout << "Ocenka br:" << j+1 << " ";
                       cin >> ucenik[i].ocenki[j];
                  }
              cout << endl << endl << endl;
         }
}

void writeStudent (int m, student ucenik[])
{
     cout << setw(17) << "Broj na index: " << setw(30) << "Ime i prezime: ";
     cout << setw(17) << "Br na ocenki: " << endl; 
     for (int i=0; i<m; i++)
     {
        cout << setw(17) << ucenik[i].facNo;
        cout << setw(30) << ucenik[i].ime;
        for (int j=0; j<5; j++)
            cout << setw (3) << ucenik[i].ocenki[j];
        cout << endl;
     }
}
 
  • Ја почнал/а темата
  • #9

maximilian

Gaining Experience
26 март 2008
1,064
74
На тој начин, ми дозволува да воведам име, ама ако воведам име и презиме, кои се одделени со празен простор, програмата се гаси автоматски, а ако внесам само име, за првиот студент што внесувам податоци е ОК, ама за вториот кога внесувам име, се гаси програмата. :(
 

vasildb

Intern
17 април 2007
209
6
Тогаш само ке му направиш overload на операторот >>. Би требало да ги среди овие проблеми.
 
  • Ја почнал/а темата
  • #11

maximilian

Gaining Experience
26 март 2008
1,064
74
Како се прави тој overload? Прв пат слушам за такво нешто :)

Еdit: Проблемот се потсреди малку, т.е. кога за char[30], наместо функцијата за запишување cin.getline(ucenik.ime, 30), просто ставив cin>>ucenik.ime. Пред тоа пробав вака, но нешто не сакаше, а сеа тргна :D.

Но, се појави друг проблем. Не ми дозволува да употребам празно место (space), т.е. можам само име да внесам. На пример, програмата блокира ако внесам “Петар Петровски“, а ако внесам само “Петар“ се е ок.

Ова шо може да биде?
 

''TcM>>

Intern
6 јануари 2008
961
39
Mislam deka ne moze taka da se napravi. Odnosno vo edna promenliva da se vnesat dve (poprosto kazano ako me svati). Zatoa najdobro pokraj ime stavi i char Prezime. Pa ke imas:
cout << "Ime: ";
cin >>ucenik.ime;
cout<<"Prezime: ";
cin>>ucenik.prezime;
itn...
 

TataMata

Intern
13 јуни 2008
115
1
Мала финта.

Едноставен е проблемот, но кој да го знае. Вака. cin го игнорира \n (нова линија) и едноставно го остава тој карактер во стримот. И сега кога ќе дојде getline прво го чита овој \n карактер и прекинува со читање. Затоа скока. А по default тој е терминирачки карактер за линијата, мада може да се дефинира друг.

Решение, или да се смени да нема getline после cin, или да се елиминира тој \n со cin.ignore()...

Значи...

Код:
cin >> ucenik[i].facNo;
cin.ignore();
cout << "Ime i prezime: ";
cin.getline (ucenik[i].ime, 30);
Сега треба да работи.:D
 
  • Ја почнал/а темата
  • #14

maximilian

Gaining Experience
26 март 2008
1,064
74
@"TcM>>

Знам дека доколку додадам во структурата друго поле prezime дека ќе се реши, ама за вака во едно да е, мислев дека и празното место се брои како знак.

@TataMata

Со cin.ingore() на компилирањето се појавува грешка, т.е. пишува 'struct std::istream' has no member named 'ingore'.

Како и да е, проблемот е решен, фала за hint-овите :bye1:
 

Blagojce

Gaining Experience
26 декември 2007
889
69
Прилеп
Blagojce's setup  
Processor & Cooler
Intel Core i5-3570 3.40GHz
Storage
2 TB
RAM
8 GB
Monitor
ASUS 24" LED Full HD
OS
Windows 10
А да кажеше како е решен...МОжеби и некој друг ќе има сличен проблем.
 
  • Ја почнал/а темата
  • #16

maximilian

Gaining Experience
26 март 2008
1,064
74
Па кажав малце погоре, ако додадеме ново поле prezime во структурата :)
 
  • Ја почнал/а темата
  • #18

maximilian

Gaining Experience
26 март 2008
1,064
74
Не ми се верува дека не го приметив тоа :D. Од шо ме мрзеше да го препишувам, само го копирав и го пастирав во сорсот. Го пробав сега со cin.ignore(), и успеа, фала TataMata :bravo:, сега не мора да ставам ново поле во структурата. Иначе, не ја знаев оваа функција cin.ignore(), доколку во заградата би имало нешто (на пример буквата а) би било во стилот на cin.ignore('a') ? Ај молим те ако не те мрзи поубаво објасни ја оваа функција и нејзината семантика?
 

TataMata

Intern
13 јуни 2008
115
1
Е ако де.

Ова игноре едноставно прескокнува карактери. Параметри се, број на карактери и тип на делимитер. Делимитерот исто така го прескокнува. Значи од стремот елиминира број на карактери, до делимитерот (ако дојде побрзо до делимитерот тогаш до делимитерот прескокнува, а не до бројот на карактери).

Хм, зошто да објаснувам има овде

Не може да има буква во заградата...

Код:
cin.ignore(256,' ');
Прескокни 256 карактери со до првото празно место.

Мислам дека сум јасен.
 
  • Ја почнал/а темата
  • #20

maximilian

Gaining Experience
26 март 2008
1,064
74
Да да, јасно е сега :). BTW, фала за линкчето, многу е добро, има многу работи за С++ :bravo:
 

Нови мислења

Последни Теми

Статистика

Теми
43,498
Мислења
821,856
Членови
28,042
Најнов член
Puffy
На врв Дно