Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <wchar.h>
- #include <locale.h>
- #include <string.h>
- #include "lista.h"
- void open_dyk(char name[100], dyk *head){ /// Tak sie nie przekazuje tablic w c !!
- wchar_t buf[1000];
- FILE *dyktando; /// Wskaźniki zawsze powinny być zainicjalizowne !!!
- dyktando = fopen(name, "r+");
- if(dyktando == NULL){
- wprintf(L"Błąd otwarcia pliku!\n");
- }else{
- while(fgetws(buf,1000,dyktando)!=NULL){ /// Nie przeczytałeś dobrze dokumentacji tej funkcji, NULL jest tylko jeśli napotka WEOF przed zczytaniem jakiekolwiek znaku
- wprintf(L"\n %s", &buf); // Powinno być %ls
- add_to_bottom(buf, head);
- }
- print_all(head);
- }
- fclose(dyktando);
- }
- void check_dyk(char name[100]){ ///To samo co przy poprzedniej funkcji
- 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
- wchar_t *your_answers[100][10];
- int i,j;
- int result;
- int points,maxpoints;
- points=maxpoints=0;
- FILE* dyktando;
- dyktando = fopen(name, "r+");
- while(dyktando != NULL){ /// Naprawde chcesz wejść w nieskończoną pętle gdy plik jest otwarty poprawnie xD ?
- fgetws(&answers[i], 10, dyktando); /// podajesz adres do typu wchar** tworzac wchar*** a przeciez ma być wchar*
- /// i jest niezainicjalizowane i użyte, ta linijka bedzie powodowac crash programu, jak myślisz co jest w zmiennej gdy jej nie zainicjalizujesz ?
- }
- wprintf(L"Podaj poprawne uzupełnienia tekstu, klikając enter po każdej odpowiedzi.\n");
- for(j=0;j<i;j++){ // czym wogole jest j i i, nawij zmienne porzadnie !!
- wscanf(L"%s", &your_answers[i]); // to samo co wyżej wchar_t*** i "%ls"
- result=wcscmp(your_answers[i], answers[i]); /// Nie porównujesz tu nawet stringów, to nie ma prawa działać
- if(result==0){
- points++;
- }
- maxpoints++;
- }
- wprintf(L"Twój wynik to: %d/%d!\n", points, maxpoints);
- fclose(dyktando);
- }
- int main()
- {
- system("chcp 852");
- setlocale(LC_ALL, ".852");
- dyk *show; // znowu wskaźnik bez inicjalizacji, kardynalny błąd !!
- show = (dyk*)malloc(sizeof(dyk)); /// nie zwalniasz tej pamieci na koniec, wyciek pamieci !!
- int choose;
- wchar_t imie[20];
- wchar_t dykname[100];
- printf("Hej, witaj w programie do nauki ortografii!\n\n");
- wprintf(L"Twoje imię: ");
- 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ł
- wprintf(L"%s", imie);
- 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");
- menu: /// to co nizej, nie uzywamy goto !! Po co to w ogole, uzyj normalnej petli
- scanf("%d", &choose);
- switch (choose){
- case 1:
- open_dyk("farma.txt", show);
- check_dyk("farmacheck.txt");
- break;
- case 2:
- open_dyk("animals.txt", show);
- check_dyk("animalscheck.txt");
- break;
- case 3:
- return 0;
- default:
- printf("Dokonano niewłaściwego wyboru, wybierz jeszcze raz!\n");
- goto menu; // tej instrukcji nie powinno tu być, goto sie nie używa !! Użyj innej zwykłej pętli
- break;
- }
- return 0;
- }
- //tutaj na dole oddzielny plik z listami jak poradziłeś
- #ifndef LISTA_H
- #define LISTA_H
- #include <stdio.h>
- #include <stdlib.h>
- #include <wchar.h>
- #include <locale.h>
- #include <string.h>
- struct dyk{
- wchar_t line[200]; //wiersz przechowywany w węźle
- struct dyk *next; //wskaźnik na następny element
- };
- typedef struct dyk dyk; /// to i deklarację struktury można zrobić za 1 zamachem
- dyk* add_to_bottom(wchar_t *buf, dyk *head){
- dyk *current_node = head;
- dyk *new_node; /// znowu wskaznik bez inicjalizacji
- while(current_node != NULL && current_node->next != NULL){
- current_node = current_node->next;
- }
- new_node = (dyk*)malloc(sizeof(dyk));
- wcscpy(new_node->line, buf);
- new_node->next = NULL;
- if (current_node != NULL){
- current_node->next = new_node;
- }else{
- head = new_node; /// head powinien wkazywac na pierwszy element nie ostatni,
- robiac tak w liscie jednokierunkowej tworzysz memory_leak i tracisz dostep do poprzednich węzłów
- }
- return head;
- }
- void print_all(dyk *head) {
- dyk *current_node = head;
- while ( current_node != NULL) {
- wprintf(L"%s ", current_node->line);
- current_node = current_node->next;
- }
- }
- #endif // LISTA_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement