Tworzenie programu za pomocą tablicy w strukturze, sortowanie stringów i wyświetlanie.

0

Cześć wszystkim. Widziałem podobny temat ale ja postaram się go bardziej rozbudować..
Zadanie brzmi: Dane stanowią linie dowolnego tekstu, z których każdy wiersz zawiera słowa oddzielone spacjami (niekoniecznie pojedynczymi). Tekst może zawierać co najwyżej 40 lini po max 80 znaków każda. Wynikiem programu powinny być linie dowolnego tekstu przedstawione wg. malejącej średniej długości słowa w linii.
Program wydaje się być łatwy do zrobienia ale dla początkującego sprawia trochę problem.
Oto mój rezultat:

#include <iostream>
#include <string>
using namespace std;

struct wiersze {
    string wiersz[40];
    int dlugosc[80];
};
int main()
{
    wiersze tekst;
    wiersze Dlugosc;
    int ile;

    cout << "Wprowadz liczbe wierszy: ";
    cin >> ile;
    if (ile <= 40) {
        cin.ignore();

        //wprowadzamy tekst do tablicy
        for (int i = 0; i < ile; i++) {
            cout << "Wpisz " << i + 1 << " tekst: ";
            getline(cin, tekst.wiersz[i]);
        };

        //wypisujemy dane z tablicy (tu sprawdziłem czy poprawnie się wczytało- pętla niepotrzebna)
        for (int i = 0; i < ile; i++) {
            cout << tekst.wiersz[i] << endl;
        }

        //liczymy długość znaków
        for (int i = 0; i < ile; i++) {
            Dlugosc.dlugosc[i] = tekst.wiersz[i].length();
        }

        //wypisz ile każdy wiersz posiada ile znaków (ta pętla też niepotrzebna)
        for (int i = 0; i < ile; i++) {
            cout << "Wiersz " << i + 1 << " posiada " << Dlugosc.dlugosc[i] << " znakow." << endl;
        }
    }
    else {
        cout << "Wprowadzono za duza liczbe!!";

    }
    return 0;
}

No dobra.. Mój pomysł na zrobienie tego programu to:

  1. Wprowadź ile chcesz linii
  2. Jeśli przekracza to wywal błąd i zakończ program
  3. Jeśli nie, to za pomocą pętli wsadź każdą linię do tablicy ( tu chciałbym wywołać funkcję ale nie wiem jak to poprawnie zrobić)
  4. Policz długość znaków i przypisz do każdej linii (tu też funkcja)
  5. Posortuj wg. długości (funkcja)
  6. Wyświetl według poprawnej kolejności (funkcja)
    Nie mam w ogóle pojęcia jak zliczyć tą średnią każdego słowa, jak przypisać długość do tablicy, nawet nie wiem czy to co ja napisałem jest poprawne i czy idę w dobrym kierunku...
    Chciałbym uzyskać od was jak najwięcej porad odnośnie zrobienia tych etapów i prosiłbym was abyście nie kazali mi się doszukiwać gdzie indziej tylko tak konkretnie powiedzieć co w jaki sposób, bo mam strasznie mało czasu :/
1

Twój pomysł na to zadanie wygląda jak najbardziej poprawnie. Zacznę od uwag na temat istniejącego kodu.

Nie ma sensu trzymać takiej tablicy długości - w końcu linijek tekstu będzie co najwyżej 40, a więc nie 42, i nie 80:

int dlugosc[80];

Długoś ta jest niepotrzebna, szczególnie ze względu na to co sam zauważyłeś - możesz zwyczajnie wykonać tekst.wiersz[i].length(); - po co w takim razie w ogóle zapisywać taką długość do zmiennej?

Odnośnie Twojego planu:

  1. poprawny pomysł, już to robisz
  2. j.w., poprawnie
  3. również to robisz (możesz się też pokusić o sprawdzenie, czy obecna linijka ma maksymalnie 80 znaków)
  4. faktycznie, przydatnie tutaj napisać funkcję. Wiesz jak to zrobić? Wiesz co dokładnie by miała robić? Przypomnij sobie po czym chcesz sortować te elementy.
  5. od sortowania istnieje funkcja std::sort, którą znajdziesz w pliku nagłówkowym algorithm. Funkcja ta przyjmuje jako jeden z parametrów tak zwany komparator - funkcję, która sprawdzi, który z elementów jest większy. Zapewne tego chcesz użyć tutaj.
  6. wyświetlenie wg. poprawnej kolejności będzie konsekwencją wyświetlenia po kolei, już posortowanej kolekcji
