1 Востаннє редагувалося apolof (20.10.2014 19:55:04)

Тема: Робота зі списком фільмів (мова С)

Не получається написати четверту і п'яту функцію.
Допоможіть :(

Задача.
Підготувати дані, що містять інформацію про Відеотеку, дані оформити у вигляді запису, що містить наступні поля: Номер, Фільм, Країна, Час, Жанр, Дата. Кількість записів довільна. Створити програму записів підготовлених даних до зовнішнього файлу і програму обробки цього зовнішнього файлу, що виконує наступні операції.
      1)Введення даних в файл;
      2)Виводить на екран введені дані;
      3)Додає записів на початок або кінець файлу;
      4)Видаляє всі дані про фільм, номер якого задано    користувачем    і виводить на екран
    оновлений вміст файлу;
      5)Сортує жанри фільмів за алфавітом;

Ось код для трьох пунктів.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int number()
    {
    int fnumber;
    printf("vvedit kilkist zapysiv: ");
    scanf("%d", &fnumber);
    printf("\n");
    return(fnumber);
    }

void vvedena_danux(){
     FILE *file;
     struct video {
            int nomer;
            char film[50];
            char kraina[50]; 
            float time; 
            char janr[50];
            int date;  
            } shop[100];
     
     int n=number();
     char i=0;
     file= fopen("videoteka.txt", "w");
     
     for(i=0;i<n;i++)
     {
     printf("Введіть номер\n");
     scanf("%d",&(shop[i].nomer));
     fprintf(file,"\n%d ",shop[i].nomer);
     
     printf("Введіть фільм\n");
     scanf("%s", shop[i].film);
     fprintf(file,"%s ",shop[i].film);
 
     printf("Введіть країну\n");
     scanf("%s",shop[i].kraina);
     fprintf(file,"%s ",shop[i].kraina);
     
     printf("Введіть час\n");
     scanf("%f",&(shop[i].time));
     fprintf(file,"%0.2f ",shop[i].time);
     
     printf("Введіть жанр фільма\n");
     scanf("%s",shop[i].janr);
     fprintf(file,"%s ",shop[i].janr);
      
     printf("Введіть дату фільма\n");
     scanf("%d",&(shop[i].date));
     fprintf(file,"%d ",shop[i].date);
     }
            
     fclose(file);    
}

void vuvodut_na_ekaran(){
     
     FILE *file;
     struct video {
            int nomer;
            char film[50];
            char kraina[50]; 
            float time; 
            char janr[50];
            int date;  
            } shop[100];
     
     char emptyLine;
     char i=0;
     file= fopen("videoteka.txt", "r");
     
     while(!feof(file))
        {

        fscanf(file,"%d",&(shop[i].nomer));
        fscanf(file,"%s", shop[i].film);
        fscanf(file,"%s", shop[i].kraina);
        fscanf(file,"%f",&(shop[i].time));
        fscanf(file,"%s", shop[i].janr);
        fscanf(file,"%d",&(shop[i].date));

        printf("\n№:%d Фільм:%s Країна:%s Час:%0.2f Жанр:%s Дата:%d ", shop[i].nomer, shop[i].film, shop[i].kraina,
                    shop[i].time, shop[i].janr, shop[i].date);
        
        fscanf(file, "%c%c", &emptyLine, &emptyLine);            
        i++;
        }
        fclose(file);            
} 

void dodavanna_zapusy(){
 
     FILE *file;
     struct food {
            int nomer;
            char film[50];
            char kraina[50]; 
            float time; 
            char janr[50];
            int date;  
            }shop[100];
    
     char i=0;
                
     file= fopen("videoteka.txt", "a");
 
     printf("Введіть номер запису\n");
     scanf("%d", &(shop[i].nomer));
     fprintf(file,"%d ",shop[i].nomer);
     
     printf("Введіть фільм\n");
     scanf("%s",shop[i].film);
     fprintf(file,"%s ",shop[i].film);
     
     printf("Введіть країну\n");
     scanf("%s",shop[i].kraina);
     fprintf(file,"%s ",shop[i].kraina);
     
     printf("Введіть час\n");
     scanf("%f",&(shop[i].time));
     fprintf(file,"%.2f ",shop[i].time);
     
     printf("Введіть жанр\n");
     scanf("%s",shop[i].janr);
     fprintf(file,"%s ",shop[i].janr);
     
     printf("Введіть дату\n");
     scanf("%d",&(shop[i].date));
     fprintf(file,"%d ",shop[i].date);
     
     fclose(file);
}
 



