• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jaki warunek logiczny przerwie petle w tym zadaniu.

VPS Starter Arubacloud
0 głosów
707 wizyt
pytanie zadane 31 stycznia 2017 w C i C++ przez Paq_93 Początkujący (260 p.)
edycja 31 stycznia 2017 przez Eryk Andrzejewski

Witam, Funkcja getinto() ma dwa parametry: wskaźnik pierwszego elementu tablicy struktur studenta oraz liczbę int określającą liczbę elementów w tablicy. Funkcja pobiera i zapisuje dane o studentach. Wprowadzenie danych kończy się, kiedy tablica jest pełna lub podane zostanie puste nazwisko studenta. Funkcja zwraca liczbę studentów wpisanych do tablicy. Zadanie jest z ksiazki Praty, jest to zadanie 9 rozdzial 7.

#include <iostream>
#include <string>

const int SIZE=30;

struct Student{
 char fullname[SIZE];
 char hobby[SIZE];
 int level;
};

int getinto(Student st [],int p);

int main()
{
 Student s1[3];
 int nr_s=getinto(s1,3);
 
}

int getinto(Student st [],int p){
int i=0;
while(i<p){
std::cout<<"Podaj nazwe "<<i+1<<" studenta : ";
std::cin>>st[i].fullname;
std::cout<<"Podaj hobby "<<i+1<<" studenta : ";
std::cin>>st[i].hobby;
std::cout<<"Podaj poziom "<<i+1<<" studenta : ";
std::cin>>st[i].level;
i++;
}
    return i;
}
}

 

komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
Ucielo mi.

Funkcja ma przestac sie wykonywac jezeli podamy tyle elementow ile jest w tablicy lub jezeli nazwa studenta bedzie pusta.
komentarz 31 stycznia 2017 przez Pajdas Mądrala (5,930 p.)
edycja 31 stycznia 2017 przez Pajdas
Dlaczego stworzyłeś pętle while a nie for
poza tym, czy chodzi ci o funkcje getinfo();
komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
Bez znaczenia dla mnie to dla tego zadania.

Potrzebuje cos co spelni 2 warunek przerwania wykonywania pentli...
komentarz 31 stycznia 2017 przez Pajdas Mądrala (5,930 p.)
jak masz dwa warunki i jeden i drugi muszą się spełnić to używasz &&, a jeżeli jeden z nich LUB oba to ||
komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
Wiem to. Po to dalem kod byscie mi do tego zadania pomogli napisac taki warunek.

Jak zapisac

If(st[I].fullname (JEST PUSTE)

break;

2 odpowiedzi

+1 głos
odpowiedź 31 stycznia 2017 przez rattle Użytkownik (510 p.)
edycja 31 stycznia 2017 przez rattle

Ja bym to uczynił tak:

std::string fullname;
//char fullname[SIZE];

getline(std::cin,st[i].fullname);
if(st[i].fullname=="")
  break;

std::cin.ignore();
} // tu koniec pętli while

Tylko tak umiem, może pomogę. Z tym CHARem nie umiem.

PS. Nie ucieło Ci, tylko trzeba suwakiem w prawo przeciągnąć.

Edit: Dobra już umiem, Moja oficialna odpowiedz wygląda tak:

Zamienić:

std::cin>>st[i].fullname;

Na:

std::cin.get(st[i].fullname, 30);
if((int)st[i].fullname[0]==0)
    break;

I zaraz przed końcem pętli while trzeba wstawić:

std::cin.ignore();

Tym się inspirowałem: Temat z tego forum

Po wpisaniu entera w pierwszym elemencie tablicy mamy znak NUL. Po skonwertowaniu go do int równa się on 0 zgodnie z tablicą ASCI. Tak właśnie można sprawdzić, czy tablica jest pusta.

a cin.ignore() jest ze względu na użycie cin.get()

komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
Tez myslalem o string ale w ksiazce jest char. Wlasnie zastanawiam sie czy moze wine ponosi tu tlumaczenie ksiazki na jezyk polski. Chyba nie da sie sprawdzic czy tablica char jest pusta jak do niej nic nie wpiszemy.
komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
No ja juz probowalem konstruktor zrobic ktory przypisuje name "Brak".

Potem w pentli zrobic jezeli if(st[I].fullname=="brak") break;

Ale tez cos nie dziala. poza tym nawet do tej pory nie bylo konstruktorow w tej ksiazce wiec takie kombinowanie odpada.
komentarz 31 stycznia 2017 przez rattle Użytkownik (510 p.)
edycja 31 stycznia 2017 przez rattle
Da się sprawdzić czy tablica char jest pusta. Choćby takim IFem czy pierwszy element tablicy to spacja, lub nic. Ale problemem jest, że poprzez std::cin nie da się wpisać spacji lub "niczego". Dlatego użyłem getline, ale znowu getline nie działa z tablica CHARową dlatego zamieniłem tego CHARa na string. Ale Ty chcesz mieć CHARa, więc na ten moment więcej nie pomogę, bo umiejętności mi nie pozwalają.

PS. Można np. ustalić, że wpisująć np. "0" traktujemy to jako brak nazwy studenta i kończymy pętlę. Chyba, że koniecznie chcesz, żeby to było PUSTE nazwisko studenta. Napewno da się to jakoś zrobić tylko trzeba poczekać na programistów z 10 letnim stażem.
komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
metoda cin.get() pozwala wpisac spacje itp. taki odpowiednik getline dla char
komentarz 31 stycznia 2017 przez rattle Użytkownik (510 p.)
edycja 31 stycznia 2017 przez rattle

To znaczy, że już rozwiązałeś problem? Bo ja nie wiedziałem, że istnieje coś takiego jak cin.get() co tylko dowodzi jak bardzo początkujący jestem. Ale poczytałem i udało mi się coś takiego spłodzić:

std::cin.get(st[i].fullname, 30);
    if((int)st[i].fullname[0]==0)
        break;

Generalnie to.. działa, więc chyba jest OK.

Wystarczy kliknąć enter i programik "zakłada", że student jest pusty czyli go nie ma i kończy pętle brejkiem. Generalnie to kolega z podspodu pomógł, bo od niego zaczerpnąłem pomysł brejka więc trzeba skorygować fakt, że ma -3 głosy.

komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
Zrobilem tak I u mnie przestaje sie wykonywac po 1 petli.
Moze dlatego ze to kombilator onile.

#include <iostream>
#include <string>
 
const int SIZE=30;
 
struct Student{
 char fullname[SIZE];
 char hobby[SIZE];
 int level;
};
 
int getinto(Student st [],int p);
 
int main()
{
 Student s1[3];
 int nr_s=getinto(s1,3);
  
}
 
int getinto(Student st [],int p){
int i=0;
while(i<p){
std::cout<<"Podaj nazwe "<<i+1<<" studenta : ";
std::cin.get(st[i].fullname, 30);
    if((int)st[i].fullname[0]==0)
        break;
std::cout<<"Podaj hobby "<<i+1<<" studenta : ";
std::cin>>st[i].hobby;
std::cout<<"Podaj poziom "<<i+1<<" studenta : ";
std::cin>>st[i].level;
i++;

}
    return i;
}

 

komentarz 31 stycznia 2017 przez rattle Użytkownik (510 p.)

Zapomniałeś o

std::cin.ignore();

Przeczytaj moją odpowiedź tą główną, edytowałem ją.

1
komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
Faktycznie teraz dziala. Dzieki :)
–2 głosów
odpowiedź 31 stycznia 2017 przez Benek Szeryf (92,410 p.)

Pentle łajl przerywa się brejkiem.

komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
To jest temat nie tresc. Moze teraz zapalilo sie swiatelko w twojej glowie.

pod spodem napisalem komentarz ze mi ucielo I napisalem "Funkcja ma przestac sie wykonywac jezeli podamy tyle elementow ile jest w tablicy lub jezeli nazwa studenta bedzie pusta."

Prosze nie pisz pod moimi postami bo tylko smiecisz mi temat.
1
komentarz 31 stycznia 2017 przez Pajdas Mądrala (5,930 p.)
napiszę treść przeznaczenia funkcji za osobę która zadała pytanie

Funkcja getinto() ma dwa parametry: wskaźnik pierwszego elementu tablicy struktur studenta oraz liczbę int określającą liczbę elementów w tablicy. Funkcja pobiera i zapisuje dane o studentach. Wprowadzenie danych kończy się, kiedy tablica jest pełna lub podane zostanie puste nazwisko studenta. Funkcja zwraca liczbę studentów wpisanych do tablicy.

Cofam Downvota, bo wina jest po obu stronach, źle sformułowane pytanie i głupia odpowiedz.

Paq powinieneś dokładnie powiedzieć o co ci chodzi
komentarz 31 stycznia 2017 przez Paq_93 Początkujący (260 p.)
OK dzieki za pomoc. Juz zmieniam.
1
komentarz 31 stycznia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Proszę o zachowanie kultury wypowiedzi. Forum jest miejscem publicznym, w przyszłości ktoś będzie chciał znaleźć rozwiązanie swojego problemu, a będzie musiał czytać bezsensowne kłótnie.

@Paq_93

Wystarczyło spojrzeć w profil kolegi, którego nazwałeś nabijającym punkty gimbusem, żeby zobaczyć, że udziela on rzeczowych odpowiedzi. Jeśli twoje pytanie jest wyjątkiem, to chyba coś z nim jest nie tak, prawda?

Określenia w stylu "nie udzielaj się" zniechęcają tylko osoby do pomocy Tobie.

@Benek

Odbiję piłeczkę. Pisanie ze zrozumieniem. Nie umiesz nawet wyrazić swoich myśli i na dodatek umieszczasz pytanie w znaczniku code. To się nazywa robota na odwal się.

Jeśli chodzi o to, że treść pytania znalazła się w bloczku code, to jest do zrozumienia, dość często się to zdarza w przypadkowy sposób, trzeba pomyśleć jak to naprawić.

komentarz 31 stycznia 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Temat poprawiłem, jedyne co by można poprawić jeszcze to wcięcia w kodzie, bo jest strasznie nieczytelny, ale nie chciałem już w kod autora ingerować.

Podobne pytania

0 głosów
3 odpowiedzi 416 wizyt
+1 głos
2 odpowiedzi 504 wizyt
0 głosów
5 odpowiedzi 641 wizyt
pytanie zadane 26 marca 2016 w C i C++ przez frycek Nowicjusz (120 p.)

93,008 zapytań

141,974 odpowiedzi

321,255 komentarzy

62,348 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...