1

Piszesz w C++, więc używaj C++, a nie mieszanka C i C++.

class Line {
public:
    Line(const std::string& s)
        : s{s}
    {
         calculateAverage();
    }

    double getAvrWordLen() const {
        return avr_word_len;
    }

    std::string str() const {
        return s;
    }

private:
    void calculateAverage() {
         ....
         avr_word_len = ...;
    }

private:
    std::string s;
    double avr_word_len;
};

std::istream& loadData(std::istream& in, std::vector<Line>& lines) {
    std::string line;
    while (std::getline(in, line)) {
        lines.emplace_back(line);
    }
    return in;
}

std::ostream& printData(std::ostream& out, const std::vector<Line>& lines) {
    ....
    return out;
}

int main()
{
     std::vector<Line> lines;
     loadData(std::cin, lines);
     std::sort(lines.begin(), lines.end(), [](const auto& a, const auto& b) { return a.getAvrWordLen() > b.getAvrWordLen();}
     printData(std::cout, lines);
     return 0;
}
0
MarekR22 napisał(a):

Piszesz w C++, więc używaj C++, a nie mieszanka C i C++.

class Line {
public:
    Line(const std::string& s)
        : s{s}
    {
         calculateAverage();
    }

    double getAvrWordLen() const {
        return avr_word_len;
    }

    std::string str() const {
        return s;
    }

private:
    void calculateAverage() {
         ....
         avr_word_len = ...;
    }

private:
    std::string s;
    double avr_word_len;
};

std::istream& loadData(std::istream& in, std::vector<Line>& lines) {
    std::string line;
    while (std::getline(in, line)) {
        lines.emplace_back(line);
    }
    return in;
}

std::ostream& loadData(std::ostream& out, const std::vector<Line>& lines) {
    ....
    return out;
}

int main()
{
     std::vector<Line> lines;
     loadData(std::cin, lines);
     std::sort(lines.begin(), lines.end(), [](const auto& a, const auto& b) { return a.getAvrWordLen() > b.getAvrWordLen();}
     printData(std::cout, lines);
     return 0;
}

Napisałeś mi kod, którego nie jestem w stanie w pełni zrozumieć. W jaki sposób połączyć go mogę z moim kodem? Co on mi da? Bo to chyba funkcja (?) która oblicza mi długość linii. A kolejne pytanie, to co napisałem w C (a nie C++)?

0
enedil napisał(a):

Twój pomysł na to zadanie wygląda jak najbardziej poprawnie. Zacznę od uwag na temat istniejącego kodu.

Nie ma sensu trzymać takiej tablicy długości - w końcu linijek tekstu będzie co najwyżej 40, a więc nie 42, i nie 80:

int dlugosc[80];

Długoś ta jest niepotrzebna, szczególnie ze względu na to co sam zauważyłeś - możesz zwyczajnie wykonać tekst.wiersz[i].length(); - po co w takim razie w ogóle zapisywać taką długość do zmiennej?

Odnośnie Twojego planu:

  1. poprawny pomysł, już to robisz
  2. j.w., poprawnie
  3. również to robisz (możesz się też pokusić o sprawdzenie, czy obecna linijka ma maksymalnie 80 znaków)
  4. faktycznie, przydatnie tutaj napisać funkcję. Wiesz jak to zrobić? Wiesz co dokładnie by miała robić? Przypomnij sobie po czym chcesz sortować te elementy.
  5. od sortowania istnieje funkcja std::sort, którą znajdziesz w pliku nagłówkowym algorithm. Funkcja ta przyjmuje jako jeden z parametrów tak zwany komparator - funkcję, która sprawdzi, który z elementów jest większy. Zapewne tego chcesz użyć tutaj.
  6. wyświetlenie wg. poprawnej kolejności będzie konsekwencją wyświetlenia po kolei, już posortowanej kolekcji

Mam pytania odnosząc się do tego co napisałeś:
3. W tym punkcie masz na myśli aby zrobić coś co po każdej wprowadzonej linii będzie liczyć na bieżąco ile jest znaków i w razie czego wywalić błąd?
4. Tu może dałoby radę zrobić tabilcę dwuwymiarową (wiersz[i][j]), która w [i] trzymałaby linię, a w [j] trzymałaby długość tekstu? Chociaż nie wiem czy tak się da, bo i jest typu string, a j musiałoby być typu int. Chyba, że zrobić tablicę dlugosc[] typu int i dla każdego indeksu przypisać indeks z tablicy wierszy, by potem przy sortowaniu przypisać [i]=[j] (gdzie [i] to tablica wierszy a [j] to tablica dlugosci)

1
mateo456 napisał(a):

to co napisałem w C (a nie C++)?

  • użyłeś char[] zamiast std::string
  • użyłeś int dlugosc[80]; zamiast std::vector<int>, ale to i tak jest zbędny element

Napisałeś mi kod, którego nie jestem w stanie w pełni zrozumieć

W czym konkretnie problem?

W jaki sposób połączyć go mogę z moim kodem?

Chyba jest oczywiste, że masz uzupełnić wielokropki. Czym? Nazwy metod są dość sugestywne co tam ma być.

0

Dobra, trochę pozmieniałem kod źródłowy i teraz on wygląda następująco:


#include <iostream>
#include <string>
using namespace std;

const int maxZnak = 40;

struct Wiersz {
	string wiersz[maxZnak];
};

struct Wiersze {
	struct Wiersz wiersz;
};

Wiersze wiersze;

Wiersze *w_wiersze = &wiersze;

void wpisz(Wiersze w_wiersze, int i) {
	cout << "Wpisz " << i + 1 << " wiersz: ";
	getline(cin, w_wiersze.wiersz.wiersz[i]);
	cin.ignore();
}
void wypisz(Wiersze w_wiersze, int i) {
	cout << w_wiersze.wiersz.wiersz[i] << endl;
}

int main() {
	int ile;
	cout << "Podaj ile wierszy: ";
	cin >> ile;

	for (int i = 0; i < ile; i++)
		wpisz(*w_wiersze, i);

	for (int i = 0; i < ile; i++) {
		wypisz(*w_wiersze, i);
	};
};

Niestety problem polega teraz na tym, że gubię się jak mam wskazać na tablicę wiersz[] w strukturze Wiersz. Czy mam to zrobić poprzez wskazanie na wskaźnik do tej tablicy czy dam radę na wskazanie bezpośrednie? W debuggerze jest na ten moment masa pustych cudzysłowów co mi się nie podoba bo chyba nie powinno tak być (zdj w załączniku). Czy ktoś byłby na tyle dobry aby mi pomóc w zrobieniu takowego wskaźnika?

1

Odnoszę się do drugiej wersji kodu.

  1. To jest CHORE CHORE CHORE
struct Wiersze {
    struct Wiersz wiersz;
};

Wiersze wiersze;

Wiersze *w_wiersze = &wiersze;

uzyskujesz bufor o rozmiarze jeden, do którego dodajesz zmienną ilość "sztuk"

  1. Prawidłowy w C++ sposób na "liczbę mnogą", czyli kontener to std::vector. Oprócz wielu innych zalet, zawiera w sobie licznik.

  2. To jest błędne / albo sam siebie okłamujesz. Stała maxZnak jak sama nazwa wskazuje ilość znaków, a tutaj powołujesz taką ilość stringów

struct Wiersz {
    string wiersz[maxZnak];
};

0

Jeśli już musisz, musisz użyć operatora new. Wskaźnik, który wprowadzasz na silę jest nieakceptowalny. - AnyKtokolwiek 4 minuty temu
Ok, a jak zrobić to za pomocą operatora? Moja intuicja podpowiada aby zrobić to w funkcji main zaraz po tym jak program zapyta o ilość wierszy, natomiast jak zrobić aby nowo powstała tablica zapisana była w strukturze Wiersz? Czy może ja w ogóle na opak robię i niepotrzebnie tyle struktur?

Ta wewnętrzna tablica jest bez sensu z kilku powodów.

W strukturze Wiersze trzymającej obiekty Wiersz potrzebny byłby licznik linii rzeczywiście dodanych, enkapsulacja tego wszystkiego, zamiana na klasę z polami niepublicznymi, metoda do bezpiecznego dodawania itd... Można to próbować "ratować", ale to nie ten etap

0
AnyKtokolwiek napisał(a):

Jeśli już musisz, musisz użyć operatora new. Wskaźnik, który wprowadzasz na silę jest nieakceptowalny. - AnyKtokolwiek 4 minuty temu
Ok, a jak zrobić to za pomocą operatora? Moja intuicja podpowiada aby zrobić to w funkcji main zaraz po tym jak program zapyta o ilość wierszy, natomiast jak zrobić aby nowo powstała tablica zapisana była w strukturze Wiersz? Czy może ja w ogóle na opak robię i niepotrzebnie tyle struktur?

Ta wewnętrzna tablica jest bez sensu z kilku powodów.

W strukturze Wiersze trzymającej obiekty Wiersz potrzebny byłby licznik linii rzeczywiście dodanych, enkapsulacja tego wszystkiego, zamiana na klasę z polami niepublicznymi, metoda do bezpiecznego dodawania itd... Można to próbować "ratować", ale to nie ten etap

Jeśli chodzi o ten kod, to ja mogę całkowicie go napisać od nowa, po prostu na ten moment wydawał się najbardziej zbliżony do kodu prawidłowego (mam już tyyle projektów, że masakra)- a przychodzę tutaj, bo jestem już na tyle wykończony, że muszę Was prosić o poradę. Niestety (bez obrazy) ale nie do końca pomocna dla mnie jest twoja odpowiedź: że tablica jest bez sensu zrobiona- ok- to w jaki sposób? Czego użyć zamiast niej? Jak zrobić aby te wiersze były skupione w jednym miejscu ale aby były oddzielne, by potem można było zliczyć tą długość? :) Czy może zrobić strukturę np. struct Wiersz[]? No już sam nie wiem :/

0

Taką sobie zrobiłem klasę "kontener"

struct Wiersz {
	std::string wiersz;
};

class Wiersze {
private:
	Wiersz* _wiersze;  // tablica ze sztym rozmiarem też by mogła być, choć nie sympatyzuję;
	unsigned max;
	unsigned count;
public:
	Wiersze(int n) {
		max = n;
		_wiersze = new Wiersz[n];
		count = 0;
	}
	int getCount() const {
		return count;
	}
/*	Wiersz* getWiersz(unsigned pos) const {
		if (pos < count)
			return &_wiersze[pos];
		else
			return NULL;  // wielu by zrobiło throw exception.
	} */

	const Wiersz & operator[](int pos) const
	{
		if (pos < count)
			return _wiersze[pos];
		else
			throw new std::exception("Poza zakresem");
	}

	void add(const Wiersz& w) {
		if (count == max)
			throw new std::exception("Za dużo");
		_wiersze[count++] = w;
	}

	~Wiersze() {
		delete _wiersze;
	}
};

0
AnyKtokolwiek napisał(a):

Taką sobie zrobiłem klasę "kontener"



class Wiersze {
   private:
      Wiersz * _wiersze;  // tablica ze sztym rozmiarem też by mogła być, choć nie sympatyzuję;
      int max;
     int count; 
    public:
       Wiersze (int n){
             this.max = n;
            _wiersze = new Wiersz[n];
           count = 0;
       }
       int getCount() const {
             return count;
       }
       Wiersz * getWiersz(unsigned pos) const {
                 if(pos<count)
                   return _wiersze[pos]
                 else 
                   return NULL;  // wielu by zrobiło throw exception.
       }
       void add(const Wiersz & w){
                if(count==max)
                     throw new std::exception  ("Za dużo");
                _wiersze[cnt++] = w;
       }
};

Nie wiem co to się zadziało w 9. linii (this?) i w 16. (co to pos?). I dlaczego mamy to "prywatyzować" albo "upubliczniać" skoro to i tak "prosty" program do liczenia wierszy. I "throw"?- a cóż to takiego? O ile pamiętam nie uczono mnie na uczelni tego, więc uważam że nie powinienem stosować tego w zadaniu (tak, zadanie to jest jako zadanie z laboratorium, które muszę oddać) :)