main()
{
    system("chcp 1251");  
    int k;
    
    do{
     
    printf("\n--------------------------------");
    printf("\n Меню \n");
    printf("1)Введення даних в файл\n");
    printf("2)Ввиводить на екран введені дані \n");
    printf("3)Додає запис на початок або кінець файлу \n");
    
    
    printf("------------------------------ \n");
    printf("Виберіть пункт \n");
    scanf("%d",&k);
    
    switch (k) {
               case 1: vvedena_danux();     break;
               case 2: vuvodut_na_ekaran(); break;
               case 3: dodavanna_zapusy();  break;
               default: printf("\nНемає такого пункту\n");
    }
    } while(k !=5);

    getch();

}

2

Re: Робота зі списком фільмів (мова С)

Непогано, як для початківця. Зауваження:
- винесіть визначення структури на початок програми. Щоб потім використовувати цю структуру для проголошення змінних, треба або вказувати, що це структура:

/* початок файлу */
struct video { ... };
/* проголошення змінної */
struct video shop[ 100 ];

або оголосити синонімічне ім'я (typedef):

/* початок файлу */
typedef struct { ... } video; /*video - синонім для нашої структури */
/* проголошення змінної */
video shop[ 100 ];

- винесіть назву файлу в якусь спільну змінну - наприклад, додайте в функції параметр char *file_name, в головну функцію char main_file[] = "videoteka.txt", і потім викликайте dodavanna_zapusy( main_file )

- визначіться зі стратегією обробки даних. Стратегій, власне, дві: або все зберігається і обробляється в файлі, і тільки на час обробки витягається - тоді вам не треба тримати масиви змінних (власне, вони у вас і так зайві - якщо всюди повикидати i і зробити shop не масивом, а змінною, все працюватиме, як і раніш); або ж на час обробки витягається весь вміст файлу - тоді вам потрібен масив, в який копіюєте весь файл, обробляєте, а потім записуєте весь масив в файл.

- розгляньте зміну формату файлу. Наразі у вас текстовий файл, тому для зміни вмісту в середині файлу треба повністю його перезаписувати (що, як я розумію, і ускладнює рішення вашої проблеми); якщо ж ви будете використовувати функції fwrite/fread, то всі записи будуть фіксованого розміру і ви зможете легко їх перезаписувати - один на місце іншого.

- подумайте, чи можливо застосувати тут принцип DRY - "don't repeat yourself" ("не повторюйся"): у вас є значні повторювані шматки коду, які можна було б винести в прості функції і потім викликати вже їх, що зменшить розмір коду і збільшить читаність.

Подякували: 0xDADA11C7, apolof, Ярослав3

3 Востаннє редагувалося apolof (26.10.2014 17:16:51)

Re: Робота зі списком фільмів (мова С)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
#include <stdio.h>
using namespace std;

const char * FName = "Videoteka.txt";

struct food
{
    int id;
    char film[30];
    char country[30];
    float time;
    char janre[30];
    int data;
} *shop;

void config_console();
void film_load();

int  menu();
int  number();
void film_input();
void film_print();
void film_add();
void film_list_1992();
void film_sort_film();

void main()
{
    config_console();
    film_load();

    bool l = true;
    while (l)
    {
        switch (menu())
        {
        case 1: film_input();
            break;
        case 2: film_print();
            break;
        case 3: film_add();
            break;
        case 4: film_list_1992();
            break;
        case 5: film_sort_film();
            break;
        case 6: l = false;
        }
        system("pause");
        system("CLS");
    }

    delete[] shop;
}

int  menu()
{
    char s[10]; 
    int n;
    do {
        printf("Виберіть потрібний пункт меню:\n");
        printf("  1: Занесення даних:\n");
        printf("  2: Вивести дані про фільм;\n");
        printf("  3: Добавити фільм до списку;\n");
        printf("  4: Список фільмів знятих до 1992 року;\n");
        printf("  5: Сортує жанри фільмів за алфавіт;\n");
        printf("  6: Вихід;\n");
        printf("Введіть номер потрібного пункту: "); scanf("%d",&n);
        system("CLS");
    } while (n<1 || n>8);
    return n;
}

