Jak zadeklarowac zmienna x bedaca struktura

0

mam pewną strukturę i przy sortowaniu potrzebuję, aby jeden jej element był zmienną "x" nie da się przypisać po prosto x=tablica[1]; bo nie wiem jak zaedeklarować x do przechowywania takiej struktury, struktura składa się tak:

typedef struct UCZEN
{
char imie[20];
char nazwisko[40];
char klasa[10];
float srednia;
};

a ja chcę, żeby x był jednym z wyników tej struktury, po prostu przekopiować do niego wartości z innej tablicy

1

struct UCZEN x;

0
_13th_Dragon napisał(a)

struct UCZEN x;

Dzięki ! Wiedziałem, że to musi być proste. Jesteś Wielki.

Kolejne pytanie mam

#include <cstdlib>
#include <iostream>
#define N 10
using namespace std;

void losuj(int [], int);
void wyswietl(int [], int);
void przyporzadkuj(int [], int [], int);
void sortuj_wstawianie(int [], int);
void sortuj_wybor (int [], int);
void sortuj_babelki(int [], int);


int main(int argc, char *argv[])
{
 	int dane[N], t2[N], t3[N];
 	losuj(dane,N);
 	przyporzadkuj(dane,t2,N);
 	przyporzadkuj(dane,t3,N);
 	cout<<"Przed sortowaniem: "<<endl;
 	wyswietl(dane,N);
 	wyswietl(t2,N);
 	wyswietl(t3,N);
 	sortuj_wstawianie(dane,N);
 	sortuj_wybor (t2,N);
 	sortuj_babelki(t3,N);
 	cout<<"Po sortowaniu: "<<endl;
 	wyswietl(dane,N);
 	wyswietl(t2,N);
 	wyswietl(t3,N);
 	


 	
 	
 	
    system("PAUSE");
    return EXIT_SUCCESS;
}

void losuj(int dane[],int ile_elementow)
{
 srand((unsigned)time(NULL));

  for(int i=0; i < ile_elementow; i++) dane[i] = rand() % 30;

}


void wyswietl(int t[],int n)
{
int i; 	 
for(int i=0; i<n; i++)
{
 		cout<<t[i]<<" ";
        
}
cout<<endl;
}


void sortuj_wstawianie(int dane[],int n)     
{     
     int i,j,x;
     
     for(j=n-2;j>=0;j--)
     {
                         x=dane[j];
                         i=j+1;
                         while(i<=n && x>dane[i])
                         {
                         dane[i-1]=dane[i];
                         i++;
                                    }
                                    
                         dane[i-1]=x;
                         }
}	   	



void sortuj_wybor (int dane[], int n)
{
     
 	 int i=0,j,t,x;
 	 
 	 
 	 do
 	   {
	   	  	t=i;
	   	  	
	   	  	
	   	  	
	   	  	for(j=i+1;j<=n-1;j++)
	   	  	{
                               if(dane[t]>dane[j])
	   	  				   {
						   		t=j;
						   		
					       }
            }
			x=dane[t];
			dane[t]=dane[i];
			dane[i]=x;
			i++;
			

			
			}
			while (i<n-1);			   	

}





void sortuj_babelki(int dane[], int n)
{
 	 int i=0,j,t;
 	 bool p;
 	 
 	 do
 	   {
	   	  	p=true;
	   	  	for(j=0;j<n-i-1;j++)
	   	  	if(dane[j]>dane[j+1])
	   	  				   {
						   		t=dane[j];
						   		dane[j]=dane[j+1];
						   		dane[j+1]=t;
						   		p=false;
					       }
			i++;
			}
			while (p==false);			   	
 	 
}




void przyporzadkuj(int t1[], int t2[], int n)
{
 	 int i;
 
 	 for(i=0;i<n;i++)
 	 {
	  				 t2[i]=t1[i];
					 }
}

