Przekazywanie wzkazników do elemetntów tablicy struktur

0

Witam. Mam do napisania program na zaliczenie laboratorium i nie mogę sobie poradzić z przekazywaniem elementów tablicy struktur do innej funkcji. Po krotce opisze co mam do zarobienia i jakich zasad mam się trzymać.

Programy muszą być napisane z użyciem niezależnych funkcji i wskaźników (jeśli konieczne),
nie używać referencji i zmiennych globalnych.

  1. Zadeklaruj strukturę umożliwiającą przechowywanie informacji o wybranym przedmiocie np.
    b) dane o płytach:
  • wykonawca,
  • tytuł,
  • liczba utworów,
  • czas nagrania itp.

a następnie napisz proste menu, które umożliwia wykorzystanie wymienionych poniżej funkcji:
a) funkcję, umożliwiającą wprowadzenie z klawiatury danych o jednym przedmiocie
(wypełnienie wszystkich pól struktury) i zapamiętanie ich w tablicy.
b) funkcję umożliwiającą wypisanie na ekranie wszystkich danych zapamiętanych w strukturze
(np. w postaci tabelki)
c) funkcje umożliwiające usunięcie z tablicy danych o wybranym przedmiocie, uporządkowanie wszystkich
danych zapamiętanych w tablicy według wybranego klucza (np. uporządkowanie pól opisujących
samochody według marki)
d) funkcję, która umożliwia zapis i odczyt danych do pliku *.txt

//DEKLARACJE
#include <iostream.h>
#include <fstream.h>

//PROTOTYPY
void menu();
void dodaj(struct katalog[],int n);
void wypisz();
void otworz();

//GŁÓWNA FUNKCJA
void main()
{

struct plyta                    // dekrlaracja struktury
{
string wykonawca, album, gatunek;
short int rok, utworow, ID;
float czas, cena;
} katalog[33];
char funkcja;                   //deklaracja zmiennej dla switch'a
int n=0;

        std::getline(std::cin, katalog[4].wykonawca);
        katalog[1].wykonawca="Antonio Vivaldi";
        katalog[2].wykonawca="A Perfect Circle";
        katalog[2].album="Mer De Noms";
        katalog[2].gatunek="Hard Rock";
        katalog[2].rok=2000;
        katalog[2].utworow=12;
        katalog[2].czas=62.22;
        katalog[2].cena=39.99;


menu();

   while (funkcja!='q')
   {
        std::cin >> funkcja;
      switch (funkcja) {
         case '1' :
            dodaj(katalog[],n);
            for (int i = 0; i < 15; i++)
{
        std::cout << endl << katalog[i].wykonawca;
}
            break;
         case '2' :
            wypisz();
            break;
         case '3' :
            otworz();
            break;
         case '4' :
            break;
         case '5' :
            break;
         case '6' :
            test();
            break;
         case 'm' :
            menu();
            break;
         default :
            std::cout << endl << "Wybierz jedna z dostepnych funkcji!" << endl;
      }
   }
}

void menu()
{
system("cls");
std::cout << "Wybierz czynnosc:" << endl;
std::cout << "1) Dodaj plyte" << endl
          << "2) Wyswietl spis" << endl
          << "3) Usun z katalogu" << endl
          << "4) Wypisz posortowane" << endl
          << "5) Zapisz do pliku" << endl
          << "6) Wczytaj z pliku" << endl
          << "m) MENU" << endl
          << "q) Wyjdz" << endl;
}

void dodaj(katalog[], int n)
{
menu();
katalog[n].wykonawca="jeee"
}

void wypisz()
{
menu();
/*
        std::cout << endl << "Wykonawca: " << katalog[0].wykonawca;
        std::cout << endl << "Album: " << katalog[0].album;
        std::cout << endl << "Gatunek: " << katalog[0].gatunek;
        std::cout << endl << "Rok wydania: " << katalog[0].rok;
        std::cout << endl << "Liczba utworow: " << katalog[0].utworow;
        std::cout << endl << "Laczny czas utowrow na plycie: " << katalog[0].utworow;
        std::cout << endl << "Cena: " << katalog[0].cena;
*/
}

void otworz()
{
	ifstream f("dane.txt");
	int tablica[20];
	int i=0;
	while(f >> tablica[i]) i++;
	f.close();

	cout << "Tablica: ";
	int j;
	for(j=0;j<i;j++)
		cout <<tablica[j]<< endl;
	cout << endl;
}

Nie mam pojęcia w jaki sposób to zrobić na wskaźnikach. Gdybym mógł użyć zmiennych globalnych to żadnego problemu by nie było. Bardzo proszę o pomoc.

0

typ tablica[] to w praktyce to samo co tablica*. nazwa tablicy jest wskaznikiem na jej pierwszy element, tak wiec mozesz w bardzo prosty sposob przekazac tablice poprzez wskaznik. wygladaloby to np. tak:

...
//deklaracje typow lepiej na poczatku  dawac
struct plyta                    // dekrlaracja struktury
{
string wykonawca, album, gatunek;
short int rok, utworow, ID;
float czas, cena;
};
...
void wypisz(plyta* kat, int ilosc);
...

//GŁÓWNA FUNKCJA
void main()
{
    //a nie we funkcjach! tutaj tylko utworzenie zmiennych
    plyta katalog[33];
    ...

   while (funkcja!='q')
   {
         ....
         case '2' :
            wypisz(katalog, 2);   //przekazanie tablicy poprzez wskaznik, oraz ilosci wpisow - tak zeby funkcja przypadkiem nie wyszla poza tablice
            break;
         ...
      }
   }
}

....

//wypiszmy wszystkie..
void wypisz(plyta* kat, int ilosc)
{
    using namespace std;
    for(int i=0;i<ilosc;++i)  //wlasnie tu byl rozmiar potrzebny. 
    {   cout << "Wykonawca: " << katalog[i].wykonawca << endl;  //a do i-tej rzeczy spod wskaznika
        cout << "Album: " << katalog[i].album << endl;         //odwolujesz sie jak do tablicy..
        cout << "Gatunek: " << katalog[i].gatunek << endl;
        cout << "Rok wydania: " << katalog[i].rok << endl;
        cout << "Liczba utworow: " << katalog[i].utworow << endl;
        cout << "Laczny czas utowrow na plycie: " << katalog[i].utworow << endl;
        cout << "Cena: " << katalog[i].cena << endl ;
    }
}
...
0

Dziękuje bardzo, myślałem, że to jest bardziej skomplikowane, kombinowałem z kilka razy bardziej trudnymi rzeczami, a wystarczyło coś takiego. Mam jeszcze jedno pytanie, czy jeżeli struktura z Twojego rozwiązania nie jest już czasem zmienną globalną? Czy do struktur się inaczej odnosi? Bo nie mogę używać zmiennych globalnych, takie życzenie profesora.

0

nie, nie jest. to jest tylko definicja typu danych. tak jak mowisz bylo u Ciebie. zwroc uwage na subtelna roznice:

Ty miales:

struct plyta {
...
} katalog[33]; //definicja typu i od razu deklaracja zmiennej

ja mam:

struct plyta {
...
}; //definicja typu
...
plyta katalog[33]; //deklaracja zmiennej

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