0
mateo456 napisał(a):
AnyKtokolwiek napisał(a):

Taką sobie zrobiłem klasę "kontener"

Nie wiem co to się zadziało w 9. linii (this?) i w 16. (co to pos?). I dlaczego mamy to "prywatyzować" albo "upubliczniać" skoro to i tak "prosty" program do liczenia wierszy. I "throw"?- a cóż to takiego? O ile pamiętam nie uczono mnie na uczelni tego, więc uważam że nie powinienem stosować tego w zadaniu (tak, zadanie to jest jako zadanie z laboratorium, które muszę oddać) :)

Zmodyfikowałem, sprawdzone kompilatorem.

1 tego 'this' już nie ma

  1. WIODĄCE jest bezpieczne dodawanie, łącznie z aktualizacją licznika, "w pakiecie". I wszystko co wymieniasz jest na to nakierowane. Jeśli jest prymitywna niebezpieczna tablica, tzreba ją koniecznie zabezpieczyć.

  2. skoro Wiersz * getWiersz było kontrowersyjne, masz tam operator tablicowy

0
AnyKtokolwiek napisał(a):
mateo456 napisał(a):
AnyKtokolwiek napisał(a):

Taką sobie zrobiłem klasę "kontener"

Nie wiem co to się zadziało w 9. linii (this?) i w 16. (co to pos?). I dlaczego mamy to "prywatyzować" albo "upubliczniać" skoro to i tak "prosty" program do liczenia wierszy. I "throw"?- a cóż to takiego? O ile pamiętam nie uczono mnie na uczelni tego, więc uważam że nie powinienem stosować tego w zadaniu (tak, zadanie to jest jako zadanie z laboratorium, które muszę oddać) :)

