1

Тема: створити структуру "бібліотека"

Умова:
В бібліографічному каталозі знайти книги по алгоритмічній мові С. В каталог заноситься прізвище автора, назва, рік видання і кількість сторінок.
мій код:
[code=C++]#include <stdio.h>
#include <string.h>
#define MAX_BOOKS 8

struct str
{
    char surname[40];
    char title[40];
    int year;
    int pnum;
} kniga[MAX_BOOKS];


int main()
{
    FILE *read;
    int n, i, tmp = 0;
    char auth[40];

    //read from file to struct
    i = 0;
    read = fopen("d1.txt","rt");
    while(!feof(read))
    {
        fscanf(read, "%s %s %d %d", kniga[i].surname, kniga[i].title, kniga[i].year, &kniga[i].pnum);
        i++;
    }
    fclose(read);
    n = i++;  //book count
    // end of read

    printf("Enter author:");
    gets(auth);
    for(i = 0; i < n; i++)
    {
        if(strcmp(kniga[i].surname,auth) == 0 && kniga[i].year >= 2012)
            printf("%s\n", kniga[i].title);
    }

    for(i = 0; i < n; i++)
    {
        if(strcmp(kniga[i].title, "cyberforum") == 0)
        {
            printf("\n%s, %s, %d, %d", kniga[i].surname, kniga[i].title, kniga[i].year, kniga[i].pnum);
            tmp = 1;
        }
    }
    if(tmp == 0)
        printf("cyberforum not found\n");

    return 0;
}[/code]

Оригінал
#include <stdio.h>
#include <string.h>
#define MAX_BOOKS 8

struct str
{
    char surname[40];
    char title[40];
    int year;
    int pnum;
} kniga[MAX_BOOKS];


int main()
{
FILE *read;
int n,i,tmp=0;
char auth[40];

//read from file to struct
i=0;
read=fopen("d1.txt","rt");
while(!feof(read))
{
    fscanf(read,"%s %s %d %d", kniga[i].surname, kniga[i].title, kniga[i].year, &kniga[i].pnum);
    i++;
}
fclose(read);
n=i++;  //book count
// end of read

printf("Enter author:");
gets(auth);
for(i=0;i<n;i++)
{
    if(  strcmp(kniga[i].surname,auth)==0 && kniga[i].year>=2012 )
         printf("%s\n",kniga[i].title);
}

for(i=0;i<n;i++)
{
    if( strcmp(kniga[i].title,"cyberforum")==0)
    {
        printf("\n%s, %s, %d, %d",kniga[i].surname,kniga[i].title,kniga[i].year, kniga[i].pnum);
        tmp=1;
    }
}
if(tmp==0)
    printf("cyberforum not found\n");

return 0;
}

текст файлу:
King "Mister Mersedes" 2014 544p
Lotz "The Three" 2014 464p
Collins "Hunger Games" 2012 384p
Dashvar "To Have Hll" 2015 336p
Gerritsen "Last To Die" 2012 500p
Coelho "Onze Minutos" 2012 240p
Hawkins "The Girl On The Train" 2015 320p
Chibnall "Broadchurch" 2014 440p


можете допомогти виправити помилки?

2

Re: створити структуру "бібліотека"

Розумієте, "помилка" - поняття трохи відносне. Можна і про стилістичні помилки говорити (наприклад, якщо код невирівняний, його незручно читати, не хочете вирівнювати самі - то є функція в IDE), і про нефективності (можна, скажімо, зробити індекс по словах, тоді пошук буде значно швидшим), і про різні недоробки (назва книжки у вас не може бути довшою за 39 символів), але вас, гадаю, цікавить щось конкретне. Опишіть свою проблему як чого ви очікуєте від коду, а що він робить - і ми, можливо, зможемо допомогти.

Подякували: leofun01, Chemist-i2

3 Востаннє редагувалося olena2355 (10.11.2018 17:34:52)

Re: створити структуру "бібліотека"

мені потрібно зчитати з файлу всі ці дані по книгах та зробити пошук по книзі
код не читає файл, при компіляції - показує просто консольне вікно

koala написав:

Розумієте, "помилка" - поняття трохи відносне. Можна і про стилістичні помилки говорити (наприклад, якщо код невирівняний, його незручно читати, не хочете вирівнювати самі - то є функція в IDE), і про нефективності (можна, скажімо, зробити індекс по словах, тоді пошук буде значно швидшим), і про різні недоробки (назва книжки у вас не може бути довшою за 39 символів), але вас, гадаю, цікавить щось конкретне. Опишіть свою проблему як чого ви очікуєте від коду, а що він робить - і ми, можливо, зможемо допомогти.

