wskaznik na strukute , puste wyswietlenia ,A**a

0

Cześć programuje od niedawna i mam problem , a mianowicie , dodaje mi wszystko ładnie zero błędu , wydaje mi się że w linijce 38 jest błąd ,ale inaczej mi to nie działa .
Kiedy chce wyświetlić zawartość tablicy , program wie na której pozycji w tablicy jest element niepusty , ale jest on tak jakby ukryty , po prostu jakby go nie było i nie wiem co z tym zrobić :< , jakby ktoś mógłby pomóc byłbym wdzięczny .

#include <cstdlib>
#include <iostream>
#include <string>
#include <float.h>

using namespace std;

struct student;
struct przedmioty;

int n;

void pamiec(student **&a,przedmioty **&b,int);
void sprawdzanie(studenta,przedmiotyb,int n);
void dodaj(studenta,przedmiotyb);
void kasuj(studenta);
void wyswietl(student
a,przedmiotyb,int );
float srednia(przedmioty
b,int );

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FUNKCJA GLOWNA~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int main()
{

printf ("Podaj ilosc studentow : ");
cin >> n;
student**a;
przedmioty**b;


pamiec(a,b,n); 
system("cls");
sprawdzanie(*a,*b,n);  //TU JEST COS  Z TYMI GWIAZDKAMI ALE INACZEJ NIE DZIALA
system("PAUSE");

}

///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~STRUKTURY~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

						//~~~~~~~~~~~~~~~~~~~~~DANE~~~~~~~~~~~~~

struct student
{

   string imie;
   string nazwisko;
   float srednia_ocen;
   int wiek;

};

//~~~~~~~~~~~~~~~~~~~~~PRZEDMIOTY~~~~~~~~~~~~~
struct przedmioty
{
float matematyka;
float biologia;
float polski;
float angielski;
float informatyka;
};

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FUNKCJE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void pamiec(student **&a,przedmioty &b,int n)
{
a=new student
[n];
b=new przedmioty
[n];
for (int i=0;i<n;i++)
{
a[i] = new student[n];
b[i] = new przedmioty[n];
};

};

//~~~~~~~~~~~~~~~~~~~~~DODAWANIE~~~~~~~~~~~~~

void dodaj(studenta,przedmiotyb)
{
printf( "\n\nPodaj numer studenta, ktorego dane chcesz edytowac : ");
int numer;
cin >> numer;
system("cls");
printf ("\n\nPodaj kolejno : imie, nazwisko, wiek\n");
cin >> a[numer].imie;
cin >> a[numer].nazwisko;
cin >> a[numer].wiek;
a[numer].srednia_ocen = srednia(b,numer);
system("cls");

}

						//~~~~~~~~~~~~~~~~~~~~~KASOWANIE~~~~~~~~~~~~~

void kasuj(student*a)
{

printf("\n\nPodaj numer studenta, ktorego dane chcesz skasowac : ");
int numer;
cin >>numer;
a[numer].imie ="";
a[numer].nazwisko = " ";
a[numer].srednia_ocen = 0;
a[numer].wiek = 0;

}

						//~~~~~~~~~~~~~~~~~~~~~WYSWIETLANIE~~~~~~~~~~~~~

void wyswietl(studenta,przedmiotyb ,int n)
{

printf("\n\nWyswietlanie zawartosci tablicy dynamicznej:\n");
printf("\n\nIlosc struktur %d:\n");
for (int i = 0; i < n; i++)
{
	if (a[i].imie != "") {
		printf("\n%d",i);
		printf("\nImie :"  ,a[i].imie);
		printf("\nNazwisko :" , a[i].nazwisko);
		printf("\nSrednia ocen :" , a[i].srednia_ocen);
		printf("\nwiek :" , a[i].wiek);
		printf("\n");

	}
}
 

}

							//~~~~~~~~~~~~~~~~~~~~~SREDNIA~~~~~~~~~~~~~