Zmodyfikowałem, sprawdzone kompilatorem.
1 tego 'this' już nie ma
2. WIODĄCE jest bezpieczne dodawanie, łącznie z aktualizacją licznika, "w pakiecie". I wszystko co wymieniasz jest na to nakierowane;

Ja tę klasę dodaję do struktury czy jak? Im więcej mi wypisujesz, tym bardziej robi się to dla mnie niezrozumiałe i abstrakcyjne. Pomińmy samo liczenie, natomiast chciałbym się skupić na prawidłowym stworzeniu "szkieletu"- czyli te struktury czy tablice czy coś jeszcze.
Myślałem, że jestem bliżej rozwiązania, natomiast ty tą klasą wszystko mi psujesz, że się już zdążyłem pogubić :D

0
mateo456 napisał(a):
AnyKtokolwiek napisał(a):
mateo456 napisał(a):
AnyKtokolwiek napisał(a):

Taką sobie zrobiłem klasę "kontener"

Nie wiem co to się zadziało w 9. linii (this?) i w 16. (co to pos?). I dlaczego mamy to "prywatyzować" albo "upubliczniać" skoro to i tak "prosty" program do liczenia wierszy. I "throw"?- a cóż to takiego? O ile pamiętam nie uczono mnie na uczelni tego, więc uważam że nie powinienem stosować tego w zadaniu (tak, zadanie to jest jako zadanie z laboratorium, które muszę oddać) :)

