Struktura, tablica, baza danych

0

Hejka, tym razem do wykonania takie zadanie, na ten moment tyle udało mi się zrobić.
Tyle, że nie wiem czy o to właśnie chodzi.
A za tą 'statystykę' wgl nie wiem jak się zabrać
Jeśli ktoś byłby w stanie pomóc, byłbym bardzo wdzięczny! :D

(Ps. kompilować się kompiluje, natomiast gdy wpisuje wartości to się wykrzacza, w sensie pierwsze trzy scanf'y działają ale przy roku już wywala i przestaje działać, już nawet nie pokazuje'podaj rok produkcji' )

/*Napisz program wykorzystujący prostą bazę danych samochodów w postaci tablicy
struktur Samochod. Program powinien wczytać liczbę N, po czym stworzyć i wczytać 
N elementową dynamiczną tablicę samochodów. Należy wypisać na ekran pewną statystykę
dotyczącą samochodów w bazie (np. samochód najdroższy lub mający największy
spalanie itd.).*/


#include <stdio.h>

struct Baza
{
double cena;
double spalanie;
int rok;
	
};





int main()
{
int N;
scanf("%d", &N);
int*tab= new int[N];



  Baza samochod[N];
   
   for(int i=0; i<N; i++)
{
	printf("podaj cene  \n");
	scanf("%f", samochod[i].cena);
	printf("podaj spalanie  \n");
	scanf("%f", samochod[i].spalanie);
	printf("podaj rok  \n");
	scanf("%d", samochod[i].rok);
    
}
for(int i=0;i<N;i++)
{
	printf("Cena: %f\n", samochod[i].cena);
	printf("Spalanie: %f\n", samochod[i].spalanie);
	printf("Rok produkcji: %d\n", samochod[i].rok);
}

delete[]tab;
    return 0;       
}
0

Przeszukujesz "bazę" pod kątem maksymalnej/minimalnej wartości jakiejś charakterystki i potem to wypisujesz. Tyle.

1

brakuje & przy kilku scanf (kompilator na pewno ostrzega).
przez to masz UB które kończy się crash-em.

Jako, że to jest C++ to raczej powinieneś używać std::cin i std::cout.

3

troche pogmatwane, ale mamy programować w C, jedynie możemy użyć new i delete z c++ zachowując calą resztę składni z C

To nie jest pogmatwane tylko chore. Dla mnie jest to wyraźna wskazówka na niekompetencję nauczającego.
Prawdopodobnie sam nie wie jak używać malloc free.

1

Niestety na wstępie już widzę jeden problem. Jesteś w stanie zaalokować tablicę struct'ów, o ile korzystasz z kompilatora gcc wersji 7.4, bądź wyżej, lub innego kompilatora, który wspiera takową operację. Kompilator, z którego korzystasz niekoniecznie musi obsługiwać takowe rozwiązanie. Inną opcją jest zdefiniowane np. stałej wielkości tablicy i korzystanie tylko z wyznaczonej ilości elementów.

Baza samochod[100];

Co do statystyki napisałem Ci troche kodu:

struct Baza
{
	int cena;
	float spalanie;
	int rok;
};

void main()
{
	printf("Podaj ilosc samochodow: ");

	int N;
	scanf("%d", &N);

	printf("Wybrano %d samochodow\n", N);

	int najdrozszy = 0, najtanszy = 2147483647, najmlodszy = 2147483647, najstarszy = 0;
	float najmnspalajacy = 0.0f, najwspalajacy = 340282300000000000000000000000000000000.0f;

	Baza samochod[100];
	for(int i=0; i<N; i++)
	{
		printf("Podaj cene samochodu: ");
		scanf("%d", &samochod[i].cena);

		if(samochod[i].cena > najdrozszy)
			najdrozszy = i;
		if(samochod[i].cena < najtanszy)
			najtanszy = i;

		printf("Podaj spalanie samochodu: ");
		scanf("%f", &samochod[i].spalanie);
		printf("Podaj rok produkcji samochodu: ");
		scanf("%d", &samochod[i].rok);
	}

	for(int i=0;i<N;i++)
		printf("Cena: %d, spalanie: %.2f, rok produkcji: %d\n", samochod[i].cena, samochod[i].spalanie, samochod[i].rok);

	printf("Najtanszym samochodem jest: %d o lacznej wartosci: %d.\n", najtanszy + 1, samochod[najtanszy].cena);
	printf("Najdrozszym samochodem jest: %d o lacznej wartosci: %d.\n", najdrozszy + 1, samochod[najdrozszy].cena);
}

Reszte chyba ogarniesz sam.

2
MexikanoS napisał(a):

Niestety na wstępie już widzę jeden problem. Nie jesteś w stanie zaalokować tablicy struct'ów o niestałej wielkości.

Nieprawda. W C Variadic Length Array (VLA) jest częścią standardu i działa.
To w C++ VLA jest niestandardowe i ma prawo nie działać, ale jako, że czasem trzeba mieszać C z C++ to domyślnie kompilatory naruszają ten standard C++.

0

Po prostu wziąłem to co Ty napisaleś, i zmieniłem tą wielkość tablicy ze 100 na N

#include <stdio.h>




struct Baza
{
    int cena;
    float spalanie;
    int rok;
};

 int main()
{
    printf("Podaj ilosc samochodow: ");

    int N;
    scanf("%d", &N);

    printf("Wybrano %d samochodow\n", N);

    int najdrozszy = 0, najtanszy = 2147483647, najmlodszy = 2147483647, najstarszy = 0;
    float najmnspalajacy = 0.0f, najwspalajacy = 340282300000000000000000000000000000000.0f;

    Baza samochod[N];
    for(int i=0; i<N; i++)
    {
        printf("Podaj cene samochodu: ");
        scanf("%d", &samochod[i].cena);

        if(samochod[i].cena > najdrozszy)
            najdrozszy = i;
        if(samochod[i].cena < najtanszy)
            najtanszy = i;

        /*printf("Podaj spalanie samochodu: ");
        scanf("%f", &samochod[i].spalanie);
        printf("Podaj rok produkcji samochodu: ");
        scanf("%d", &samochod[i].rok);*/
        
    }
   

    for(int i=0;i<N;i++)
        printf("Cena: %d, spalanie: %.2f, rok produkcji: %d\n", samochod[i].cena, samochod[i].spalanie, samochod[i].rok);

    printf("Najtanszym samochodem jest: %d o lacznej wartosci: %d.\n", najtanszy + 1, samochod[najtanszy].cena);
    printf("Najdrozszym samochodem jest: %d o lacznej wartosci: %d.\n", najdrozszy + 1, samochod[najdrozszy].cena);
}
1

Czemu Nazywasz strukturę samochod, baza, przecież zgodnie z warunkami zadania, bazą ma być tablica struktur typu samochod, ja to widzę tak (plus szukanie najdroższego na zachetę :) ):