float srednia(przedmioty*b,int numer)
{
float sred;

	cout<< "Podaj ocene z :\n";
	cout<< "matematyka\n";
	cin >> b[numer].matematyka;
	cout<< "biologii\n";
	cin >> b[numer].biologia;
	cout<<	"polski\n";
	cin >> b[numer].polski;
	cout<< "angielski\n";
	cin >> b[numer].angielski;
	cout<< "informatyka\n";
	cin >> b[numer].informatyka;
	sred = (((b[numer].matematyka) + (b[numer].biologia) + (b[numer].polski) + (b[numer].angielski) + (b[numer].informatyka))/5);
	return sred;
	

}

						//~~~~~~~~~~~~~~~~~~~~~SPRAWDZANIE~~~~~~~~~~~~~

void sprawdzanie(student *a,przedmioty *b,int ) // TUTAJ CHCIALEM PRZEKAZAC NIBY DOBRZE ALE I TAK c****
{

 string dzialanie = "koniec";
do
{
	printf("\n\nPodaj, co chcesz zrobic \ndodaj\nkasuj\nwyswietl\nkoniec\n  ");
	cin >>dzialanie;
	if (dzialanie != "koniec" && dzialanie != "dodaj" && dzialanie != "kasuj" && dzialanie != "wyswietl")
		dzialanie = "koniec";
	
	if (dzialanie == "dodaj")
	{
		system("cls");
		dodaj(a,b);
	}
	if (dzialanie == "kasuj")
		{
		system("cls");
		kasuj(a);
	}
		
	if (dzialanie == "wyswietl")
	{
		system("cls");
		wyswietl(a,b,n);
		}
		
}while (dzialanie != "koniec");

};

4

Sformatuj kod, usuń zbędne puste wiersze, podaj w znacznikach code
Bez tego jakoś nawet nie chcę mi się na to patrzeć, bardzo możliwe że innym też.

0

poprawiłem kod, niestety tego u góry nie mogłem edytować , bo utworzyłem bez posiadanego konta .

#include <cstdlib>
#include <iostream>
#include <string>
#include <float.h>

using namespace std;

struct student;
struct przedmioty;
int n;
void pamiec(student **&a,przedmioty **&b,int);  
void sprawdzanie(student*a,przedmioty*b,int n); 
void dodaj(student*a,przedmioty*b);
void kasuj(student*a);
void wyswietl(student*a,przedmioty*b,int );
float srednia(przedmioty*b,int );

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FUNKCJA GLOWNA~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int main()
{
	printf ("Podaj ilosc studentow : ");
      cin >> n;
	student**a;
	przedmioty**b;
	pamiec(a,b,n); 
	system("cls");
    sprawdzanie(*a,*b,n);  //TU JEST COS Z WYLUSKANIEM ALE INACZEJ NIE DZIALA
    system("PAUSE");
}

///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~STRUKTURY~~~~~~~~~~~~~~~~~~~~~~~~~~~~~				
							//~~~~~~~~~~~~~~~~~~~~~DANE~~~~~~~~~~~~~
struct student
{
      string imie;
       string nazwisko;
       float srednia_ocen;
       int wiek;
};

