Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <wchar.h>
  4. #include <locale.h>
  5. #include <string.h>
  6. #include "lista.h"
  7.  
  8. void open_dyk(char name[100], dyk *head){ /// Tak sie nie przekazuje tablic w c !!
  9.     wchar_t buf[1000];
  10.     FILE *dyktando; /// Wskaźniki zawsze powinny być zainicjalizowne !!!
  11.     dyktando = fopen(name, "r+");
  12.     if(dyktando == NULL){
  13.         wprintf(L"Błąd otwarcia pliku!\n");
  14.     }else{
  15.         while(fgetws(buf,1000,dyktando)!=NULL){ /// Nie przeczytałeś dobrze dokumentacji tej funkcji, NULL jest tylko jeśli napotka WEOF przed zczytaniem jakiekolwiek znaku
  16.             wprintf(L"\n %s", &buf); // Powinno być %ls
  17.             add_to_bottom(buf, head);
  18.         }
  19.         print_all(head);
  20.     }
  21.     fclose(dyktando);
  22. }
  23.  
  24. void check_dyk(char name[100]){ ///To samo co przy poprzedniej funkcji
  25.     wchar_t *answers[100][10]; /// Naprawde chciałeś zadeklarować tablice 100 x 10 z typem danych wchar_t* ? Innymi słowy tworzysz tablice 100 wskaźników do tablic z 10 wskaźnikami, które z kolei nie wskazują na nic, a raczej wskazują ale w kompletnie losowe miejsca
  26.     wchar_t *your_answers[100][10];
  27.     int i,j;
  28.     int result;
  29.     int points,maxpoints;
  30.     points=maxpoints=0;
  31.     FILE* dyktando;
  32.     dyktando = fopen(name, "r+");
  33.     while(dyktando != NULL){ /// Naprawde chcesz wejść w nieskończoną pętle gdy plik jest otwarty poprawnie xD ?
  34.         fgetws(&answers[i], 10, dyktando); /// podajesz adres do typu wchar** tworzac wchar*** a przeciez ma być wchar*
  35.         /// i jest niezainicjalizowane i użyte, ta linijka bedzie powodowac crash programu, jak myślisz co jest w zmiennej gdy jej nie zainicjalizujesz ?
  36.     }
  37.     wprintf(L"Podaj poprawne uzupełnienia tekstu, klikając enter po każdej odpowiedzi.\n");
  38.     for(j=0;j<i;j++){ // czym wogole jest j i i, nawij zmienne porzadnie !!
  39.         wscanf(L"%s", &your_answers[i]); // to samo co wyżej wchar_t*** i "%ls"
  40.         result=wcscmp(your_answers[i], answers[i]); /// Nie porównujesz tu nawet stringów, to nie ma prawa działać
  41.         if(result==0){
  42.             points++;
  43.         }
  44.         maxpoints++;
  45.     }
  46.     wprintf(L"Twój wynik to: %d/%d!\n", points, maxpoints);
  47.     fclose(dyktando);
  48. }
  49.  
  50. int main()
  51. {
  52.     system("chcp 852");
  53.     setlocale(LC_ALL, ".852");
  54.  
  55.     dyk *show; // znowu wskaźnik bez inicjalizacji, kardynalny błąd !!
  56.     show = (dyk*)malloc(sizeof(dyk)); /// nie zwalniasz tej pamieci na koniec, wyciek pamieci !!
  57.  
  58.     int choose;
  59.     wchar_t imie[20];
  60.     wchar_t dykname[100];
  61.  
  62.     printf("Hej, witaj w programie do nauki ortografii!\n\n");
  63.     wprintf(L"Twoje imię: ");
  64.     wscanf(L"%s", &imie); // powinno być "%ls", a co jezeli imie będzie większe niż 20 znaków ? Czytanie stringu za pomocą scanf ze streamu wjesciowego to słaby pomysł
  65.  
  66.     wprintf(L"%s", imie);
  67.     wprintf(L"\nWybierz swoje dyktando wybierając odpowiedni numer i klikając 'enter'\n\n1. farma\n2. zwierzęta\n3. wyjdź z programu\n\n");
  68.     menu: /// to co nizej, nie uzywamy goto !! Po co to w ogole, uzyj normalnej petli
  69.     scanf("%d", &choose);
  70.     switch (choose){
  71.         case 1:
  72.             open_dyk("farma.txt", show);
  73.             check_dyk("farmacheck.txt");
  74.             break;
  75.         case 2:
  76.             open_dyk("animals.txt", show);
  77.             check_dyk("animalscheck.txt");
  78.             break;
  79.         case 3:
  80.             return 0;
  81.         default:
  82.             printf("Dokonano niewłaściwego wyboru, wybierz jeszcze raz!\n");
  83.             goto menu; // tej instrukcji nie powinno tu być, goto sie nie używa !! Użyj innej zwykłej pętli
  84.             break;
  85.     }
  86.     return 0;
  87. }
  88.  
  89.  
  90.  
  91. //tutaj na dole oddzielny plik z listami jak poradziłeś
  92.  
  93.  
  94. #ifndef LISTA_H
  95. #define LISTA_H
  96. #include <stdio.h>
  97. #include <stdlib.h>
  98. #include <wchar.h>
  99. #include <locale.h>
  100. #include <string.h>
  101.  
  102. struct dyk{
  103.     wchar_t line[200];                             //wiersz przechowywany w węźle
  104.     struct dyk *next;                              //wskaźnik na następny element
  105. };
  106.  
  107. typedef struct dyk dyk; /// to i deklarację struktury można zrobić za 1 zamachem
  108.  
  109. dyk* add_to_bottom(wchar_t *buf, dyk *head){
  110.     dyk *current_node = head;
  111.     dyk *new_node; /// znowu wskaznik bez inicjalizacji
  112.     while(current_node != NULL && current_node->next != NULL){
  113.         current_node = current_node->next;
  114.     }
  115.     new_node = (dyk*)malloc(sizeof(dyk));
  116.     wcscpy(new_node->line, buf);
  117.     new_node->next = NULL;
  118.     if (current_node != NULL){
  119.         current_node->next = new_node;
  120.     }else{
  121.         head = new_node; /// head powinien wkazywac na pierwszy element nie ostatni,
  122. robiac tak w liscie jednokierunkowej tworzysz memory_leak i tracisz dostep do poprzednich węzłów
  123.     }
  124.     return head;
  125. }
  126.  
  127. void print_all(dyk *head) {
  128.     dyk *current_node = head;
  129.     while ( current_node != NULL) {
  130.         wprintf(L"%s ", current_node->line);
  131.         current_node = current_node->next;
  132.     }
  133. }
  134.  
  135. #endif // LISTA_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement