Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: do programistów C
Forum PHP.pl > Inne > Hydepark
maciu
Dopiero zaczynam nauke C, więc nie dziwcie się, że pytanie jest takie proste:)

Mam liste danych osobowych kilku osób (tzn. imie i nazwisko). W jaki sposób zrobić aby po kolei wyświetlał mi te dane? Nie wiem nawet w czym mam to zapisać (tablica, struktura?).
Kurcze, dopiero teraz sobie uświadamiam, jakie php jest proste w porównaniu do C
Jabol
zrób tablice struktur ( albo pointer do pointera struktury, jeżeli nie znasz ilości osób ). Potem tylko jakiś algorytm sortujący ( jeżeli nie znasz się na algorytmach to początki możesz sobie zrobić nawet na wikipedii ). Oczywiście funkcja do wykorzystania to będzie strcmp. Tylko jeżeli zrobisz pointer do pointera struktury to pamiętaj, żeby potem najpierw zdealokować imie i nazwisko, potem pointer do struktury, a dopiero na końcu potem pointer do pointera struktury ( bo oczywiście muszisz to najpierw zaalokować ). Jeżeli natomiast zrobisz za pomocą tablicy to wszystko będzie proste, bo do sprzątnięcia będzie tylko imie i nazwisko.
spenalzo
Cytat
Kurcze, dopiero teraz sobie uświadamiam, jakie php jest proste w porównaniu do C

php jest proste w stosunku do większości języków... Np. możesz sobie zmieniać jak chcesz typ zmiennej, np.
Cytat
$zm=1;
$zm=false;
$zm=array(1,2,3);
$zm="jakisciag";

i to wszystko jest poprawne.
A spróbuj coś takiego np. w Pascalu zrobić...
maciu
moglibyście napisać przykładowy kod, tak będzie mi łatwiej zrozumieć
ksiadz
witam
ja podam przyklad ale nie jestem pewiem czy nie ma przypadkiem bledow
Kod
typedef struct ListElmt_

{

void               *data;

struct ListElmt_   *next;

} ListElmt;



typedef struct List_

{



int                size;



int                (*match)(const void *key1, const void *key2);

void               (*destroy)(void *data);



ListElmt           *head;

ListElmt           *tail;



} List;



void list_init(List *list, void (*destroy)(void *data)) {



list->size = 0;

list->destroy = destroy;

list->head = NULL;

list->tail = NULL;



return;



}



void list_destroy(List *list) {



void               *data;



while (list_size(list) > 0) {



   if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy !=

      NULL) {



      list->destroy(data);



   }



}



memset(list, 0, sizeof(List));



return;



}





int list_ins_next(List *list, ListElmt *element, const void *data) {



ListElmt           *new_element;





if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL)

   return -1;





new_element->data = (void *)data;



if (element == NULL) {





   if (list_size(list) == 0)

      list->tail = new_element;



   new_element->next = list->head;

   list->head = new_element;



   }



else {





   if (element->next == NULL)

      list->tail = new_element;



   new_element->next = element->next;

   element->next = new_element;



}





list->size++;



return 0;



}





int list_rem_next(List *list, ListElmt *element, void **data) {



ListElmt           *old_element;





if (list_size(list) == 0)

   return -1;





if (element == NULL) {







   *data = list->head->data;

   old_element = list->head;

   list->head = list->head->next;



   if (list_size(list) == 1)

      list->tail = NULL;



   }



else {





   if (element->next == NULL)

      return -1;



   *data = element->next->data;

   old_element = element->next;

   element->next = element->next->next;



   if (element->next == NULL)

      list->tail = element;



}





free(old_element);





list->size--;



return 0;



}

przeanalizuj ten przyklad dokladnie a wszytko stanie sie jasne, mam nadzieje ze cos to pomoglo smile.gif tylko od ciebie zalezy jak to wykorzystasz
Jabol
definicja struktury:
Kod
struct osoba

{

    char *imie;

    char *nazwisko;

};

definicja zmiennej
Kod
struct osoba osoby[ILOSC_OSOB];

dodanie osoby:
Kod
osoby[ktora].imie=(char *) malloc(dlugoscimie * sizeof(char) + sizeof(char));

osoby[ktora].nazwisko=(char *) malloc(sizeof(char) * dlugoscnazw + sizeof(char));

osoby[ktora].imie=imie;

osoby[ktora].nazwisko=nazwisko;

usuniecie osoby:
Kod
free(osoby[ktora].imie);

free(osoby[ktora].nazwisko);

memset(&osoby[ktora], 0, sizeof(struct osoba));
Tak to by wyglądało.
A sortowanie to porównujesz nazwiko a jeżeli otrzymasz 0
Kod
if(!(int wynik=strcmp(osoby[ktora].nazwisko, osoby[inna].nazwisko)))

{

    // sortuj po imieniu

}

else

{

    //sortowanie

}
maciu
mam taki kod:
Kod
#include <stdio.h>

#include <stdlib.h>



struct osoba

{

    char *imie;

    char *nazwisko;

};



struct osoba osoby[5];



void main()

{

    void *malloc(size_t size);



osoby[1].imie=(char *) malloc(6 * sizeof(char) + sizeof(char));

osoby[1].nazwisko=(char *) malloc(sizeof(char) * 10 + sizeof(char));



osoby[1].imie="maciek";

osoby[1].nazwisko="gorzkowski";



printf("%c %cn", osoby[1].imie, osoby[1].nazwisko);

}


ale coś nie działa. Wiecie co jest nie tak?
FiDO
Kod
void *malloc(size_t size);

Po co to??

Kod
osoby[1].imie="maciek";

osoby[1].nazwisko="gorzkowski";

zmien na:
Kod
strcpy(osoby[1].imie, "maciek");

strcpy(osoby[1].nazwisko, "gorzkowski");


To nie jest php... tu nie ma tak latwo smile.gif
Pozatym tablice indeksuje sie od zera, nie od jedynki.
maciu
nadal jest źle (kompilator nie wykazuje żadnych błędów), funkcja printf nie wyświetla mi zawartości osoby[1].imie, osoby[1].nazwisko
Jabol
a może tak ( przerobiony ciutkę kod ):
Kod
#include <stdio.h>

#include <stdlib.h>



struct osoba

{

    char *imie;

    char *nazwisko;

};



struct osoba osoby[5];



void main()

{

// co to ma być 8O ? >> void *malloc(size_t size); << dzisiaj się już tego nie używa. Popatrz, ze masz plik nagłówkony

extern osoba osoby[5]; //warto dla pewności napisać o co idzie



osoby[0].imie=(char *) malloc(6 * sizeof(char) + sizeof(char));

osoby[0].nazwisko=(char *) malloc(sizeof(char) * 10 + sizeof(char));



strcpy(osoby[0].imie, "maciek");

strcpy(osoby[0].nazwisko, "gorzkowski");// racja FiDO



printf("%s %sn", osoby[0].imie, osoby[0].nazwisko);//tutaj %s zamiast %c

}
a tak wogóle to 'cosika nie działa' oznacza, że co nie działa?
maciu
już działa. mam tylko pytanie związane z tą linijką
Kod
osoby[0].imie=(char *) malloc(6 * sizeof(char) + sizeof(char));


otóż tu jest wpisana liczba znaków 6, ale przecież nie zawsze tak będzie. Da się to jakoś dynamicznie ustawić, aby automatycznie wstawiał długość stringu?

I jeszcze jedno. W jaki sposób zrobić, aby nie trzeba było za każdym razem wpisywać
Kod
osoby[ktora].imie=(char *) malloc(6 * sizeof(char) + sizeof(char));

osoby[ktora].nazwisko=(char *) malloc(sizeof(char) * 10 + sizeof(char));

strcpy(osoby[ktora].imie, "imie");

strcpy(osoby[ktora].nazwisko, "nazwisko");

gdy chce dodać nową osobe. Tak się zastanawiam czy zastosowanie funkcji typedef nie byłoby dobrym rozwiązaniem? A może coś innego
Jabol
Cytat
już działa. mam tylko pytanie związane z tą linijką
Kod
osoby[0].imie=(char *) malloc(6 * sizeof(char) + sizeof(char));


otóż tu jest wpisana liczba znaków 6, ale przecież nie zawsze tak będzie. Da się to jakoś dynamicznie ustawić, aby automatycznie wstawiał długość stringu?
Automatycznie się nie da. Musisz allokować dynamicznie. Poczytaj sobie o funkcji realloc, bezpośrednim wprowadzaniu stringów ( getchar + bezpośrednie działania na pointerach ).
Cytat
I jeszcze jedno. W jaki sposób zrobić, aby nie trzeba było za każdym razem wpisywać
Kod
osoby[ktora].imie=(char *) malloc(6 * sizeof(char) + sizeof(char));

osoby[ktora].nazwisko=(char *) malloc(sizeof(char) * 10 + sizeof(char));

strcpy(osoby[ktora].imie, "imie");

strcpy(osoby[ktora].nazwisko, "nazwisko");

gdy chce dodać nową osobe. Tak się zastanawiam czy zastosowanie funkcji typedef nie byłoby dobrym rozwiązaniem? A może coś innego
To tutaj nic nie da. Tutaj musiałbyś zastosować np. funkcjie o definicji np
Kod
int wstaw(int/* numer w tablicy*/, char *, char */* imie i nazwisko*/);
maciu
Kod
int wstaw(int/* numer w tablicy*/, char *, char */* imie i nazwisko*/);
[/quote]