struct samochod {
	double cena;
	double spalanie;
	int rok;
	std::string name;
};
struct samochod mostExpensive(struct samochod arr [], int sz) {
	int maximum = 0;
	int index = 0;
	for (int i = 0; i < sz; ++i) {
		if (arr[i].cena >= maximum){
			maximum = arr[i].cena;
			index = i;
		}
	}
	return arr[index];
}
int main(){
	int N = 10;
	samochod * baza  = new samochod[N]; 
	// tutaj stuff
	delete [] baza;
	std::cout << "\n";
	return 0;
}
0

Przepraszam najmocniej. Wkradł mi się mały błąd w logice. Spróbuj tak:

int najdrozszy = -1, najtanszy = -1

...

if(najdrozszy == -1 || (najdrozszy != -1 && samochod[i].cena > samochod[najdrozszy].cena))
	najdrozszy = i;
if(najtanszy == -1 || (najtanszy != -1 && samochod[i].cena < samochod[najtanszy].cena))
	najtanszy = i;
0

Znów nie wiem czy dobrze, ze pozamieniałem te wszystkie wartości


#include<stdio.h>

struct Baza
{
    int cena;
    float spalanie;
    int rok;
};

int main()
{
    printf("Podaj ilosc samochodow: ");

    int N;
    scanf("%d", &N);

    printf("Wybrano %d samochodow\n", N);

    int najdrozszy = -1, najtanszy = -1, najmlodszy = -1, najstarszy = -1;
    float najmnspalajacy = 0, najwspalajacy = 0;

    Baza samochod[N];
    for(int i=0; i<N; i++)
    {
        printf("Podaj cene samochodu: ");
        scanf("%d", &samochod[i].cena);

        if(najdrozszy == -1 || (najdrozszy != -1 && samochod[i].cena > samochod[najdrozszy].cena))
    	najdrozszy = i;
		if(najtanszy == -1 || (najtanszy != -1 && samochod[i].cena < samochod[najtanszy].cena))
    	najtanszy = i;

        printf("Podaj spalanie samochodu: ");
        scanf("%f", &samochod[i].spalanie);
        
        if(najmnspalajacy==0.||(najmnspalajacy!=0.&&samochod[i].spalanie<samochod[najmnspalajacy].spalanie))
        	najmnspalajacy=i;
        if(najwspalajacy==0.||(najwspalajacy!=0.&&samochod[i].spalanie>samochod[najwspalajacy].spalanie))
        	najwspalajacy=i;
       
	   printf("Podaj rok produkcji samochodu: ");
       scanf("%d", &samochod[i].rok);
    
		if(najmlodszy==-1||(najmlodszy!=-1&&samochod[i].rok>samochod[najmlodszy].rok))
		najmlodszy=i;
		if(najstarszy==-1||(najmlodszy!=-1&&samochod[i].rok<samochod[najstarszy].rok))
		najstarszy=i;
	}

    for(int i=0;i<N;i++)
        printf("Cena: %d, spalanie: %.2f, rok produkcji: %d\n", samochod[i].cena, samochod[i].spalanie, samochod[i].rok);

    printf("Najtanszym samochodem jest: %d o lacznej wartosci: %d.\n", najtanszy + 1, samochod[najtanszy].cena);
    printf("Najdrozszym samochodem jest: %d o lacznej wartosci: %d.\n", najdrozszy + 1, samochod[najdrozszy].cena);
    
    
    printf("Najmniej spalajacym samochodem jest: %d spala: %f.\n", najmnspalajacy + 1, samochod[najmnspalajacy].spalanie);
    printf("Najwiecej spalajacym samochodem jest: %d spala: %f.\n", najwspalajacy + 1, samochod[najwspalajacy].spalanie);
    
    printf("Najmlodszym samochodem jest: %d wyprodukowany w %d.\n", najmlodszy + 1, samochod[najmlodszy].rok);
    printf("Najstarszym samochodem jest: %d wyprodukowany w %d.\n", najstarszy + 1, samochod[najstarszy].rok);
    
}
0

