Tabela wskaźników struktury, struktura w C.

0

Witajcie,

Mam problem z poniższym kodem. Program wysypuje się na liczniku czasu wykonania i zupełnie nie mam pojęcia jak z tego problemu wybrnąć a czas niestety nagli.

 // Defines the entry point for the console application.
//



#include "limits.h" 
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "stdafx.h"
#include "time.h"
#include <cstdio>


/* Zdefiniuj typ strukturalny zawierający 3 pola (int, char, double ). Następnie zaimplementuj funkcje do obsługi zdefiniowanego typu:
losowanie – funkcja, kasowanie – funkcja, sortowanie – funkcja, zliczanie znaków – funkcja.
W funkcji main() programu wywołaj następująco sekwencję funkcji (oznaczenia czas start, czas stop oznaczają początek i koniec pomiaru czasu wykonania wraz z wyświetleniem czasu wykonania) */

struct DATA {
	int liczba_int;
	char znak;
	double liczba_double;
};

/*funkcja losowania znaków*/  char Losuj_char() {
	char znak = rand() % 255;
	return(znak);
}

/*funkcja losowania liczb*/ int Losuj_int() {
	int no = rand() % INT_MAX;
	return (no);
}


DATA** Losuj_dane(int N) {
	/*dynamiczna tablice wskaznikow na struktury typu DATA */
	struct DATA **ptr_tab;

	/*rezerwowanie miejsca na tablicę wskaźników*/
	ptr_tab = (struct DATA**)malloc(N*sizeof(int));

	/*rezerwowanie pod każdy wskaźnik pamięci na DATA*/
	for (int i = 0; i<N; i++) {
		ptr_tab[i] = (struct DATA*) malloc(sizeof(struct DATA));
		ptr_tab[i]->liczba_int = Losuj_int();
		ptr_tab[i]->znak = Losuj_char();
		ptr_tab[i]->liczba_double = 0;
	}
	return(ptr_tab);

}

void Kasuj_dane(struct DATA** ptr_tab, int N) {

	for (int i = 0; i<N; i++){
		free(ptr_tab[i]);
	}
	free(ptr_tab);
}


void Sortuj_dane(struct DATA** ptr_tablica, int N) {
	do
	{
		for (int i = 1; i<N; i++)
		{
			if (ptr_tablica[i-1]->liczba_int > ptr_tablica[i]->liczba_int)
			{
				struct DATA *wsk = ptr_tablica[i];
				ptr_tablica[i-1] = ptr_tablica[i];
				ptr_tablica[i] = wsk;
				wsk = NULL;
			}
		}
		N--;
	} while (N>1);
}

void Zliczanie_znakow(DATA** ptr_tablica, int N, char znak){

	int licznik_znakow = 0;
	for (int i = 0; i<N; i++)
	{
		do 		{

		licznik_znakow++;

		} while (ptr_tablica[i]->znak == znak);

		printf("Znak: %c \n", znak);
		printf("liczba wystapien znaku: %d", licznik_znakow);
	}
}

void LOSOWANIE(int N, char szukaj_znak) {

	clock_t start, stop;
	double time;

	struct DATA** ptr_tablica;

	start = clock(); /*start programu*/

	ptr_tablica = Losuj_dane(N);
	Sortuj_dane(ptr_tablica, N);
	Zliczanie_znakow(ptr_tablica, N, szukaj_znak);

	stop = clock();
	time = (stop - start) / CLK_TCK;

	Kasuj_dane(ptr_tablica, N);

	//stop = clock();
	//time = (stop - start) / CLK_TCK;

	printf("Losowanie: %d \n", N);
	printf("Czas wykonania: %0.50f", time);
	getchar();
}

int _tmain(int argc, _TCHAR* argv[])
{
	LOSOWANIE(1000, 'A');
	LOSOWANIE(10000, 'B');
	LOSOWANIE(100000, 'C');

	system("pause");
	getchar();
	getchar();

	return 0;
}
0

ptr_tab = (struct DATA**)malloc(N*sizeof(struct DATA*)); - przy 64 bitowym kompilatorze to może być przyczyną.
printf("Czas wykonania: %0.50lf", time); - na niektórych kompilatorach double - %lf

0

Po wprowadzeniu sugerowanych przez ciebie zmian pojawia się następujący błąd

<image>b51653ee44.png</image>

1

Jest tu kilka problemów, to o czym mówisz jest spowodowane niepoprawnym sortowaniem.
Tu masz poprawione: http://ideone.com/H58ove

#include <limits.h> 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

 
 
/* Zdefiniuj typ strukturalny zawierający 3 pola (int, char, double ). Następnie zaimplementuj funkcje do obsługi zdefiniowanego typu:
losowanie – funkcja, kasowanie – funkcja, sortowanie – funkcja, zliczanie znaków – funkcja.
W funkcji main() programu wywołaj następująco sekwencję funkcji (oznaczenia czas start, czas stop oznaczają początek i koniec pomiaru czasu wykonania wraz z wyświetleniem czasu wykonania) */
 
struct DATA {
        int liczba_int;
        char znak;
        double liczba_double;
};
 
/*funkcja losowania znaków*/  char Losuj_char() {
        char znak = rand() % 255;
        return(znak);
}
 
/*funkcja losowania liczb*/ int Losuj_int() {
        int no = rand() /*% INT_MAX*/;
        return (no);
}
 
 
struct DATA** Losuj_dane(int N) {
	printf("Losuj_dane: %d \n", N);
        /*dynamiczna tablice wskaznikow na struktury typu DATA */
        struct DATA **ptr_tab;
 
        /*rezerwowanie miejsca na tablicę wskaźników*/
        ptr_tab = (struct DATA**)malloc(N*sizeof(struct DATA*));
 if(!ptr_tab) exit(1);
        /*rezerwowanie pod każdy wskaźnik pamięci na DATA*/
        for (int i = 0; i<N; i++) {
                ptr_tab[i] = (struct DATA*) malloc(sizeof(struct DATA));
 if(!ptr_tab[i]) exit(2);
                ptr_tab[i]->liczba_int = Losuj_int();
                ptr_tab[i]->znak = Losuj_char();
                ptr_tab[i]->liczba_double = 0;
        }
        return(ptr_tab);
 
}
 
void Kasuj_dane(struct DATA** ptr_tab, int N) {
        printf("Kasuj_dane: %d \n", N);
    
        for (int i = 0; i<N; i++){
                free(ptr_tab[i]);
        }
        free(ptr_tab);
}
 
 
void Sortuj_dane(struct DATA** ptr_tablica, int N) {
        printf("Sortuj_dane: %d \n", N);
        do
        {
                for (int i = 1; i<N; i++)
                {
                        if (ptr_tablica[i-1]->liczba_int > ptr_tablica[i]->liczba_int)
                        {
                                struct DATA *wsk = ptr_tablica[i];
                                ptr_tablica[i] = ptr_tablica[i-1];
                                ptr_tablica[i-1] = wsk;
                        }
                }
                N--;
        } while (N>1);
}
 
void Zliczanie_znakow(struct DATA** ptr_tablica, int N, char znak){
 
        printf("Zliczanie_znakow: %d \n", N);
        int licznik_znakow = 0;
        for (int i = 0; i<N; i++)
        {
                //do                 {
 
                if(ptr_tablica[i]->znak == znak) licznik_znakow++;
 
                //} while (ptr_tablica[i]->znak == znak);
 
                //printf("Znak: %c \n", znak);
                //
        }
        printf("liczba wystapien znaku: %d\n", licznik_znakow);
}
 
void LOSOWANIE(int N, char szukaj_znak) {
 
        printf("LOSOWANIE: %d \n", N);
        clock_t start, stop;
        double time;
 
        struct DATA** ptr_tablica;
 
        start = clock(); /*start programu*/
 
        ptr_tablica = Losuj_dane(N);
        Sortuj_dane(ptr_tablica, N);
        Zliczanie_znakow(ptr_tablica, N, szukaj_znak);
 
        stop = clock();
        time = (stop - start) / CLOCKS_PER_SEC;
 
        Kasuj_dane(ptr_tablica, N);
 
        //stop = clock();
        //time = (stop - start) / CLOCKS_PER_SEC;
 
        if(time>=0)
        printf("Losowanie: %d \n", N);
        //printf("Czas wykonania: %0.50f", time);
        //getchar();
}
 
int main()
{
        LOSOWANIE(1000, 'A');
        LOSOWANIE(10000, 'B');
        LOSOWANIE(100000, 'C');
 
        //system("pause");
        //getchar();
        //getchar();
 
        return 0;
}

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