void config_console()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
}

long file_element()
{
    FILE  *fp;
    if ((fp = fopen(FName, "ab")) == NULL)
        printf("Помилка при відкритті файлу.\n");


    fseek(fp, 0, SEEK_END);
    long i = ftell(fp) / sizeof(struct food);
    fclose(fp);
    return i;
}

void film_load()
{
    delete[] shop;
    FILE  *fp;
    if ((fp = fopen(FName, "rb")) == NULL) {
        printf("Помилка при відкритті файлу.\n");
    }
    shop = new food[file_element()];
    for (int i = 0; i<file_element(); i++)
    {
        if (fread(&shop[i], sizeof(struct food), 1, fp) != 1) {
            if (feof(fp)) break;
            printf("Помилка зчитування файлу.\n");
        }
    }
    fclose(fp);
}

int  number()
{
        int kil;
        printf("Введіть кількість записів, які потрібно записати в файл\n");
        scanf("%d", &kil);
        return kil;
}

void film_input()
{
    int i,n = 1;
    int m = number();
    food video;

    FILE  *fp;
    if ((fp = fopen(FName, "wb")) == NULL)
        printf("Помилка при відкритті файлу.\n");

    for (i = 0; i < m; i++)
    {
        /*printf("Ідентифікаційний номер:");
        scanf("%d", &video.id);*/

        printf("Назва фільму:");
        scanf("%s", &video.film);

        printf("Країна:");
        scanf("%s", &video.country);

        printf("Час:");
        scanf("%f", &video.time);

        printf("Жанр:");
        scanf("%s", video.janre);

        printf("Рік випуску:");
        scanf("%d", &video.data);
    
        printf("Дані занесені в файл\n\n");
    }
        if (fwrite(&video, sizeof(struct food), 1, fp) != 1)
            printf("Помилка при записі у файл.\n");
    fclose(fp);
    film_load();
}

void film_print()
{
    int count = file_element();
    if (count != 0)
    {
        printf(" \n--Список фільмів;\n");
        printf("+------+------------------+--------------+---------+--------------+------+\n"
               "| Ід   |   Назва фільму   |    Країна    |   Час   |     Жанр     | Рік  |\n"
               "+------+------------------+--------------+---------+--------------+------+\n");
        for (int i = 0; i<count; i++)
        {
            printf("| %-4d",      i+1);
            printf(" | %-16s",    shop[i].film);
            printf(" | %-12s",    shop[i].country);
            printf(" | %-7.2f",   shop[i].time);
            printf(" | %-12s",    shop[i].janre);
            printf(" | %-2d |\n", shop[i].data);
        }
        printf("+------+------------------+--------------+---------+--------------+------+\n");
    }
    else printf("Файл порожній!!!\n");
}

void film_add()
{
    int n = 1;

    FILE  *fp;
    if ((fp = fopen(FName, "ab")) == NULL)
        printf("Помилка при відкритті файлу.\n");

    while (n != 0)
    {
        food video;
        /*printf("Ідентифікаційний номер:");
        scanf("%d",&video.id);*/

        printf("Назва фільму:");
        scanf("%s",&video.film);

        printf("Країна:");
        scanf("%s",&video.country);

        printf("Час:");
        scanf("%f",&video.time);

        printf("Жанр:");
        scanf("%s", video.janre);

        printf("Рік випуску:");
        scanf("%d",&video.data);

        if (fwrite(&video, sizeof(struct food), 1, fp) != 1)
            printf("Помилка при записі у файл.\n");

        do {
            printf("Введіть 0 щоб зупинити, 1 продовжити:");
            scanf("%d", &n);
        } while (!(n == 0 || n == 1));
    }
    fclose(fp);
    film_load();
}

void film_list_1992()
{
    int count = file_element(), exist = 0;
    if (count != 0)
    {

        /*for (int i = 0; i < count; i++)
            if (shop[i].data > 250)  exist++;
        if (exist == 0) {
            printf("Не знайдено інформацію за заданими критеріями!\n");
            return;
        }*/

        printf(" \n--Список назв запчастин, випущених до 2011 року;\n");
        printf(" +----------------------+\n");
        printf(" |    Назва запчастини  |\n");
        printf(" +----------------------+\n");
        for (int i = 0; i<count; i++)
            if (1992 > shop[i].data)
                printf(" |%22s|\n", shop[i].film);
        printf(" +----------------------+\n\n");
    }
    else
    {
        printf("Файл порожній!!!\n");
    }
}