//~~~~~~~~~~~~~~~~~~~~~PRZEDMIOTY~~~~~~~~~~~~~
 struct przedmioty
{
	float matematyka;
	float biologia;
	float polski;
	float angielski;
	float informatyka;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FUNKCJE~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void pamiec(student **&a,przedmioty **&b,int n)  
{
	a=new student*[n];
	b=new przedmioty*[n];
	for (int i=0;i<n;i++)
		{
			a[i] = new student[n];
			b[i] = new przedmioty[n];
		};
		
};
//~~~~~~~~~~~~~~~~~~~~~DODAWANIE~~~~~~~~~~~~~
void dodaj(student*a,przedmioty*b)
{
	printf( "\n\nPodaj numer studenta, ktorego dane chcesz edytowac : ");
    int numer;
    cin >> numer;
	system("cls");
    printf ("\n\nPodaj kolejno : imie, nazwisko,  wiek\n");
    cin >> a[numer].imie;
    cin >> a[numer].nazwisko;
    cin >> a[numer].wiek;
	a[numer].srednia_ocen = srednia(b,numer);
	system("cls");
	
	
}
						//~~~~~~~~~~~~~~~~~~~~~KASOWANIE~~~~~~~~~~~~~
void kasuj(student*a)
{
	printf("\n\nPodaj numer studenta, ktorego dane chcesz skasowac : ");
    int numer;
    cin >>numer;
    a[numer].imie ="";
    a[numer].nazwisko = " ";
    a[numer].srednia_ocen = 0;
    a[numer].wiek = 0;
}
							//~~~~~~~~~~~~~~~~~~~~~WYSWIETLANIE~~~~~~~~~~~~~
void wyswietl(student*a,przedmioty*b ,int n)
{
	printf("\n\nWyswietlanie zawartosci tablicy dynamicznej:\n");
	printf("\n\nIlosc struktur %d:\n");
	for (int i = 0; i < n; i++)
	{
		if (a[i].imie != "") {
			printf("\n%d",i);
			printf("\nImie :"  ,a[i].imie);
			printf("\nNazwisko :" , a[i].nazwisko);
			printf("\nSrednia ocen :" , a[i].srednia_ocen);
			printf("\nwiek :" , a[i].wiek);
			printf("\n");
		}
	}	 
}
								//~~~~~~~~~~~~~~~~~~~~~SREDNIA~~~~~~~~~~~~~
float srednia(przedmioty*b,int numer)
{
	float sred;
	
		cout<< "Podaj ocene z :\n";
		cout<< "matematyka\n";
		cin >> b[numer].matematyka;
		cout<< "biologii\n";
		cin >> b[numer].biologia;
		cout<<	"polski\n";
		cin >> b[numer].polski;
		cout<< "angielski\n";
		cin >> b[numer].angielski;
		cout<< "informatyka\n";
		cin >> b[numer].informatyka;
		sred = (((b[numer].matematyka) + (b[numer].biologia) + (b[numer].polski) + (b[numer].angielski) + (b[numer].informatyka))/5);
		return sred;
}		
							//~~~~~~~~~~~~~~~~~~~~~SPRAWDZANIE~~~~~~~~~~~~~
void sprawdzanie(student *a,przedmioty *b,int )  // TUTAJ CHCIALEM PRZEKAZAC NIBY DOBRZE ALE I TAK LIPA
{
	 string dzialanie = "koniec";
    do
    {
		printf("\n\nPodaj, co chcesz zrobic \ndodaj\nkasuj\nwyswietl\nkoniec\n  ");
		cin >>dzialanie;
		if (dzialanie != "koniec" && dzialanie != "dodaj" && dzialanie != "kasuj" && dzialanie != "wyswietl")
			dzialanie = "koniec";
		
		if (dzialanie == "dodaj")
		{
			system("cls");
			dodaj(a,b);
		}
		if (dzialanie == "kasuj")
			{
			system("cls");
			kasuj(a);
		}
			
		if (dzialanie == "wyswietl")
		{
			system("cls");
			wyswietl(a,b,n);
			}
			
	}while (dzialanie != "koniec");
};
						
1

Napisz kod w jednym języku może?

0

myślę że printf nie stanowi problemu , reszty z tego co kojarzę nie zapożyczałem z C :P , chociaz teraz jak na to patrze xD

0

Ja wiem, że nie stanowi problemu, ale mnie oczy bolą. BTW. nie jestem na 100% pewny, ale powiedz mi jak ma działać ta funkcja

void sprawdzanie(student *a,przedmioty *b,int ) 
2

Po co tworzysz 2-wymiarową tablicę n x n studentów (i przedmiotów), skoro potem i tak korzystasz tylko z pierwszej tablicy. I gdzie masz usuwanie tych dynamicznych tablic?
Skoro używasz std::string, to zainteresuj się też std::vector, unikniesz wycieków pamięci i potworków wskaźnikowych.

myślę że printf nie stanowi problemu
@szedik93 To powiedz mi, co to poniżej robi?

printf("\nImie :"  ,a[i].imie);

Podpowiedź: skąd printf ma wiedzieć gdzie wstawić to imię?

I jeszcze to:

printf("\n\nIlosc struktur %d:\n");
0

przyznaje moja głupota z tym printf, wyszło na to wyszło że nic nie robi , poprawiłem na cout i działa jak należy
usuwanie tablic dynamicznych jeszcze nie zrobiłem , bo nie mogłem pokonać jednej przeszkody
wszystko dziala jak nalezy , temat do usuniecia

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