Хоревики


Веждесъщото тефтерче

Така днес бат Младен прояви амбиция да учи Си. Аз го насочих към една двутомна книга която си купих преди време и никога не прочетох а именно “Програмиране на Паскал и Си”. Не я прочетох не защото е лоша, просто не ми остана време. Та взе той лаптопа, който Владо домъкна, инсталира едно BC и реши да прави нашата весдесъща задача: “Електронно тефтерче”. Тъй като никога не съм учил Си и не го познавам, аз също се амбицирах. Резултатът е “работеща” програма с 1000 дупки предполагам но все пак мога да и лепна гордо етикета “май че работи” с условието че потребителя не е глезен и иска да работи а не да забива програмата. Реших да споделя първите си стъпки с вас. Може на някой да са полезни.

Задание: Да се състави програма на Си реализираща следната функционалност

  • добавяне на име и телефон
  • показване на всички добваени имена и телефони
  • имената и телефоните да се записват в бинарен файл.

Ето това успях да сътворя:

/*Тук се декларираме кои библиотеки ще ползваме,
stdio.h се ползва повсеместно и поголовно в почти всички
Си сорс кодове които съм виждал, а аз съм виждал малко.
stdlib.h в случая изглежда служи само да си начешем
крастата и да върнем EXIT_SUCCESS дефинирано като
константа. Със същият успех може да си ползвате 0.
*/

#include <stdio.h>
#include <stdlib.h>

/*Тези функции ще ми трябват. Обещавам. За това си
ги дефинирам кротко тук. За да не си говорим после
с компилатора за майките си*/

int menu (void);
void insert(void);
void showFile(void);

/*Структура. Като един от строителите на светлото
бъдеще не мога да мина без структура. Просто и
ясно вътре са ми двете променливи име и телефон
заради които е цялото това потене. record ми се
казва променливата. Не е някоя резервирана дума*/

struct
{
 char name[30];
 char phone[15];
} record;

/*Функцията която ни излага пред света с думи прости
чете всички глупости които сме записали във файла и
ни ги поднася в удобен за логаритмуване вид. т.е.
"Ако не минаваха толкова бързо можеше и да ги прочета.
Абе коя беше комбинацията за спиране?" Жокер!
Комбинацията е Ctrl-S или Ctrl-Pause*/

void showFile(void)
{
 /*f е указателя към нашия файл. Можете да си го
 представите като неговата опашка, откривате го и го
 хващате за опашката за да свърши малко полезна работа*/
 FILE *f;
 /*Процесът на хващане за опашката. малкото "r" означава
 "само за четене" т.е. му обещаваме че нищо лошо няма да
 му направим */
 if ((f = fopen("data.dat", "r")) != NULL){
   printf("--------------------\n");
   /*Да свършим това за което сме дошли. Четем посредством
   fread &record ни е указател към структурата,
   sizeof(record) е размерът и, 1 е позицията от която
   започваме да четем а f си ни е опашлето на файла*/
   while (fread(&record, sizeof(record), 1, f)==1){
     /*Хванахме някакви данни. Сега е момента да ги покажем
     на уважаемият потребител*/
     printf("    Име: %s\n", record.name);
     printf("Телефон: %s\n", record.phone);
     printf("- - -\n");
   }
   printf("--------------------\n");
   /*Затваряме файла. Пускаме му опашката и да си ходи по
   живо, по здраво. Нали по-горе му обещахме*/
   fclose(f);
 }
};

/*Това е мястото от което ще наливаме данните. Една черна
дупка за нашите данни. Както е местната данъчна служба за
парите ни*/

void insert(void)
{
 /*Извеждаме*/
 printf("Въведете име: ");
 /*Въвеждаме*/
 scanf("%s", record.name);
 /*Извеждаме*/
 printf("Въведете телефон: ");
 /*Въвеждаме*/
 scanf("%s", record.phone);
 /*След толкова вънка-вътре предполагам че няма да вярвате
 на онези лаици, които твърдят че програмирането не е като
 секса*/
 /*Време е да запишем това което нашият потребител въведе*/
 if (strlen(record.name) > 0) {
   /*пъци, пъци файлче*/
   FILE *f;
   /*щляп по опашката и едно "a+" за да можем да му запишем
   нашите ценни данни*/
   if ((f = fopen("data.dat", "a+")) != NULL){
     /*пишем си аналогично на fread*/
     fwrite(&record, 1, sizeof(record), f);
     /*като добри деца пак пускаме опашлето*/
     fclose(f);
   }
 };
};

/*Менюто. Какво ще желае почитаемият Клиент днес? суПичка,
манджичка и десертче? Идеално.*/

int menu (void)
{
 int resp;
 printf("Тефтерче версия 0.1\n");
 printf("--------------------\n");
 printf("1. Добавяне\n");
 printf("2. Извеждане\n");
 printf("3. Изход\n");
 /*Вземаме поръчката и ..*/
 scanf("%d", &resp);
 /*..я връщаме към шефа*/
 return resp;
};

/*main или "голямото добро утро" т.е. каквото има да става
да става и то тук. Това е основната функция на програмката
ни. Като я стартираме тя влиза тук и си поръчва две бързи
питиета на бармана. int си я слагаме за да кажем на
операционната система дали сме се справили или както
обикновено пак нещо се е объркало*/

int main(int argc, char *argv[])
{
 int resp;
 /*Показваме менюто*/
 resp = menu();
 /*Показваме менюто до посиняване т.е. 3*/
 while ((resp) != 3) {
   /*Хвърляме боб за да разберем какво си е избрал
   потребителя*/
   switch (resp)
   {
     case 1:
       {
         /*Ще въвеждаме*/
         insert();
         resp=0;
         break;
       }
     case 2:
       {
         /*Ше се излагаме*/
         showFile();
         resp=0;
         break;
       }
     case 3:
       {
         /*Ще си лягаме*/
         break;
       }
     default:
     {
       /*До посиняване казах*/
       resp = menu();
     }
   };
 }
 /*Всички са доволни. Време е да задоволим и
 операционната система*/
 return EXIT_SUCCESS;
}

Отричам се!. Не гарантирам нищо около този код. Може да не работи. Може и да ви съсипе живота, кариерата и семейното щастие. Ползвайте го на собствена отговорност.