Разработка программы для создания и работы с двусвязным списком, состоящим из структур (Структура содержит название, цену, количество товара), страница 2

  scanf("%f", &tovar.cena); tekush->cena=tovar.cena;      // ввод данных о товарах

  printf(" \t \t kolichestvo: ");

  scanf("%d", &tekush->kolich);

  tekush->v1=predidush;

                        if (predidush!=NULL)

                        predidush->v2=tekush;                    // определение указателей на

                        else                                                   предыдущую и следующую структуру

                        nachalo=tekush;

  predidush=tekush;

  i++;

  printf("\n zakonchit? y/n" );    // запрос об окончании ввода данных

  c=getch();

  }

while (c!='y');

konec=tekush;

konec->v2=NULL;                    // если структура последняя, то ссылка на следующую = NULL

i=i-1;

vsego=i;

while (tekush!=NULL)

{dannie[i]=*tekush;

tekush=tekush->v1;

i--;

}

tf=fopen("file3.dat","wb+");     // открытие бинарного файла  file3.dat для записи данных

for (i=1;i<=vsego;i++)

{fwrite(&dannie[i],sizeof(dannie[i]),1,tf);     // запись данных о товарах

}

fclose (tf);                                                      // закрытие файла

}

void prosmotr(FILE *tf)            // функция просмотра файла

{

clrscr();

tf=fopen("file3.dat","rb");         // открытие бинарного файла  file3.dat для чтения данных

fread(&tovar,sizeof(tovar),1,tf);

while (!feof(tf))                          // пока не достигнут конец файла

{

printf("\nnazvanie: %10s     cena: %5.2f    kolichestvo: %3d ", &tovar.nazvanie, tovar.cena, tovar.kolich);                       // вывод информации о товарах на экран

fread(&tovar,sizeof(tovar),1,tf);

}

fclose (tf);                                  // закрытие файла

getch();

}

void udalenie(FILE *tf)                       // функция удаления заданного товара из списка

{ int j, nomer, vsego, i=1, y=0;

char udal[10];

clrscr();

tf=fopen("file3.dat","rb+");

printf("\n kakoi tovar udalit?   "); scanf("%s",&udal); // запрос названия товара для удаления

fread(&tovar,sizeof(tovar),1,tf);

   while (!feof(tf))

     {

        if (strcmp ((tovar.nazvanie), udal)==0) // если название введенного товара найдено

          {

            y=1;                     // условная переменная, принимающая значение 1 если товар найден

            nomer=i;                                  // запомним порядковый номер товара в общем списке

            while(!feof(tf))               // пока не достигнут конец файла

               {

                fread(&tovar,sizeof(tovar),1,tf);    // пропускаем один товар

                dannie[i]=tovar;                   // dannie[i] присваиваются новые значения товара (пропущен

                i++;                                                          введенный для удаления)

               }

           }

         if (y==1) break;                // если товар найден выйти из цикла

                dannie[i]=tovar;         // если товар пока не найден – продолжить присваивание dannie[i]

                fread(&tovar,sizeof(tovar),1,tf);

                i++;

      }

vsego=i-y;             // vsego – сколько наименований товаров осталось

if (y==0)                // если товар не найден в списке

{

printf("tovar %10s ne naiden", udal);            // тогда вывод сообщения «Товар не найден»…

getch();

return;                              // … и выход из функции «Удаление товара»

}

tf=fopen("file3.dat","wb+");               // открытие файла для записи

for (i=1; i<vsego; i++)

fwrite(&dannie[i],sizeof(dannie[i]),1,tf);       // запись данных с учетом удаления введенного товара

printf("tovar %10s udalen",udal);

fclose(tf);

getch();

}

void dobavlenie(FILE *tf)                   // функция добавления товара в конец списка

{

int i=1;

tf=fopen("file3.dat","rb+");       // открытие файла file3.dat для чтения и записи

clrscr();

fread(&dannie[i],sizeof(dannie[i]),1,tf);

while (!feof(tf))                          // пока не достигнут конец файла

{

 printf("\nnazvanie: %5s cena: %5.2f kolichestvo: %3d", dannie[i].nazvanie, dannie[i].cena, dannie[i].kolich);        // вывод всех данных на экран

 i++;

 fread(&dannie[i],sizeof(dannie[i]),1,tf);

}

tekush=(struct spisok *)malloc(sizeof(struct spisok)); // выделение памяти для структуры

printf("\n\n vvod dannih %2d-go tovara:",i);

fread(&tovar,sizeof(tovar),1,tf);

printf("\n nazvanie: ");

scanf("%s", tekush->nazvanie);

printf(" \n cena: ");                                                             // ввод данных о новом товаре

scanf("%f", &tovar.cena); tekush->cena=tovar.cena;       

printf(" \n kolichestvo: ");                                                 

scanf("%d", &tekush->kolich);

dannie[i]=*tekush;

fseek(tf,(i-1)*sizeof(tovar),0);             // смещаемся на позицию в файле для записи нового товара

fwrite(&dannie[i],sizeof(dannie[i]),1,tf);       // запись в конец нового товара

fclose(tf);

}

5. Результаты тестирования выполнения задания

При запуске программы выводится окно основного меню, включающего следующие возможности:

1  - создание нового списка товаров;

2  - просмотр списка товаров;

3  - добавление нового товара в конец списка;

4  - удаление любого товара из списка;

5  – выход из программы.

Рис. 5.1  Основное меню

Рассмотрим подробнее каждый пункт основного меню:

При выборе пункта меню «Создание списка» происходит создание нового списка товаров путем последовательного ввода названия, цены и количества товара. После каждого ввода программа осуществляет запрос на выход в основное меню «Закончить? y/n», при утвердительном ответе (клавиша ‘y’) программа возвращается в основное меню, в противном случае ввод данных продолжается.

Создается новый файл FILE3.DAT, в который сохраняется информация по введенным товарам.

Рис. 5.2  Создание нового списка товаров

При выборе пункта меню «Просмотр списка» происходит чтение информации из файла FILE3.DAT и вывод ее на экран:

Рис. 5.3  Просмотр списка товаров

При выборе пункта меню «Добавление в конец» на экран выводится информация об имеющихся товарах (для удобства) и предлагается ввести данные об очередном товаре, которые записываются в файл FILE3.DAT:

Рис. 5.4  Запись нового товара в конец списка

При выборе пункта меню «Удаление из списка» программа осуществляет запрос названия товара, который нужно удалить из списка. При этом происходит поиск названия введенного товара в имеющемся списке. В случае, если требуемого товара нет в списке выдается сообщение «Товар не найден» и программа переходит в основное меню. В случае наличия искомого товара, он удаляется из списка, и программа выдает сообщение «Товар название удален»

Рис. 5.5  Удаление товара из списка

При выборе пункта меню «Выход» происходит выход из программы.

5.  Список литературы

1.  Подбельский В.В., Фомин С.С. Программирование на языке Си: Учеб. пособие. – 2-е доп. изд. – М.: Финансы и статистика, 2007. - 600с.

2.  Конспект лекций сайта дистанционного обучения.