Ilość elementów tablicy

0

tak jak w temacie.
w jaki sposób mogę odczytać ilość elementów poszczególnych tablic
i wyświetlić ich zawartość
czy będę musiał przebudować i użyć struktury?

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    const char * nut[] = { "wloskie", "laskowe", "pistacje" };
    const char * apple[] = { "Antonowka", "McIntosh" };
    const char * blackberry[] = { "Malina", "Truskawka", "Jagoda", "Pozeczka", "Borowka" };
    const char * fruit[] = { "Czereśnia", "Wiśnia", "Agrest" };
    const char **arr[] = { nut, apple, blackberry, fruit };


    int num = ((unsigned)(sizeof(arr) / sizeof(arr[0]) ) );

    for(int i = 0; i < num; ++i )
    {
        //cout << *arr[ i ] << "\n";
        int n = ((unsigned)(sizeof(arr[i]) / sizeof(char*) ) ); //nietrafione
        for(int j = 0; j < n; ++j )
        {
            const char ** wsk = &arr[i][j];
            //cout << arr[ i ][ j ] << " ";
            cout << * wsk << " ";
            ++wsk;
        }
        cout << "\n";

    } 
   
   return 0;
}

4
#include <iostream>
using namespace std;

int main()
{
    const char * nut[] = { "wloskie", "laskowe", "pistacje" };
    const char * apple[] = { "Antonowka", "McIntosh" };
    const char * blackberry[] = { "Malina", "Truskawka", "Jagoda", "Pozeczka", "Borowka" };
    const char * fruit[] = { "Czereśnia", "Wiśnia", "Agrest" };
    struct { const char **data; size_t size; } arr[] = 
	{
		{ nut,sizeof(nut)/sizeof(*nut) }, 
		{ apple,sizeof(apple)/sizeof(*apple) }, 
		{ blackberry,sizeof(blackberry)/sizeof(*blackberry) }, 
		{ fruit,sizeof(fruit)/sizeof(*fruit) }, 
	};

    for(size_t i=0;i<sizeof(arr)/sizeof(*arr);++i,cout<<"\n")
    {
        for(size_t j=0;j<arr[i].size;++j)
        {
            cout<<arr[i].data[j]<<" ";
        }
    }    
    return 0;
}

#define na rozmiar potrzebujesz tylko jeden - ale lepiej unikać tego w C++

#include <iostream>
using namespace std;
#define SIZEOF(array) (sizeof(array)/sizeof(*array))

int main()
{    
    const char * nut[] = { "wloskie", "laskowe", "pistacje" };
    const char * apple[] = { "Antonowka", "McIntosh" };
    const char * blackberry[] = { "Malina", "Truskawka", "Jagoda", "Pozeczka", "Borowka" };
    const char * fruit[] = { "Czereśnia", "Wiśnia", "Agrest" };
    struct { const char **data; size_t size; } arr[] = 
	{
		{ nut,SIZEOF(nut) }, 
		{ apple,SIZEOF(apple) }, 
		{ blackberry,SIZEOF(blackberry) }, 
		{ fruit,SIZEOF(fruit) }, 
	};

    for(size_t i=0;i<SIZEOF(arr);++i,cout<<"\n")
    {
        for(size_t j=0;j<arr[i].size;++j)
        {
            cout<<arr[i].data[j]<<" ";
        }
    }    
    return 0;
}

W sumie jeszcze lepiej użyć vector

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

int main()
{    
    static const vector<string> nut { "wloskie", "laskowe", "pistacje", };
    static const vector<string> apple = { "Antonowka", "McIntosh", };
    static const vector<string> blackberry = { "Malina", "Truskawka", "Jagoda", "Pozeczka", "Borowka", };
    static const vector<string> fruit = { "Czereśnia", "Wiśnia", "Agrest", };
    static const vector<vector<string>> arr =  { nut,apple,blackberry,fruit, };

    for(size_t i=0;i<arr.size();++i,cout<<"\n")
    {
        for(size_t j=0;j<arr[i].size();++j)
        {
            cout<<arr[i][j]<<" ";
        }
    }    
    return 0;
}

Bo można użyć foreach

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


int main()
{    
    static const vector<string> nut { "wloskie", "laskowe", "pistacje", };
    static const vector<string> apple { "Antonowka", "McIntosh", };
    static const vector<string> blackberry { "Malina", "Truskawka", "Jagoda", "Pozeczka", "Borowka", };
    static const vector<string> fruit { "Czereśnia", "Wiśnia", "Agrest", };
    static const vector<vector<string>> arr { nut,apple,blackberry,fruit, };

    for(auto row : arr)
    {
        for(auto cell : row)
        {
            cout<<cell<<" ";
        }
        cout<<endl;
    }    
    return 0;
}

Oraz nie deklarować tablic pośredfnich:

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


int main()
{    
    static const vector<vector<string>> arr
	{
	    { "wloskie", "laskowe", "pistacje", },
	    { "Antonowka", "McIntosh", },
	    { "Malina", "Truskawka", "Jagoda", "Pozeczka", "Borowka", },
	    { "Czereśnia", "Wiśnia", "Agrest", },
	};

    for(auto row : arr)
    {
        for(auto cell : row)
        {
            cout<<cell<<" ";
        }
        cout<<endl;
    }    
    return 0;
}
4

Dodam, trick sizeof(tab)/sizeof(tab[0]) działa poprawnie tylko tam, gdzie tablica jest zadeklarowana.

NIE DZIAŁA gdy tablica np jest przekazana jako argument funkcji.
A nawet gorzej, ""działa" w tym seisnie, ze nie ma błędów kompilacji, tylko rezultat jest patologiczny

Ze wszech miar jestem przeciwnikiem C ze strumieniami, to jest chore. Należy korzystać z szerokiego spektrum C++, np vector'ów

0

żebyście nie pomyśleli że próżnowałem, dodałem już funkcje aad, modify czy delete , a poniżej tak na sztywno

#include <iostream>
#include <vector>

using namespace std;

struct Warzywniak
{
    int ID;
    string name;
    vector<string> gatunek;
};

int main()
{
   vector<Warzywniak> produkt
    {
        { 1, "Kawa", {"Zbozowa", "Mleczna", "Czarna"} },
        { 2, "Orzechy", {"Wloskie", "Laskowe", "Pistacje"} },
        { 3, "Warzywa", {"Ziemniaki", "Pomidory", "Marchewka", "Ogorki", "Cebula", "Czosnek"} },
        { 4, "Owoce", {"Jablka", "Truskwaki", "Agrest", "Maliny"} }
    };

    for(auto el: produkt)
    {
        cout << el.ID << " " << el.name << " : ";
        for(auto produkt: el.gatunek)
            cout << produkt << ", ";
        cout << "\n";
    }
   
   return 0;
}
3

@WWA2025:
Nazwy zmiennych / klas chyba kłamią. Mam wątpliwości co to Warzywniak, ale produkt jest na pewno d/d .
I gatunek też mocno średniawy
W programowaniu obiektowym jak zaczniesz siebie okłamywać co do prawdziwej tożsamości, to się nie wyplątasz

5

Zmień

for(auto el: produkt)

na

for(const auto& el: produkt)

bo za każdym razem tworzysz niepotrzebną kopię struktury Warzywniak.

P.S To samo dotyczy wewnętrznej pętli.

1

wiem, że niefortunnie nazwałem te zmienne ale inne nie przychodziły mi do głowy — WWA2025 11 minut temu

Moja znajoma ma zasadę: mam słabą pamięć, więc wolę mówić prawdę.

Pierwszy stopień programowania obiektowego, elementarny, to naturalne nazwy z życia: towar, magazyn, katalog (towarów), cennik, koszyk, zamówienie, zakup - takie jaka jest prawda.
Na gacie (chyba ??? - żyjemy w wolnym kraju) nie mówisz czapka ?

Drugi to zauważenie, że koszyk jabłek nie jest jabłkiem (to szpilka do głupich wprowadzeń do OOP, że wszystko się dziedziczy). Tu na razie nie psujesz nic w tym stylu, ale po fałszych nazwach to łatwo grozi.
Fałszywe nazwy zepchną cię na fałszywe myślenie, i poleci

0
  1. Czy w dobrym kierunku zmierzam
#include <iostream>
#include <vector>
#include <iomanip>

using namespace std;

struct Magazyn;
struct Produkt;

struct Produkt
{
    int id_produktu;
    string nazwa_produktu;
    double cena;
    int stan_magazynowy;
};

struct Magazyn
{
    int id_dzialu;
    string asortyment;
    vector<Produkt> katalog;
};

int main()
{
    vector<Magazyn> towar
    {
        { 1, "Kawa", { {1,"Czarna", 20.26, 100}, {2,"Kakaowa", 16.20, 100}, {3,"Zbozowa", 14.00, 100} } },
        { 2, "Orzechy", { {1,"Wloskie", 18.22, 10 }, {2,"Laskowe", 15.00, 10}, {3,"Pistacje", 21.00, 20} } },
        { 3, "Warzywa", { {1,"Ziemniaki", 1.80, 500}, {2,"Pomidory", 6.00, 120}, {3,"Marchewka", 2.00, 150}, {4,"Ogorki", 3.00, 130},
        {5,"Cebula", 3.00, 80}, {6,"Czosnek", 2.50, 60}, {7,"Pietruszka", 2.10, 90}, {8,"Rzodkiew", 3.00, 95} } },
        { 4, "Owoce", { {1,"Jablka", 6.26, 125}, {2,"Truskwaki", 10.20, 65}, {3,"Agrest", 9.00, 40}, {4,"Maliny", 7.00, 33} } }
    };


    for(const auto& el: towar)
    {
        cout << el.id_dzialu << " " << el.asortyment << "\n";
        for(int i = 0; i < 66; ++i)cout << "_";
        cout << "\n";
        for(const auto& towar: el.katalog)
            cout << el.id_dzialu << "." << towar.id_produktu << " "
            << right << setw(18) << setfill(' ') << towar.nazwa_produktu
            << right << setw(10) << setfill(' ') << fixed << setprecision(2)<< towar.cena << " .zl\t"
            << "dostepnych " << towar.stan_magazynowy << "\n";
        cout << "\n";
    }


    return 0;
}


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