[C] sortowanie liczb, blad kompilacji

0

Dlaczego zwracany jest problem z deklaracja funkcji?

main

#include <stdio.h>
#include <stdlib.h>

#define MAX_ROZM 100

extern int pobierz(int tab[], int n);
extern void sort(int tab[], int n);
extern void wyswietl(const int tab[], int n);


int main()
{
  int liczby[MAX_ROZM];
  int rozmiar;

  rozmiar=pobierz(liczby, MAX_ROZM);
  printf("\nPierwotne dane (%d wartosci):\n",rozmiar);
  wyswietl(liczby, rozmiar);
  sort(liczby, rozmiar);
  puts("Posortowane dane: ");
  wyswietl(liczby, rozmiar);

    return 0;
}



pobierz

#include <stdio.h>
#define NIENUM 0
#define TAKNUM 1

int pobierz(int tablica[], int granica)
{
    int num, stan;
    int index = 0;

    printf("Ten program konczy odczywywanie liczb po pobraniu %d ", granica);
    printf("wartosci\n lub w przypadku wpisania EOF. Pierwsza wartosc: ");
    stan=scanf("%d", &num);
    while(index<granica && stan!=EOF)
    {
        if (stan==TAKNUM)
        {
            tablica[index++]=num;
            printf("%d przyjete. ",num);
            if (index<granica)
            {
                printf("Nastepna wartosc: ");
                stan=scanf("%d",&num);
            }
        }
        else if(stan==NIENUM)
        {
            scanf("*s");  //pozbywa zlych danych wejsciowych
            printf("To nie byla liczba calkowita! Wpisz liczbe calkowita, aby\n");
            printf("kontynuowac lub cos, co nie jest liczba, aby zakonczyc: ");
            if((stan=scanf("%d", &num))==NIENUM)
            break;
        }
        else
        {
            printf("Ups! Program nie powinien dotrzec w to miejsce!\n");
            break;
        }
    }
    if(index==granica)
    printf("wszystkie %d elementow tablicy zostalo wypelnione.\n",granica);
    return(index);
}

sort


void sort(int tablica[], int granica)
{
    int gora, szuk, temp;

    for(gora=0; gora<granica-1; gora++)
        for(szuk=gora+1; szuk<granica; szuk++)
            if(tablica[szuk]>tablica[gora])
            {
                temp=tablica[szuk];
                tablica[szuk]=tablica[gora];
                tablica[gora]=temp;
            }
}

wyswietl

#include <stdio.h>
void wyswietl(const int tablica[], int granica)
{
    int index;

    for(index=0; index<granica; index++)
    {
        printf("%d ", tablica[index]);
        if(index % 10==9)
        putchar('\n');
    }
    if (index%10!=0)
    putchar('\n');

</cpp>
0

Bo coś jest źle. Jaki konkretnie błąd?

0

undefined reference to 'funkcja'

w miejscu funkcji - pobierz, wyswietl, sort...

0

A dodałeś te wszystkie pliki do projektu, tzn czy ty w ogóle je wkompilowujesz do programu?

0

chyba tak, w Code::Blocks mam po lewej:

Sources
main.c
pobierz.c
sort.c
wyswietlanie.c

i tak normalnie klikam kompiluj, trzeba cos jeszcze zrobic by bylo wiadomo ze pozostale pliki naleza do projektu?

0

W czym kompilujesz projekt? Jeśli w GCC to powinno to wyglądać tak:

gcc main.c pobierz.c sort.c wyswietl.c

A w ogóle jeśli definicje funkcji masz w osobnych plikach, to lepiej deklaracje włożyć w plik nagłówkowy i includować go do każdego pliku źródłowego.

I abstrahując od problemu z kompilacją: dlaczego sortujesz malejąco? Z reguły sortuje się od elementu najmniejszego do największego.

0

ok, dzieki, poradzielm sobie z problemem...

sortuje w ten sposob, bo takie mam polecenie zadania po przeczytaniu danego rozdzialu, ale z odwrotnym sortwaniem nie bedzie problemu...

0

jeszcze mam takie pytanko:

mam wygenerowac 1000 liczb z przedzialu 1-10. Program powinien dokonac tego dla 10 roznych wartosci ziarna. Program powinien wyswietlic ile razy dana liczba zostala wylosowana.

czy sposob zliczania wyswietlen nie jest zbyt "amatorski"?
Czy można to jakos inaczej zrobic?


#include <stdio.h>
#include <stdlib.h>

 static unsigned long int nast=1;
 void zlos1(unsigned int x);
 int los1(void);

 void wyswietl(const int tablica[], int granica);


int main()
{
    int licz;
    unsigned ziarno;
    int tab[1000];

    printf("podaj wybrane ziarno.\n");
    scanf("%u", &ziarno);
    zlos1(ziarno);
    for(licz=0; licz<1000;licz++)
        tab[licz]=los1();

     printf("\n\nwygenerowalem 1000 losowych liczb w zakresie 1-10\n\n");



    wyswietl(tab,1000);


















    return 0;
}

int los1(void){
    //wzor na generowanie losowych
    nast= rand()%10+1;
    return (unsigned int)(nast);
}

void zlos1(unsigned int ziarno)
{
    nast=ziarno;
}





void wyswietl(const int tab[], int granica)
{
    int index;

    static int a,b,c,d,e,f,g,h,i,j;

    for(index=0; index<granica; index++)
    {
        if(tab[index]==1)
        a++;

        else if(tab[index]==2)
        b++;

        else if(tab[index]==3)
        c++;

        else if(tab[index]==4)
        d++;

        else if(tab[index]==5)
        e++;

        else if(tab[index]==6)
        f++;

        else if(tab[index]==7)
        g++;

        else if(tab[index]==8)
        h++;

        else if(tab[index]==9)
        i++;

        else if(tab[index]==10)
        j++;

    }

        printf( "10 wywolane %d\n9 wywolane %d\n8 wywolane %d\n7 wywolane %d\n6 wywolane %d\n5 wywolane %d\n4 wywolane %d\n3 wywolane %d\n2 wywolane %d\n1 wywolane %d\n",
        j,i,h,g,f,e,d,c,b,a);

}

0
podaj wybrane ziarno.
5


wygenerowalem 1000 losowych liczb w zakresie 1-10

10 wywolane 94
9 wywolane 109
8 wywolane 87
7 wywolane 89
6 wywolane 109
5 wywolane 96
4 wywolane 116
3 wywolane 103
2 wywolane 101
1 wywolane 96
podaj wybrane ziarno.
2


wygenerowalem 1000 losowych liczb w zakresie 1-10

10 wywolane 94
9 wywolane 109
8 wywolane 87
7 wywolane 89
6 wywolane 109
5 wywolane 96
4 wywolane 116
3 wywolane 103
2 wywolane 101
1 wywolane 96

Liczba wywołań powinna zależeć od ziarna. Zamiast pisać funkcję ustawiania ziarna użyj funkcji srand().

0

@owen: a nie łatwiej było zrobić to za pomocą zliczania?

int zliczanie[11]={};
for(int i=0; i<granica; i++)
  zliczanie[tab[i]]++;
//a potem wypisanie
for(int i=1;i<11;i++)
  printf("%d wywolane %d\n",i,zliczanie[i])

?

0

dzieki

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