nie bardzo rozumiem. Jeżeli do takiej funkcji wstawiałbym imie i nazwisko, to też musiałbym tą funkcje wywoływać z parametrami tyle razy ile mam osób, a mi chodzi o to, żeby do tej funkcji automatycznie zostały wstawione parametry, które są gdzieś zapisane (no właśnie, w czym mam je zapisać, może w tablicy?). Np. użyć funkcji for która wykonywałaby się tyle razy ile jest osób, a w ciele for byłaby funkcja wstaw, która automatycznie dodawałaby parametry tych osób.
Jabol
Cytat
Np. użyć funkcji for która wykonywałaby się tyle razy ile jest osób, a w ciele for byłaby funkcja wstaw, która automatycznie dodawałaby parametry tych osób.
dokładnie. Pamiętaj, że tu ( jak już wspominał FiDO ) nie ma tak prosto jak w php. Tutaj wszystko trzeba robić ręcznie.
maciu
tylko mógłbyś mi powiedzieć jak zrobić żeby do funkcji wstaw przypisywał po kolej parametry poszczegółnych osób. W czym maja być zapisane te parametry, aby funkcja wstaw je pobierała?
Jabol
Cytat
W czym maja być zapisane te parametry, aby funkcja wstaw je pobierała?
Ogólnie jak chcesz. To już zależy od Twojej inwencji. Właściwie dopuki nie powiesz skąd chcesz je pobrać nie jestem w stanie Ci dalej pomóc. Może stdin, może być file.
maciu
parametry te chce mieć wpisane w pliku w którym znajduje się cały program
Seth
Moj znajomy ma pewien problem - zadanie do rozwiazania - a ze na C nie znam sie pomyslalem, ze moze ktos byl by z was wstanie napsiac maly programik.

Tresc zadania:
Obliczyc roznice dwoch zbiorow liczb calkowitych.

Z gory dzieki.
Jabol
@Seth: Tutaj masz jakiś tam kodzik. W argumentach podaje się wielkość zbiorów a potem podaje liczby po koleji winksmiley.jpg . Może nie jest to jakaś wielka sztuka, ale raczej nieźle działa ( chociaż można go "oszukać" ) i osobiście nie znalazłem żadnych poważnych błędów.
Kod
#include<stdio.h>

#define BUFSIZE 64



int main(int argc, char **argv)

{

    int *a, *b, a_sum=0, b_sum=0, a_size=0, b_size=0, i, ac=0, bc=0;

    char buf[BUFSIZE];



    if(argc!=3)

    {

        printf("%s <a_size> <b_size>n", *argv);

        return 1;

    }

    a_size=atoi(*(++argv));

    b_size=atoi(*(++argv));

    a=(int *)malloc(a_size*sizeof(int)+sizeof(int));

    b=(int *)malloc(b_size*sizeof(int)+sizeof(int));

    if(!a || !b)

    {

        printf("Out of memoryn");

        return 1;

    }

    printf("Rozpoczynanie programu dla a_size=%i oraz b_size=%in", a_size, b_size);

    memset(a, 0, a_size*sizeof(int)+sizeof(int));

    memset(b, 0, b_size*sizeof(int)+sizeof(int));

    while(a_size--)

    {

        printf("a_size=%in", a_size);

        printf("Podaj liczbe do zbioru a: ");

        i=0;

        while((i-1)<BUFSIZE)

        {

            if((buf[i]=getchar())=='n')

            {

                buf[i]='0';

                break;

            }

            i++;

        }

        *(a)=atoi(buf);

        a_sum+=*(a);

        printf("Pobrano liczbę %in", *(a));

        a++;

        ac++;

    }

    printf("Suma a=%in", a_sum);

    while(b_size--)

    {

        printf("b_size=%in", b_size);

        printf("Podaj liczbe do zbioru b: ");

        i=0;

        while((i-1)<BUFSIZE)

        {

            if((buf[i]=getchar())=='n')

            {

                buf[i]='0';

                break;

            }

            i++;

        }

        *(b)=atoi(buf);

        b_sum+=*(b);

        printf("Pobrano liczbę %in", *(b));

        b++;

        bc++;

    }

    printf("Suma b=%in", b_sum);

    printf("ac=%i, bc=%in", ac, bc);

    printf("Różnica zbiorów a {");

    while(ac--)

        printf("%i,", *(--a));

    printf("b} oraz b {");

    while(bc--)

        printf("%i,", *(--b));

    printf("b} = %in", (a_sum-b_sum));

    free(a);

    free(b);

    return 0;

}
Seth
Wielkie dzieki :]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.