Cały masz struct baza, gdy zadanie prosi o struct samochód.

0
kq napisał(a):

Cały masz struct baza, gdy zadanie prosi o struct samochód.

teraz w porządku?
Nie zmienia faktu, ze nie wiem co zrobić by program dobrze działał też dla floatów :/


#include<stdio.h>

struct Samochod
{
    int cena;
    float spalanie;
    int rok;
};

int main()
{
    printf("Podaj ilosc samochodow: ");

    int N;
    scanf("%d", &N);

    printf("Wybrano %d samochodow\n", N);

    int najdrozszy = -1, najtanszy = -1, najmlodszy = -1, najstarszy = -1;
    float najmnspalajacy = 0, najwspalajacy = 0;

    Samochod baza[N];
    for(int i=0; i<N; i++)
    {
        printf("Podaj cene samochodu: ");
        scanf("%d", &baza[i].cena);

        if(najdrozszy == -1 || (najdrozszy != -1 && baza[i].cena > baza[najdrozszy].cena))
    	najdrozszy = i;
		if(najtanszy == -1 || (najtanszy != -1 && baza[i].cena < baza[najtanszy].cena))
    	najtanszy = i;

        printf("Podaj spalanie samochodu: ");
        scanf("%f", &baza[i].spalanie);
        
        if(najmnspalajacy==0.||(najmnspalajacy!=0.&&baza[i].spalanie<baza[najmnspalajacy].spalanie))
        	najmnspalajacy=i;
        if(najwspalajacy==0.||(najwspalajacy!=0.&&baza[i].spalanie>baza[najwspalajacy].spalanie))
        	najwspalajacy=i;
       
	   printf("Podaj rok produkcji samochodu: ");
       scanf("%d", &baza[i].rok);
    
		if(najmlodszy==-1||(najmlodszy!=-1&&baza[i].rok>baza[najmlodszy].rok))
		najmlodszy=i;
		if(najstarszy==-1||(najmlodszy!=-1&&baza[i].rok<baza[najstarszy].rok))
		najstarszy=i;
	}

    for(int i=0;i<N;i++)
        printf("Cena: %d, spalanie: %.2f, rok produkcji: %d\n", baza[i].cena, baza[i].spalanie, baza[i].rok);

    printf("Najtanszym samochodem jest: %d o lacznej wartosci: %d.\n", najtanszy + 1, baza[najtanszy].cena);
    printf("Najdrozszym samochodem jest: %d o lacznej wartosci: %d.\n", najdrozszy + 1, baza[najdrozszy].cena);
    
    
    printf("Najmniej spalajacym samochodem jest: %d spala: %f.\n", najmnspalajacy + 1, baza[najmnspalajacy].spalanie);
    printf("Najwiecej spalajacym samochodem jest: %d spala: %f.\n", najwspalajacy + 1, baza[najwspalajacy].spalanie);
    
    printf("Najmlodszym samochodem jest: %d wyprodukowany w %d.\n", najmlodszy + 1, baza[najmlodszy].rok);
    printf("Najstarszym samochodem jest: %d wyprodukowany w %d.\n", najstarszy + 1, baza[najstarszy].rok);
    
}
0
it234 napisał(a):