void film_sort_film()
{
    int n = file_element();
    food sor;
    for (int i = n - 1; i >= 0; i--)
        for (int j = 0; j < i; j++)
            if (shop[j].janre < shop[j + 1].janre)
            {
        sor = shop[j];
        shop[j] = shop[j + 1];
        shop[j + 1] = sor;
            }
    printf(" \n--Посортувати за спаданням індифікаційні номери;\n");
    film_print();
}

Можите підказати як додати 2 слова в назву фільма,
тому що лиш одне слово додається

4 Востаннє редагувалося koala (26.10.2014 23:12:26)

Re: Робота зі списком фільмів (мова С)

Код на 268 рядків. Ви гадаєте, хтось шукатиме, де там щось не додається?

5

Re: Робота зі списком фільмів (мова С)

koala написав:

Код на 268 рядків. Ви гадаєте, хтось шукатиме, де там щось не додається?

void film_input()
{
    int i,n = 1;
    int m = number();
    food video;
 
    FILE  *fp;
    if ((fp = fopen(FName, "wb")) == NULL)
        printf("Помилка при відкритті файлу.\n");
 
    for (i = 0; i < m; i++)
    {
        printf("Ідентифікаційний номер:");
        scanf("%d", &video.id);
 
        printf("Назва фільму:");
        scanf("%s", &video.film);
 
        printf("Країна:");
        scanf("%s", &video.country);
 
        printf("Час:");
        scanf("%f", &video.time);
 
        printf("Жанр:");
        scanf("%s", video.janre);
 
        printf("Рік випуску:");
        scanf("%d", &video.data);
    
        printf("Дані занесені в файл\n\n");
    }
        if (fwrite(&video, sizeof(struct food), 1, fp) != 1)
            printf("Помилка при записі у файл.\n");
    fclose(fp);
    film_load();
}

ось ця функція

6

Re: Робота зі списком фільмів (мова С)

Відкриття файлу в режимі wb знищує те, що в файлі. Це ваша проблема чи ні?

7 Востаннє редагувалося apolof (27.10.2014 00:54:10)

Re: Робота зі списком фільмів (мова С)

koala написав:

Відкриття файлу в режимі wb знищує те, що в файлі. Це ваша проблема чи ні?

Ні! Wb не гарає тут ролі.
Функція записує дані в файл.
Потрібно, коли доходить до пункту введіть назву фільм
можна було б вводити назву фільма з декілька слів
функція працюЄ правильно коли одне слово для назви фільма
(назва не може складатися лиш з одного слова)

8

Re: Робота зі списком фільмів (мова С)

якщо вам дорогий саме scanf, то

scanf( "%[^\n]s", video.film );//посилання на масив не потрібне

але простіше

gets( video.film );

9 Востаннє редагувалося apolof (27.10.2014 01:11:12)

Re: Робота зі списком фільмів (мова С)

koala написав:

якщо вам дорогий саме scanf, то

scanf( "%[^\n]s", video.film );//посилання на масив не потрібне

але простіше

gets( video.film );

чомусь переходить зразу на країну

Post's attachments

Безымянный.png 40.14 kb, 133 downloads since 2014-10-27 

10

Re: Робота зі списком фільмів (мова С)

fflush(stdin);

перед вводом очистить буфер від попередніх символів.

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

11

Re: Робота зі списком фільмів (мова С)

koala написав:
fflush(stdin);

перед вводом очистить буфер від попередніх символів.

Все працює *OK*
дякую

12

Re: Робота зі списком фільмів (мова С)

void film_sort_film()
{
    int s = file_element();
    films sor;
    for (int i = s - 1 ; i >= 0 ; i--)
        for (int j =0 ; j < i ; j++)
            if (shop[j].genre < shop[j+1].genre) 
            {
                sor = shop[j];
                shop[j] = shop[j+1];
                shop[j+1] = sor;
            }
    printf(" \n--Посортувано за алфавітом по жанрам фільмів;\n");
    film_print();
}

Можете підказати чому не коректно працює сортування.