Zmodyfikowałem, sprawdzone kompilatorem.
1 tego 'this' już nie ma
2. WIODĄCE jest bezpieczne dodawanie, łącznie z aktualizacją licznika, "w pakiecie". I wszystko co wymieniasz jest na to nakierowane;

Ja tę klasę dodaję do struktury czy jak? Im więcej mi wypisujesz, tym bardziej robi się to dla mnie niezrozumiałe i abstrakcyjne. Pomińmy samo liczenie, natomiast chciałbym się skupić na prawidłowym stworzeniu "szkieletu"- czyli te struktury czy tablice czy coś jeszcze.
Myślałem, że jestem bliżej rozwiązania, natomiast ty tą klasą wszystko mi psujesz, że się już zdążyłem pogubić :D

Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd C1075 „{”: nie znaleziono zgodnego tokenu Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 6
Błąd (aktywny) E0020 identyfikator "Wiersz" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd C2143 błąd składniowy: brakuje „;” przed „” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd C2238 nieoczekiwany(e) token(y) poprzedzający(e) ";" Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd (aktywny) E0153 wyrażenie musi mieć typ klasy Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 14
Błąd (aktywny) E0079 oczekiwano specyfikatora typu Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 15
Błąd C2065 "_wiersze": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 15
Błąd C2061 błąd składniowy: identyfikator „Wiersz” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 15
Błąd (aktywny) E0020 identyfikator "Wiersz" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd C2143 błąd składniowy: brakuje „;” przed „
” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd C2334 nieoczekiwany(e) token(y) poprzedzające "{"; pomijanie treści widocznych funkcji Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd (aktywny) E0065 oczekiwano znaku „;” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 24
Błąd (aktywny) E0020 identyfikator "Wiersz" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 27
Błąd C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 27
Błąd C2143 błąd składniowy: brakuje „,” przed „&” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 27
Błąd (aktywny) E0020 identyfikator "cnt" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30
Błąd C2065 "_wiersze": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30
Błąd C2065 "cnt": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30
Błąd C2065 "w": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30

0
mateo456 napisał(a):
mateo456 napisał(a):
AnyKtokolwiek napisał(a):
mateo456 napisał(a):
AnyKtokolwiek napisał(a):

Taką sobie zrobiłem klasę "kontener"

Nie wiem co to się zadziało w 9. linii (this?) i w 16. (co to pos?). I dlaczego mamy to "prywatyzować" albo "upubliczniać" skoro to i tak "prosty" program do liczenia wierszy. I "throw"?- a cóż to takiego? O ile pamiętam nie uczono mnie na uczelni tego, więc uważam że nie powinienem stosować tego w zadaniu (tak, zadanie to jest jako zadanie z laboratorium, które muszę oddać) :)

