Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> do programistów C
maciu
post
Post #1





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Jabol
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
spenalzo
post
Post #3





Grupa: Zarejestrowani
Postów: 2 064
Pomógł: 1
Dołączył: 22.01.2003
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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ć...


--------------------

Go to the top of the page
+Quote Post
maciu
post
Post #4





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


moglibyście napisać przykładowy kod, tak będzie mi łatwiej zrozumieć
Go to the top of the page
+Quote Post
ksiadz
post
Post #5





Grupa: Zarejestrowani
Postów: 39
Pomógł: 0
Dołączył: 24.11.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Jabol
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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

}
Go to the top of the page
+Quote Post
maciu
post
Post #7





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
FiDO
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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.


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
maciu
post
Post #9





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


nadal jest źle (kompilator nie wykazuje żadnych błędów), funkcja printf nie wyświetla mi zawartości osoby[1].imie, osoby[1].nazwisko
Go to the top of the page
+Quote Post
Jabol
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
maciu
post
Post #11





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Jabol
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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*/);
Go to the top of the page
+Quote Post
maciu
post
Post #13





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Jabol
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
maciu
post
Post #15





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Jabol
post
Post #16





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
maciu
post
Post #17





Grupa: Zarejestrowani
Postów: 238
Pomógł: 1
Dołączył: 27.08.2003

Ostrzeżenie: (0%)
-----


parametry te chce mieć wpisane w pliku w którym znajduje się cały program
Go to the top of the page
+Quote Post
Seth
post
Post #18





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Jabol
post
Post #19





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


@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;

}
Go to the top of the page
+Quote Post
Seth
post
Post #20





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

Ostrzeżenie: (0%)
-----


Wielkie dzieki :]
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 05:28