13 Востаннє редагувалося koala (02.11.2014 21:43:01)

Re: Робота зі списком фільмів (мова С)

1. Що таке file_element() і film_print()? Як вони пов'язані з масивом shop?
2. В чому полягає некоректність сортування?

14 Востаннє редагувалося apolof (02.11.2014 22:03:21)

Re: Робота зі списком фільмів (мова С)

виводить дані з файла

void film_print()
{
    int count = file_element();
    if (count != 0)
    {
        printf(" \n--Список фільмів;\n");
        printf("+------+------------------+--------------+---------+--------------+------+\n"
               "| Ід   |   Назва фільму   |    Країна    |   Час   |     Жанр     | Рік  |\n"
               "+------+------------------+--------------+---------+--------------+------+\n");
        for (int i = 0; i<count; i++)
        {
            printf("| %-4d",      i+1);
            printf(" | %-16s",    shop[i].film);
            printf(" | %-12s",    shop[i].country);
            printf(" | %-7.2f",   shop[i].time);
            printf(" | %-12s",    shop[i].janre);
            printf(" | %-2d |\n", shop[i].data);
        }
        printf("+------+------------------+--------------+---------+--------------+------+\n");
    }
    else printf("Файл порожній!!!\n");
}
long file_element()
{
    FILE  *fp;
    if ((fp = fopen(FName, "ab")) == NULL)
        printf("Помилка при відкритті файлу.\n");
 
 
    fseek(fp, 0, SEEK_END);
    long i = ftell(fp) / sizeof(struct food);
    fclose(fp);
    return i;
}

структура

struct food
{
    int id;
    char film[30];
    char country[30];
    float time;
    char janre[30];
    int data;
} *shop;

потрібно посортувати по алфавіту жанри

Post's attachments

Безымянный.png 27.86 kb, 42 downloads since 2014-11-02 

15

Re: Робота зі списком фільмів (мова С)

Залишилося відповісти на одне з моїх попередніх питань; ну і додається нове питання - що таке films і films::genre, і який вони мають стосунок до food і (мабуть) food::janre?
І, до речі, рядки-масиви порівнюються через strcmp.

16

Re: Робота зі списком фільмів (мова С)

apolof написав:

виводить дані з файла

void film_print()
{
    int count = file_element();
    if (count != 0)
    {
        printf(" \n--Список фільмів;\n");
        printf("+------+------------------+--------------+---------+--------------+------+\n"
               "| Ід   |   Назва фільму   |    Країна    |   Час   |     Жанр     | Рік  |\n"
               "+------+------------------+--------------+---------+--------------+------+\n");
        for (int i = 0; i<count; i++)
        {
            printf("| %-4d",      i+1);
            printf(" | %-16s",    shop[i].film);
            printf(" | %-12s",    shop[i].country);
            printf(" | %-7.2f",   shop[i].time);
            printf(" | %-12s",    shop[i].janre);
            printf(" | %-2d |\n", shop[i].data);
        }
        printf("+------+------------------+--------------+---------+--------------+------+\n");
    }
    else printf("Файл порожній!!!\n");
}
long file_element()
{
    FILE  *fp;
    if ((fp = fopen(FName, "ab")) == NULL)
        printf("Помилка при відкритті файлу.\n");
 
 
    fseek(fp, 0, SEEK_END);
    long i = ftell(fp) / sizeof(struct food);
    fclose(fp);
    return i;
}

структура

struct food
{
    int id;
    char film[30];
    char country[30];
    float time;
    char janre[30];
    int data;
} *shop;

потрібно посортувати по алфавіту жанри

struct films
{
    int id;
    char film[30];
    char country[30];
    float time;
    char janre[30];
    int data;
} *shop;

ось так food стара назва замість неї films

17

Re: Робота зі списком фільмів (мова С)

Іще один партизан?

18

Re: Робота зі списком фільмів (мова С)

Чому?

19

Re: Робота зі списком фільмів (мова С)

Бо я питав, як пов'язані file_element() і shop, і відповіді ще не отримав; крім того, стає незрозумілим, з якого файлу виводить film_print(). Ну і загадкою лишається films::genre.
На майбутнє - не варто викладати в питаннях про код світову історію, власну біографію і попередні версії коду, якщо вони не мають суттєвого значення для питання.