Nie zmienia faktu, ze nie wiem co zrobić by program dobrze działał też dla floatów :/

To łaskawie wytłumacz co chciałbyś konkretnie osiągnąć tutaj, bo to co robisz nie ma najmniejszego sensu.

0

Jak wyżej, czemu tak się Motasz? Jakich floatów, WTF? Spróbuj zrobić tak jak sugerowałem tutaj: https://4programmers.net/Forum/C_i_C++/335371-struktura_tablica_baza_danych?p=1648121#id1648121

1

Słodziaku.. Skoro już zmieniliśmy wszystko na indeksy, czyli integery to nie korzystamy przy if'ach z floatów..

void main()
{
    printf("Podaj ilosc samochodow: ");

    int N;
    scanf("%d", &N);

    printf("Wybrano %d samochodow\n", N);

    int najdrozszy = -1, najtanszy = -1, najmlodszy = -1, najstarszy = -1, najmnspalajacy = -1, najwspalajacy = -1;

    Baza samochod[100];
    for(int i=0; i<N; i++)
    {
		printf("Podaj cene samochodu: ");
		scanf("%d", &samochod[i].cena);
		
		if(najdrozszy == -1 || (najdrozszy != -1 && samochod[i].cena > samochod[najdrozszy].cena))
			najdrozszy = i;
		if(najtanszy == -1 || (najtanszy != -1 && samochod[i].cena < samochod[najtanszy].cena))
			najtanszy = i;

        printf("Podaj spalanie samochodu: ");
        scanf("%f", &samochod[i].spalanie);

        if(najmnspalajacy == -1 || (najmnspalajacy != -1 && samochod[i].spalanie < samochod[najmnspalajacy].spalanie))
            najmnspalajacy=i;
        if(najwspalajacy == -1 || (najwspalajacy != -1 && samochod[i].spalanie>samochod[najwspalajacy].spalanie))
            najwspalajacy=i;

       printf("Podaj rok produkcji samochodu: ");
       scanf("%d", &samochod[i].rok);

        if(najmlodszy == -1 || (najmlodszy != -1 && samochod[i].rok > samochod[najmlodszy].rok))
			najmlodszy=i;
        if(najstarszy == -1 || (najmlodszy != -1 && samochod[i].rok < samochod[najstarszy].rok))
			najstarszy=i;
    }

    for(int i=0;i<N;i++)
        printf("Cena: %d, spalanie: %.2f, rok produkcji: %d\n", samochod[i].cena, samochod[i].spalanie, samochod[i].rok);

    printf("Najtanszym samochodem jest: %d o lacznej wartosci: %d.\n", najtanszy + 1, samochod[najtanszy].cena);
    printf("Najdrozszym samochodem jest: %d o lacznej wartosci: %d.\n", najdrozszy + 1, samochod[najdrozszy].cena);

	printf("Najmniej spalajacym samochodem jest: %d spala: %f.\n", najmnspalajacy + 1, samochod[najmnspalajacy].spalanie);
    printf("Najwiecej spalajacym samochodem jest: %d spala: %f.\n", najwspalajacy + 1, samochod[najwspalajacy].spalanie);

    printf("Najmlodszym samochodem jest: %d wyprodukowany w %d.\n", najmlodszy + 1, samochod[najmlodszy].rok);
    printf("Najstarszym samochodem jest: %d wyprodukowany w %d.\n", najstarszy + 1, samochod[najstarszy].rok);
}

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