http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1942&amp;download=0

Post's attachments

12.png 4.58 kb, 56 downloads since 2018-11-10 

4

Re: створити структуру "бібліотека"

0xC0000005 - це помилка доступу до пам'яті, тобто ви читаєте або пишете зовсім не там, де треба.
Оскільки програма не встигає нічого вивести, то проблема має бути до рядка 32. Оскільки все, що там відбувається - це робота з файлом, можна припустити, що файл чомусь не відкрився. Спробуйте після рядка 22 додати

if( read == NULL ) {
    printf("Failed to open file, exiting.\n");
    return 1;
}

І переконайтеся, що ваш компілятор підтримує режим "rt" для файлів, це нестандартна опція.
Ну і взагалі - навчіться користуватися зневаджувачем, це зекономить вам купу часу в таких випадках.

Подякували: leofun011

5

Re: створити структуру "бібліотека"

перевіряла
далі просто відкривається консольне вікно і нічого не відбувається

koala написав:

0xC0000005 - це помилка доступу до пам'яті, тобто ви читаєте або пишете зовсім не там, де треба.
Оскільки програма не встигає нічого вивести, то проблема має бути до рядка 32. Оскільки все, що там відбувається - це робота з файлом, можна припустити, що файл чомусь не відкрився. Спробуйте після рядка 22 додати

if( read == NULL ) {
    printf("Failed to open file, exiting.\n");
    return 1;
}

І переконайтеся, що ваш компілятор підтримує режим "rt" для файлів, це нестандартна опція.
Ну і взагалі - навчіться користуватися зневаджувачем, це зекономить вам купу часу в таких випадках.

6

Re: створити структуру "бібліотека"

А ви серйозно вважаєте, що тут є телепати?

olena2355 написав:

перевіряла

Я написав 2 зауваження до коду. Яке саме з них ви перевірили і з яким результатом?

olena2355 написав:

далі просто відкривається консольне вікно і нічого не відбувається

Обидва мої зауваження стосувалися того моменту, коли консольне вікно ВЖЕ мало бути відкрито. У вас ДАЛІ відкривається друге консольне вікно? Чи далі - це "І надалі" чи щось таке? Після додавання мого коду програма не стала нічого виводити нового?
Ну і ще цікаво - що в файлі?

7

Re: створити структуру "бібліотека"

ось що в файлі:
King "Mister Mersedes" 2014 544p
Lotz "The Three" 2014 464p
Collins "Hunger Games" 2012 384p
Dashvar "To Have Hll" 2015 336p
Gerritsen "Last To Die" 2012 500p
Coelho "Onze Minutos" 2012 240p
Hawkins "The Girl On The Train" 2015 320p
Chibnall "Broadchurch" 2014 440p

запускаючи код на компіляцію, показує, що жодних помилок немає, а далі відкривається консольне вікно, на якому нічого нема і на який нічого не можна ввести з клавіатури

koala написав:

А ви серйозно вважаєте, що тут є телепати?

olena2355 написав:

перевіряла

Я написав 2 зауваження до коду. Яке саме з них ви перевірили і з яким результатом?

olena2355 написав:

далі просто відкривається консольне вікно і нічого не відбувається

Обидва мої зауваження стосувалися того моменту, коли консольне вікно ВЖЕ мало бути відкрито. У вас ДАЛІ відкривається друге консольне вікно? Чи далі - це "І надалі" чи щось таке? Після додавання мого коду програма не стала нічого виводити нового?
Ну і ще цікаво - що в файлі?

8

Re: створити структуру "бібліотека"

Так, вибачте. Ви вже це писали. Таки взяв я ваш код, скомпілював.
Проблема №1:

main.cpp|25|warning: format '%d' expects argument of type 'int*', but argument 5 has type 'int' [-Wformat=]|

Ага, щось не так в параметрах. 25-а стрічка - це fscanf, 5-й параметр kniga[ i].year має тип int, а має бути int*. Ну так, логічно - ми ж читаємо У kniga[ i].year, тобто передавати маємо його адресу, так само, як із kniga[ i].pnum:

fscanf(read,"%s %s %d %d", kniga[i].surname, kniga[i].title, &kniga[i].year, &kniga[i].pnum);

Без цього scanf сприймає поточне значення kniga[ i].year як адресу, за якою намагається писати із відомим результатом.
Проблема №2.
Програма все одно нічого не знаходить. Додав 26-м рядком

printf("%d.%s|%s|%d|%d\n",i,kniga[i].surname, kniga[i].title, kniga[i].year, kniga[i].pnum);

Є проблема - %s, насправді, читає не будь-яку стрічку, а до пробіла чи нового рядка. Тобто всі назви в лапках б'ються навпіл. Переробляємо:

    fscanf(read,"%s \"%[^\"]s",kniga[i].surname, kniga[i].title);
    fscanf(read,"\"%d %dp",&kniga[i].year, &kniga[i].pnum);

[^\"] означає "будь-який символ, окрім \", тобто лапок.
Ну, тепер вам треба реалізувати пошук книжок по C - тобто там має бути літера C не в слові. Впораєтеся?

Подякували: leofun01, olena23552

9

Re: створити структуру "бібліотека"

мені тепер вибиває ось цю помилку
десь знову з кодом затупила, можете підказати де саме і як виправити?

#include <stdio.h>
#include <string.h>
struct str
{
    char surname[40];
    char title[40];
    int  year;
    int  pnum;
} kniga[8];


int main()
{
    FILE *read;
    int n, i, tmp = 0;
    char auth[40];

    // read from file to struct
    i = 0;
    read = fopen("d1.txt", "rt");
    while(!feof(read))
    {
        fscanf(read, "%s \"%[^\"]s", kniga[i].surname, kniga[i].title);
        fscanf(read, "\"%d %dp", &kniga[i].year, &kniga[i].pnum);
        i++;
        printf("%d.%s|%s|%d|%d\n", i , kniga[i].surname, kniga[i].title, kniga[i].year, kniga[i].pnum);
    }
    fclose(read);
    n = i++; // book count
    // end of read

    printf("Enter author:");
    gets(auth);
    for(i = 0; i < n; i++)
    {
        if(strcmp(kniga[i].surname, auth) == 0 && kniga[i].year >= 2012)
             printf("%s\n", kniga[i].title);
    }


    return 0;
}
koala написав:

Так, вибачте. Ви вже це писали. Таки взяв я ваш код, скомпілював.
Проблема №1:

main.cpp|25|warning: format '%d' expects argument of type 'int*', but argument 5 has type 'int' [-Wformat=]|

Ага, щось не так в параметрах. 25-а стрічка - це fscanf, 5-й параметр kniga[ i].year має тип int, а має бути int*. Ну так, логічно - ми ж читаємо У kniga[ i].year, тобто передавати маємо його адресу, так само, як із kniga[ i].pnum:

fscanf(read,"%s %s %d %d", kniga[i].surname, kniga[i].title, &kniga[i].year, &kniga[i].pnum);

Без цього scanf сприймає поточне значення kniga[ i].year як адресу, за якою намагається писати із відомим результатом.
Проблема №2.
Програма все одно нічого не знаходить. Додав 26-м рядком

printf("%d.%s|%s|%d|%d\n",i,kniga[i].surname, kniga[i].title, kniga[i].year, kniga[i].pnum);

Є проблема - %s, насправді, читає не будь-яку стрічку, а до пробіла чи нового рядка. Тобто всі назви в лапках б'ються навпіл. Переробляємо:

    fscanf(read,"%s \"%[^\"]s",kniga[i].surname, kniga[i].title);
    fscanf(read,"\"%d %dp",&kniga[i].year, &kniga[i].pnum);

[^\"] означає "будь-який символ, окрім \", тобто лапок.
Ну, тепер вам треба реалізувати пошук книжок по C - тобто там має бути літера C не в слові. Впораєтеся?

http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1945&amp;download=0

Post's attachments

лаба8.png 3.56 kb, 43 downloads since 2018-11-12 

10

Re: створити структуру "бібліотека"

Не бачу помилки.
Бачу, що дані з файлу не читаються.

11

Re: створити структуру "бібліотека"

Вибачаюсь
Мала це на увазі
Але не розумію чому вони не зчитуються

koala написав:

Не бачу помилки.
Бачу, що дані з файлу не читаються.

12

Re: створити структуру "бібліотека"

Бо насправді зчитуються. Переставте i++ після printf ))