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

Struktura opisująca studenta w C++

VPS Starter Arubacloud
0 głosów
648 wizyt
pytanie zadane 20 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

WItam, ostatnio na wykładach z programowania rozpoczeliśmy temat struktur danych. Pomimo moich starań, nadal trudno mi do końca zrozumieć o co dokładnie chodzi. Otrzymaliśmy też kilka zadań. Jedno z nich jest następujące:

Zaimplementować strukturę danych opisującą studenta. Struktura powinna składać się z:
1. pól (imię, nazwisko, numer indeksu, aktualny semest, średnia ocen)
2. funkcji składowej ‘to_string() const’ zwracającej std::string, którym opisuje
studenta
3. konstruktora
Niech w funkcji main będzie utworzony obiekt reprezentujący ciebie, a na std::cout
wydrukowany będzie wynik działania funkcji Student::to_string na tym obiekcie.
Kod źródłowy w plikach include/s1234/Student.h (nagłówek) i src/s03-Student.cpp (implementacja i
funkcja main).

Czy ktoś mógłby mi pomóc, lub chociaż nakierować od czego zacząć itp.? Mój dotychczasowy kod:

(plik student.h)

#ifndef STUDENT_H
#define STUDENT_H

#include <string>



struct Student {
    std::string const imie;
    std::string const nazwisko;
    std::string const indeks;
    short int semestr;
    float srednia_ocen;
  

    auto to_string() const -> std::string;
};

#endif

 

(plik s03-Student.cpp)

#include <s11111/Student.h>
#include <iostream>


auto main() ->int
{
    auto ja = Student{"Mikolaj", "K", "s11111", 1, 0};
    std::cout << ja.to_string() << "\n";

   
    return 0;
}

Z góry dziękuję!

2
komentarz 20 października 2021 przez Sadako Obywatel (1,240 p.)

Cześć.

Pierwszy punkt masz zrobiony. Możesz tylko rozważyć czy na pewno chcesz aby pola imie, nazwisko i index były const. Nie da się ich zmienić, choć rozumiem, że taka mogła być Twoja intencja.

Jeśli chodzi o drugi punkt, to masz zrobiony w połowie.
Masz napisaną deklarację funkcji to_string, ale nie masz definicji. Tutaj pierwsza lepsza strona tłumacząca róznicę między deklaracja a definicja. https://www.mimuw.edu.pl/~ziemians/pk2013/funkcje.html

Zazwyczaj definicje umieszcza się w pliku źródłowym (.cpp)
Poszukaj sobie także jak zapisać deklaracje funkcji klasy/struktury w pliku nagłowkowym (.h), a definicje w pliku źródłowym (.cpp). 
W zadaniu nie jest napisane jak ma wyglądać taka tekstowa reprezentacja więc może wyglądać np. tak:
"Student Jan Nowak - Semestr 3"
Pewnie najlepiej będzie uwzględnić wszystkie pola struktury, a nie tylko część tak jak w podanym przeze mnie przykładzie.
Jak zbudować taki napis?
std::string można ze sobą dodawać (konkatenować) tworząc większy napis np.

std::string imie = "jan";
std::string nazwisko = "kowalski";
std::string peplnaNazwa = imie + " " + nazwisko; // "jan kowalski"

Problem pojawi się natomiast z konwersją float i  short int. Nie można dodać float do std::string. Musisz zamienić float na std::string i dopiero możewsz dodać. Do konwersji można użyć gotowych funkcji konwertujących z STL.
Ja proponuje jednak inną technikę, czyli użyć stringstream.

Jeśli chodzi o punkt trzeci, to brakuje Ci konstruktora. Tę Twoją strukturkę oczywiście da się zainicjalizować tak jak to zrobiłeś, gdyż wszystkie zmienne są public (domyślnie dla struct jest public). Polecam sobie zobaczyć jakiś tutorial jak pisać konstruktory i używać listy inicjalizacyjnej. 

Dodatkowa uwaga, że troche nadużywasz słowa auto
np.

auto to_string() const -> std::string

Niby to działa i jest ok, ale bardziej czytelne by było
std::string  to_string() const;

komentarz 21 października 2021 przez tkz Nałogowiec (42,000 p.)

Pierwszy punkt masz zrobiony. Możesz tylko rozważyć czy na pewno chcesz aby pola imie, nazwisko i index były const. Nie da się ich zmienić, choć rozumiem, że taka mogła być Twoja intencja.\

Jaki sens ma zmienne imię, nazwisko i indeks?

Problem pojawi się natomiast z konwersją float i  short int. Nie można dodać float do std::string. Musisz zamienić float na std::string i dopiero możewsz dodać. Do konwersji można użyć gotowych funkcji konwertujących z STL.
Ja proponuje jednak inną technikę, czyli użyć stringstream.

Skoro mamy stałe założenia, to nie ma to za bardzo sensu. Lepiej użyć std::stoi i std::stof.

komentarz 21 października 2021 przez MKolaj15 Bywalec (2,270 p.)

@Sadako, Dzięki za te rady, napewno się przydadzą. Jak będę miał jeszcze jakieś wątpliwości, to tu zapytam.

komentarz 21 października 2021 przez MKolaj15 Bywalec (2,270 p.)

@tkz, a mógłbyś mi pokazać jak dokładnie użyć tych funkcji, bo nie za bardzo wiem, w którym miejscu ich użyć?

Stworzyłem taką defnicję funkcji:

#include <s1111/Student.h>
#include <iostream>

auto::Student::to_string() const ->std::string
{
   std::string pelna_nazwa=imie+" "+nazwisko+" "+indeks;//+" "+semestr+" "+srednia_ocen;
   return pelna_nazwa;
}

auto main() ->int
{
    auto ja = Student{"Mikolaj", "K", "s11111", 1, 0};
    std::cout<<ja.to_string()<<std::endl;

   
    return 0;
}

 

i fakt działa tylko z argumentami typu string.

 

komentarz 21 października 2021 przez tkz Nałogowiec (42,000 p.)

Na pewno się nie kompiluje w formie jaką pokazałeś. 

#include <iostream>
#include <string>
struct Student 
{
    std::string const imie;
    std::string const nazwisko;
    std::string const indeks;
    short int semestr;
    float srednia_ocen;
   
    auto to_string() const -> std::string;
    Student(const std::string& imie, const std::string& nazwisko);
};
Student::Student(const std::string& imie_, const std::string& nazwisko_) : imie{imie_}, nazwisko{nazwisko_}
{}


auto Student::to_string() const -> std::string
{
    return imie+nazwisko+indeks+std::to_string(semestr)+std::to_string(srednia_ocen);
}
int main()
{
    auto student = Student("Kamil", "Kamil");
    std::cout<<student.to_string();
}

A to

Lepiej użyć std::stoi i std::stof.

pomyliłem się. Zapomnij o tym. Lepszym pomysłem od stringstream jest to_string. 

komentarz 21 października 2021 przez MKolaj15 Bywalec (2,270 p.)

@tkz Okej, dzięki wielkie za pomoc, ale czy mógłbyś mi wytłumaczyć do czego służą te linijki?

Student(const std::string& imie, const std::string& nazwisko);
Student::Student(const std::string& imie_, const std::string& nazwisko_) : imie{imie_}, nazwisko{nazwisko_}
{}

 

komentarz 21 października 2021 przez tkz Nałogowiec (42,000 p.)
Konstruktor, definicja i deklaracja. Punkt 3 tego wymaga, dodaj resztę pól z struktury i będzie okey.
komentarz 21 października 2021 przez MKolaj15 Bywalec (2,270 p.)
Super, mega dzięki za pomoc!

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 521 wizyt
pytanie zadane 26 października 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
1 odpowiedź 220 wizyt
pytanie zadane 21 grudnia 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)
0 głosów
0 odpowiedzi 186 wizyt
pytanie zadane 27 grudnia 2021 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...