Така днес бат Младен прояви амбиция да учи Си. Аз го насочих към една двутомна книга която си купих преди време и никога не прочетох а именно “Програмиране на Паскал и Си”. Не я прочетох не защото е лоша, просто не ми остана време. Та взе той лаптопа, който Владо домъкна, инсталира едно 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;
}
Отричам се!. Не гарантирам нищо около този код. Може да не работи. Може и да ви съсипе живота, кариерата и семейното щастие. Ползвайте го на собствена отговорност.