Przy sortowaniu nagle jeden z elementów się zeruje, nie wiem czemu? Jakiś błąd w sortowaniu, czy w zapisie czy w czym? Co to może być. Reszta jest ułożona dobrze i on też jest w dobrym miejscu, ale wyświetlany jako zera. Plik dane, który przetwarzam przedstawia się tak: i Grzegorza Cygana mi zeruje po posegregowaniu według średniej, ZERUJE osobę która ma najwyższą średnią :(

Przemyslaw Chlopek 2k 5.12
Ewelina Ciochon 2k 5.120
Agnieszka Cygan 2k 5.354
Grzegorz Cygan 2k 5.442
Michal Dadej 2k 4.323
Jaroslaw Fraczek 2k 5.242
Piotr Gawle 2k 5.121
Mateusz Hamowski 2k 5.144
Dariusz Rzepka 2k 4.445
Adrianna Pochron 2k 4.550
Bartlomiej Chamowski 2d 4.021

1

przy którym sortowaniu?

0
_13th_Dragon napisał(a)

przy którym sortowaniu?
Działa tylko to co wciskasz 6. Reszta na razie nie zrobiona :) więc przy sortowaniu ze średnimi.

Co więcej działa, jeżeli we funkcji sortującej jest znak w przeciwną stronę, wtedy od najw. do najmniejszego sortuje, jak jest odwrotnie to struktura z najw. średnią jest chyba zerowana, a przynajmniej wyskakuje po jej całym wyświetleniu 0. To pewnie jakiś głupi mój błąd albo w zapisie albo w jakimś moim założeniu, albo coś czego w ogóle nie wiem, że może wystąpić.

0

Ze co? Czy na pewno rozmawiamy o tym samym kodzie?

0
_13th_Dragon napisał(a)

Ze co? Czy na pewno rozmawiamy o tym samym kodzie?

Strasznie przepraszam nie to skopiowałem, co potrzeba. To działa w 100 % ok.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#define MAX 40


using namespace std;

typedef struct UCZEN
{
char imie[20];
char nazwisko[40];
char klasa[10];
float srednia;
};

void dodaj_ucznia(UCZEN tablica[MAX], int& i)
{
     
     cout<<"Podaj imie ucznia"<<endl;
     gets(tablica[i].imie);
     cout<<"Podaj nazwisko ucznia"<<endl;
     gets(tablica[i].nazwisko);
     cout<<"Podaj klase ucznia"<<endl;
     gets(tablica[i].klasa);
     cout<<"Podaj srednia ucznia"<<endl;
     cin>>tablica[i].srednia;
     i++;
     system("CLS");
     }
void dopliku(UCZEN tablica[MAX], int i)
{
         fstream zapis; 
         zapis.open("zapis.txt",ios::out); 
         if(zapis.good()==true)
         {
         cout<<"Otwieranie pliku powiodlo sie"<<endl;                     
         for(int k=0;k<i;k++)
         zapis<<tablica[k].imie<<" "<<tablica[k].nazwisko<<" "<<tablica[k].klasa<<" "<<tablica[k].srednia<<endl;
         zapis.close();
         cout<<"Zakonczono zapisywanie\n"<<endl;  
         }
         else cout<<"Pliku nie otwarto"<<endl;
         
 }     
void menu()
{
cout<<"Menu - Wybierz:\n1 - wczytaj dane uczniow z klawiatury\n3 - wczytaj dane uczniow z pliku\n4 - wyswietl dane uczniow wg nazwisk"
<<"\n5 - wyswietl dane uczniow wg imion\n6 - wyswietl dane uczniow wg srednich\n7 - wyswietl dane uczniow wg klas. "
<<"W przypadku uczniow z jednej klasy kryterium sortowania to nazwisko\n2 - zapisz dane do pliku\n0 - aby zakonczyc"<<endl;
}

void wczytaj(UCZEN tablica[MAX],int& i)
{
     fstream plik;
     int m=0;
     plik.open("dane.txt",ios::binary|ios::in); 
     if(plik)
  {
   while(plik>>tablica[m].imie>>tablica[m].nazwisko>>tablica[m].klasa>>tablica[m].srednia) ++m;
   i=m;
  }
else cout<<"Nie udalo sie otworzyc pliku/n";

 }

void sortuj(UCZEN tablica[MAX], int n, int odp)
{ 
     switch(odp)
     {
                case 6:
                     {
                         struct UCZEN x;
                                                  
     int i,j;     
     for(j=n-2;j>=0;j--)
     {
                         x=tablica[j];
                         i=j+1;
                         while(i<=n && x.srednia>tablica[i].srednia)
                         {
                         tablica[i-1]=tablica[i];
                         i++;
                                    }
                                    
                         tablica[i-1]=x;
                         }                          
                                   
                         }
                                
                                break;
                default: cout<<"Error\n\n"; break;
                }
     
      
 }
void wyswietl(UCZEN tablica[MAX], int n)
{
     for(int l=0;l<n;l++)
     cout<<tablica[l].nazwisko<<" "<<tablica[l].imie<<" "<<tablica[l].klasa<<" "<<tablica[l].srednia<<endl;
     cout<<"\n\n";
 }





int main(int argc, char *argv[])
{
    int odp=10, i=0; 

    UCZEN* tablica=new UCZEN[MAX];
 

  

do
{
   
menu();    
(cin>>odp).sync();
system("CLS");
switch(odp)
{
           case 1:
                dodaj_ucznia(tablica,i); break;
           case 0:
                    {
                                       system("PAUSE");
                                       return EXIT_SUCCESS;    

                                       } 
          case 2:
               dopliku(tablica,i); break; 
          case 3:
               wczytaj(tablica,i); break;   
          case 4: 
               sortuj(tablica, i, odp); break;         
          case 5: 
               sortuj(tablica, i, odp); break;  
          case 6: 
               {
                               sortuj(tablica, i, odp);
                               wyswietl(tablica, i); break;
               }
          case 7: 
               sortuj(tablica, i, odp); break;                                                        
          default: cout<<"Zle dane\n\n"; break;                              


}


}
while(odp!=0);



system("PAUSE");
return EXIT_SUCCESS;
}

 

We funkcji sortuj w while jest znak > jak zmienię na < to jest ok, ale jak pozostawie >, chcąc żeby było od najmniejszego to zeruje największą wartość, być może błąd w funkcji, proszę sprawdź: przykładowe dane z notatnika, jeżeli wczytasz te dane np. z pliku dane.txt to osoba z najw. średnią, w tym wypadku Agnieszka zostanie skasowana i wyskoczy 0. Nie ma tego błędu jak jest <

Przemyslaw Chlopek 2k 5.12
Ewelina Ciochon 2k 5.120
Agnieszka Cygan 2k 5.354
Grzegorz Cygan 2k 5.05
Michal Dadej 2k 6.01
Jaroslaw Malysz 2k 5.242
Piotr Gawle 2k 5.121
Mateusz Hamowski 2k 5.144
Dariusz Skorka 2k 4.445
Seksowna Ada 2k 4.550
Bartlomiej Chamowski 2d 4.021

1

while(i<=n && ...
wyłazisz poza n elementów, ma być:
while(i<n && ...

Poza tym zupełnie wypatrzyłeś ten algorytm, masz znaleźć maksimum z całości i wymienić z ostatnim miejscem, portem maksimum z całości ale beż ostatniego i wymienić z przedostatnim itd.
A ty najpierw znajdujesz pierwszy większy od przedostatniego włączając jeden poza i wymieniasz go ostatnim, nawet nie wiem czy ten kaleka wciąż potrafi sortować.

0

To jest sortowanie przez wstawianie. Taki algorytm nam przedstawił p. profesor, algorytm szybciej potrafi sortować. Błąd był rzeczywiście z wykraczaniem. Thx

_13th_Dragon napisał(a)

while(i<=n && ...
wyłazisz poza n elementów, ma być:
while(i<n && ...

Poza tym zupełnie wypatrzyłeś ten algorytm, masz znaleźć maksimum z całości i wymienić z ostatnim miejscem, portem maksimum z całości ale beż ostatniego i wymienić z przedostatnim itd.
A ty najpierw znajdujesz pierwszy większy od przedostatniego włączając jeden poza i wymieniasz go ostatnim, nawet nie wiem czy ten kaleka wciąż potrafi sortować.

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