Cześć, od jakiegoś czasu uczę się C, przyszedł czas na listę wskaźnikową, przy okazji jej nauki napisałem program w którym użyłem większości rzeczy których się nauczyłem więc można powiedzieć, że jest to obecnie takie podsumowanie mojej wiedzy oraz pierwszy "większy" program. Języka uczę się sam, trochę z książki, trochę ze stron, w każdym razie nie mam kogo się o coś zapytać oraz nie miałem kontaktu z dobrze napisanym kodem więc nie wiem co jest dobrym nawykiem a co złym.
Celem tego postu jest zwrócenie mi uwagi na wszystkie błędy, słownictwo czy złe nawyki. Jeżeli ktoś ma czas to dziękuję bardzo.
Chciałbym Was zapytać:
- Czy jest dobrze napisany?
- Czy jest napisany w poprawnym C? Bez czegoś z C++?
- Czy kod jest czytelny?
- Co można w nim poprawić?
Jak działa program:
Jego celem jest zapisywanie do listy liczb nieujemnych odczytanych z terminala, 'end' kończy działanie a pozostałe znaki czy tekst uznaje jako błąd i każde podać ponownie liczbę.
Wydaje mi się, że trochę namieszałem pisząc ten program więc dodam tutaj jeszcze kilka komentarzy rozjaśniających.
- linia 21, funkcja 'sprawdz' zwraca mi zero (gdy podałem liczbę) albo jedynkę (gdy wpiszę 'end')
- linia 57, żeby program przy wypisywaniu ostatniej liczby nie kończył przecinkiem np. (34, 54435, 425,) a (34, 54435, 425)
- linia 64, nie wiem na co zamienić goto aby przejść do ponownego wpisywania liczb, z tego co kojarzę to goto powinno się unikać
- linia 70, dodałem aby program sprawdzał całą odczytaną linię, wcześniej miał problem z wpisanymi jednocześnie literami i cyframi
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
typedef struct element {
struct element *next;
int val;
} elementy_listy;
void dodaj(elementy_listy *lista, int *wczytana);
void wypisz(elementy_listy *lista);
int sprawdz(int *wczytana);
int main() {
elementy_listy *first;
int test, *wczytana;
wczytana = malloc(sizeof(int));
printf("Podaj nieujemna liczbe lub wpisz komende 'end' konczaca wpisywanie: ");
test = sprawdz(wczytana);
if (test == 0){
first = (elementy_listy*) malloc (sizeof(elementy_listy));
first -> val = *wczytana;
first -> next = NULL;
} else { return 1; }
while(test == 0){
printf("Podaj kolejna liczbe: ");
test = sprawdz(wczytana);
if(test == 0){
dodaj(first, wczytana);
} else { wypisz(first); }
}
return 0;
}
void dodaj(elementy_listy *lista, int *wczytana){
elementy_listy *wskaznik, *nowy;
wskaznik = lista;
while (wskaznik -> next != NULL){
wskaznik = wskaznik -> next;
}
nowy = (elementy_listy*) malloc (sizeof(elementy_listy));
nowy -> val = *wczytana;
nowy -> next = NULL;
wskaznik -> next = nowy;
}
void wypisz(elementy_listy *lista){
elementy_listy *wskaznik = lista;
while(wskaznik -> next != NULL){
printf("%d, ", wskaznik -> val);
wskaznik = wskaznik -> next;
}
printf("%d", wskaznik -> val);
}
int sprawdz(int *wczytana){
char napis[15], *n;
int i = 0;
wpisz:
n = gets(napis);
if( ((n[0] == 'e') || (n[0] == 'E')) && ((n[1] == 'n') || (n[1] == 'N')) && ((n[2] == 'd') || (n[2] == 'D')) && (n[3] == '\0') ){
return 1;
}
i = 0;
while(n[i] != '\0'){
if(isdigit(n[i]) == 0){
printf("--- Wpisz nieujemna liczbe lub 'end' ---\nPodaj kolejna liczbe: ");
goto wpisz;
} else { i++; }
}
*wczytana = atoi(n);
return 0;
}