Zmodyfikowałem, sprawdzone kompilatorem.
1 tego 'this' już nie ma
2. WIODĄCE jest bezpieczne dodawanie, łącznie z aktualizacją licznika, "w pakiecie". I wszystko co wymieniasz jest na to nakierowane;

Ja tę klasę dodaję do struktury czy jak? Im więcej mi wypisujesz, tym bardziej robi się to dla mnie niezrozumiałe i abstrakcyjne. Pomińmy samo liczenie, natomiast chciałbym się skupić na prawidłowym stworzeniu "szkieletu"- czyli te struktury czy tablice czy coś jeszcze.
Myślałem, że jestem bliżej rozwiązania, natomiast ty tą klasą wszystko mi psujesz, że się już zdążyłem pogubić :D

Ważność Kod Opis Projekt Plik Wiersz Stan pominięcia
Błąd C1075 „{”: nie znaleziono zgodnego tokenu Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 6
Błąd (aktywny) E0020 identyfikator "Wiersz" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd C2143 błąd składniowy: brakuje „;” przed „” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd C2238 nieoczekiwany(e) token(y) poprzedzający(e) ";" Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 9
Błąd (aktywny) E0153 wyrażenie musi mieć typ klasy Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 14
Błąd (aktywny) E0079 oczekiwano specyfikatora typu Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 15
Błąd C2065 "_wiersze": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 15
Błąd C2061 błąd składniowy: identyfikator „Wiersz” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 15
Błąd (aktywny) E0020 identyfikator "Wiersz" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd C2143 błąd składniowy: brakuje „;” przed „
” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd C2334 nieoczekiwany(e) token(y) poprzedzające "{"; pomijanie treści widocznych funkcji Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 21
Błąd (aktywny) E0065 oczekiwano znaku „;” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 24
Błąd (aktywny) E0020 identyfikator "Wiersz" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 27
Błąd C4430 brak specyfikatora typu - założono, że int. Uwaga: C++ nie obsługuje domyślnie typu int Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 27
Błąd C2143 błąd składniowy: brakuje „,” przed „&” Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 27
Błąd (aktywny) E0020 identyfikator "cnt" jest niezdefiniowany Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30
Błąd C2065 "_wiersze": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30
Błąd C2065 "cnt": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30
Błąd C2065 "w": niezadeklarowany identyfikator Finalv4 C:\Users\Admin\source\repos\Finalv4\Finalv4.cpp 30

#include <iostream>
#include <string>
using namespace std;

int main()
{
    class Wiersze {
    private:
        Wiersz* _wiersze;  // tablica ze sztym rozmiarem też by mogła być, choć nie sympatyzuję;
        int max;
        int count;
    public:
        Wiersze(int n) {
            this.max = n;
            _wiersze = new Wiersz[n];
            count = 0;
        }
        int getCount() const {
            return count;
        }
        Wiersz* getWiersz(unsigned pos) const {
            if (pos < count)
                return _wiersze[pos]
            else
                return NULL;  // wielu by zrobiło throw exception.
        }
        void add(const Wiersz& w) {
            if (count == max)
                throw new std::exception("Za dużo");
            _wiersze[cnt++] = w;
        }
    };

1 użytkowników online, w tym zalogowanych: 0, gości: 1