Програми з двох файлів

Компільовані одиниці (файли) у складі програми. Забезпечення погодженості типів. Передача параметрів, параметри за замовчуванням, перевантаження імен функцій, їх опис і визначення. Приклади програми з двох файлів, її лістинг. Інструкція для користувача.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 06.01.2012
Размер файла 16,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

20

Міністерство освіти і науки України

Український державний університет водного господарства і природокористування

Кафедра електротехніки і автоматики

Курсова робота

з курсу “Програмування і алгоритмічні мови”

Виконала: студентка

І курсу групи АУТП - 11

Лозіна Ірина Ігорівна.

Перевірив: Пастушенко В.Й.

Рівне 2002

Зміст

  • Вступ
  • Приклад програми з двох файлів
  • Компонування
  • Інструкція користувачу
  • Висновки

Вступ

Ітераціия властива людині, рекурсія божественна. - Л. Пітер Дойч.

Всі нетривіальні програми складаються з декількох роздільно компільованих одиниць (їх прийнято називати просто файлами). Розглянемо, як роздільно відкомпільовані функції можуть бути в обігу одна до одної, як такі функції можуть спільно користуватися даними (розділяти дані), і якомога забезпечити погодженість типів, що використовуються в різних файлах програми. Сюди входять передача параметрів, параметри за замовчуванням, перевантаження імен функцій, та опис і визначення функцій.

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

Звичайна СІ-програма являє собою визначення функції main, що для виконання необхідних дій викликає інші функції. Зв'язок між функціями здійснюється по даним шляхом передачі параметрів і повернення значень функцій. Але компілятор мови СІ дозволяє також розбити програму на декілька окремих частин (вихідних файлів), відкоригувати кожну частину окремо, і після цього об'єднати всі частини в одну, що виконується файлом за допомогою редактора зв'язків. При такій структурі вихідної програми функції,що знаходяться в різних вихідних файлах можуть використовувати глобальні зовнішні змінні.

Всі функції в мові СІ по визначенню зовнішні і завжди доступні з будь-яких файлів. Наприклад, якщо програма складається з двох вихідних файлів, як показано нижче., то функція main може викликати будь-яку з трьох функцій fun1, fun2, fun3, а кожна з цих функцій може викликати будь-яку іншу.

main ()

{.

}

fun1 ()

{.

}

fun2 ()

{.

}

fun3 ()

{.

}

file1. c

file2. c

Приклад програми з двох файлів

Для того, щоб функція, що визначається могла виконувати будь-які дії, вона повинна використовувати змінні. В мові СІ всі змінні повинні бути оголошені до їхнього використання. Оголошення встановлюють відповідність імені та атрибутів змінної, функції або типу. Визначення змінної викликає виділення пам'яті для зберігання її значення. Клас пам'яті, що виділяється визначається специфікатором класу пам'яті, і визначає час життя і область видимості змінної, зв'язані з поняттям блоку програми. В мові СІ блоком вважається послідовність оголошень, визначень і операторів, укладена в фігурні дужки. Існують два види блоків - складений оператор і визначення функції, що складається з складеного оператора, який є тілом функції, і що передує тілу заголовка функції (в який входять ім'я функції, типи значення,що вертається і формальних параметрів). Блоки можуть включати в себе складені оператори, але не визначення функцій. Внутрішній блок називається вкладеним.

програма користувач лістинг параметр

Розглянемо приклад з калькулятором. Він був представлений у вигляді одного вихідного файлу. Якщо ви його набили, то у вас напевне були невеликі труднощі з розташуванням описів в правильному порядку, і довелося використати по меншій мірі один 'фальшивий' опис, щоб компілятор зміг обробити взаємно рекурсивні функції expr (), term () і prim (). В відзначимо, що програма складається з чотирьох частин (лексичного аналізатора, програми синтаксичного розбору, таблиці імен і драйвера), але це ніяк не було відбите в тексті самої програми. По суті, калькулятор був написаний по-іншому. Так це не робиться; навіть якщо в цій програмі 'навикид' зневажити всіма міркуваннями методики програмування, експлуатації і ефективності компіляції, автор все одно розіб'є цю програму в 200 рядків на декілька файлів, щоб програмувати було приємніше. Програма, що складається з декількох роздільно компільованих файлів, повинна бути погодженої в сенсі використання імен і типів, точно так же, як і програма, що складається з одного вихідного файлу. В принципі, це може забезпечити і компонувальник.

Компонувальник - це програма, що стикує окремо скомпільовані частини разом. Компонувальник часто (плутаючи) називають загрузчиком. В UNIX компонувальник називається ld. Однак компонувальник, наявні в більшості систем, забезпечують дуже слабку підтримку перевірки погодженості. Програміст може компенсувати нестачу підтримки з боку компонувальника, надавши додаткову інформацію про типи (опису). Після цього погодженість програми забезпечується перевіркою погодженості описів, що знаходяться в окремо компільованих частинах. Засоби, що це забезпечують, в CІ розроблені так, щоб сприяти такій явній компоновці.

Компонування

Якщо не вказане інше, то ім'я, що не є локальним для функції або класу, в кожній частині програми, зкомпільованій окремо, повинно відноситись до одного і того же типу, значенню, функції або об'єкту. Тобто, в програмі може бути тільки один нелокальний тип, значення, функція або об'єкт з цим ім'ям. Розглянемо, наприклад, два файли:

// file1. c:

int a=1;

int f () { /*щось робить*/ }

// file2. c:

extern int a;

int f (); void g () {a=f (); }

a і f (),

що використаються g () в файлі file2. c, - ті же, що визначені в файлі file1. c. Ключове слово extern (зовнішній) вказує, що опис a в file2. c є (тільки) описом, а не визначенням. Якщо б a ініціалізувалась, extern був б просто проігноровано, оскільки опис з ініціалізацією завжди є визначенням. Об'єкт в програмі повинен визначатися тільки один раз. Описуватися він може багато раз, але типи повинні точно погоджуватися. Наприклад:

// file1. c:

int a=1;

int b=1;

extern int c;

// file2. c:

іnt a;

extern double b;

extern int c;

Тут три помилки: a визначене двічі (int a; є визначенням, що означає int a=0;), b описане двічі з різними типами, а c описане двічі, але не визначене. Ці види помилок (помилки компоновки) не можуть бути виявлені компілятором, що за один раз бачить тільки один файл. Компонувальник, однак, їх виявляє. Наступна програма не є C++ - програмою (хоча CІ програмою є):

// file1. c:

int a;

int f () {return a; }

// file2. c:

int a;

int g () {return f (); }

По-перше, file2. c не C++, тому що f () не була описана, і тому компілятор буде незадоволений. По-друге, (коли file2. c фіксований) програма не буде скомпонована, оскільки a визначене двічі. Ім'я можна зробити локальним в файлі, описавши його static. Наприклад:

// file1. c:

static int a=6;

static int f () {/*. */}

// file2. c:

static int a=7;

static int f () {/*. */}

Оскільки кожне a і f описане як static, в результаті програма,що одержується є правильною. В кожному файлі своя a і своя f (). Коли змінні і функції явно описані як static, частину програми легше зрозуміти (вам не треба нікуди більше заглядати). Використання static для функцій може, окрім цього, вигідно впливати на витрати за викликом функції, оскільки дасть оптимізуючому компілятору більш просту роботу.

Розглянемо два файлу:

// file1. c:

const int a=6;

inline int f () { /*. */ }

struct s {int a, b; }

// file1. c:

const int a=7;

inline int f () { /*. */ }

struct s {int a, b; }

Раз правило 'рівно одне визначення' застосовується до констант, inline - функцій і визначення функцій так же, як воно застосовується до функцій і змінних, то file1. c і file2. c не можуть бути частинами однієї C++ - програми. Але якщо це так, то як же два файли можуть використати одні і ті же типи і константи? Коротко, відповідь така: типи, константи і т.д. можуть визначатися стільки раз, скільки потрібно, за умови, що вони визначаються однаково. Повна відповідь декілька більш складна.

Інструкція користувачу

Програма запускається і видає на екран меню з трьох пунктів (формування файлу, запит, вихід).

На вибір першої опції меню формується на одному з дискових пристроїв двійковий файл SESSIA. DAT, що містить зведення про здачу студентами сесії. Структура запису: індекс групи (7 символів), Ф. И.О. студента (15 символів), оцінки по чотирьох іспитах (чи символи цифри в діапазоні 2 5) і п'яти залікам (“s" - зараховано, “n” - не зараховано). Організовується заповнення файлу вмістом у режимі діалогу з користувачем (уведення закінчується набором індексу групи, що складається з 7 пробілів). Якщо файл із таким ім'ям існує, його коректування не робиться.

На вибір другої опції меню надається можливість користувачу:

ь по введенню прізвища студента одержати результати сесії;

ь по введенню групи одержати результати здачі сесії групою з підрахунком кількості студентів, що здала всі заліки й іспити на “4” і ”5”, і кількість невстигаючих студентів, що не здали хоча б один чи залік що мають “2” хоча б з одного іспиту.

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

Лістинг програми

#include <conio. h>

#include <dos. h>

#include <string. h>

#include <stdlib. h>

#include <stdio. h>

#include <limits. h>

#include <time. h>

#include <math. h>

#include <iostream. h>

#include <math. h>

#include <graphics. h>

#define PI M_PI

const char *filename = "SESSIA. DAT";

void draw (int x0, int y0)

{

unsigned char color [16] ={0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};

struct bmpinfo

{

char h1,h2;

unsigned long

size,reserved,offset,b,width,height;

unsigned int plans,bpp;

};

bmpinfo info;

FILE *f;

int x,y;

unsigned char b;

unsigned char bh;

unsigned char bl;

int nb;

int np;

int i,j;

if ( (f=fopen ("63. bmp","rb")) ==NULL)

printf ("-1");

// return - 1;

fread (&info,sizeof (info),1,f);

if (info. bpp! =4)

printf ("-2");

// return - 2;

x=x0;

y=y0+info. height;

nb= (info. width/8) *4;

if ( (info. width/8)! =4) nb+=4;

fseek (f, info. offset,SEEK_SET);

for (i=0; i<=info. height; i++)

{

np=0;

for (j=4; j<nb; j++)

{

b=fgetc (f);

if (np<info. width)

{

bh=b>>4;

putpixel (x,y,color [bh]);

x++;

np++;

}

if (np<info. width)

{

bl=b&15;

putpixel (x,y,color [bl]);

x++;

np++;

}

}

x=x0;

y--;

}

fclose (f);

}

void help_ (void)

{

restorecrtmode ();

clrscr ();

textmode (BW80);

textcolor (2);

cprintf (" Мiнiстерство освiти i науки України");

printf ("\n");

cprintf (" Рiвненський державний технiчний унiверситет");

printf ("\n");

cprintf (Кафедра електротехнiки i автоматики");

printf ("\n\n\n\n\n");

printf (" ");

textcolor (4);

cprintf ("КУРСОВА РОБОТА");

printf ("\n");

textcolor (7);

printf ("\t\t");

cprintf (" з курсу: \"Програмування та алгоритмiчнi мови\"");

printf ("\n");

textcolor (7);

printf ("\t\t");

cprintf (" на тему: \"Розробка програми для вiдображення ");

printf ("\n");

printf ("\t\t ");

cprintf ("динамiчних характеристик перетворювання iнформацii\"");

printf ("\n\n\n\n\n\n");

textcolor (2);

printf ("\t\t\t\t\t\t");

cprintf ("Виконала студентка I-го курсу");

printf ("\n");

printf ("\t\t\t\t\t\t");

cprintf ("групи АУТП-1");

printf ("\n");

printf ("\t\t\t\t\t\t");

cprintf ("Лозiна Iрина Iгорiвна");

printf ("\n\n\n\n");

printf ("\t\t\t ");

textcolor (58);

cprintf ("РIВНЕ-2002");

textcolor (WHITE + BLINK);

printf ("\n\t\t\t");

cprintf (" натиснiть будь-яку клавiшу");

getch ();

textcolor (GREEN);

setgraphmode (getgraphmode ());

}

// #####################################################

void dbcreate (void)

{

restorecrtmode ();

clrscr ();

textmode (BW80);

textcolor (2);

FILE *outfile;

char gid [8], fio [16], ball [10];

char *ptr;

if (fopen (filename, "r")! = NULL) return;

if ( (outfile = fopen (filename, "w")) == NULL) return;

textbackground (BLACK);

textcolor (LIGHTGREEN);

for (;;)

{

clrscr ();

cprintf ("Введiть номер групи: ");

fgets (gid, 8, stdin);

ptr = gid;

while (*ptr! = 0) {*ptr == '\n'? *ptr=0: *ptr; *ptr == '\r'? *ptr=0: *ptr; *ptr++; }

if (strcmp (gid, " ") == 0)

{

fclose (outfile);

return;

}

fflush (stdin);

cprintf ("Введiть им'я студента: ");

fgets (fio, 16, stdin);

ptr = fio;

while (*ptr! = 0) {*ptr == '\n'? *ptr=0: *ptr; *ptr == '\r'? *ptr=0: *ptr; *ptr++; }

fflush (stdin);

cprintf ("Оцiнка екз № 1: ");

fgets (ball+0, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка екз № 2: ");

fgets (ball+1, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка екз № 3: ");

fgets (ball+2, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка екз № 4: ");

fgets (ball+3, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка зал № 1: ");

fgets (ball+4, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка зал № 2: ");

fgets (ball+5, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка зал № 3: ");

fgets (ball+6, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка зал № 4: ");

fgets (ball+7, 2, stdin);

fflush (stdin);

cprintf ("Оцiнка зал № 5: ");

fgets (ball+8, 2, stdin);

fflush (stdin);

fprintf (outfile, "%10s %20s %s\n", gid, fio, ball);

}

setgraphmode (getgraphmode ());

}

// #####################################################

void dbshow (void)

{

restorecrtmode ();

clrscr ();

textmode (BW80);

textcolor (2);

FILE *infile;

char request [16];

char record [64];

char ball [20];

char gid [20];

char fio [20];

char *ptr;

int goodc=0;

int badc=0;

*gid = 0; *fio = 0; *ball = 0;

if ( (infile = fopen (filename, "r")) == NULL) return;

textbackground (BLACK);

textcolor (LIGHTRED);

clrscr ();

cprintf ("Введи запрос: ");

fgets (request, 16, stdin);

ptr = request;

while (*ptr! = 0) {*ptr == '\n'? *ptr=0: *ptr; *ptr == '\r'? *ptr=0: *ptr; *ptr++; }

fflush (stdin);

textcolor (WHITE);

cprintf ("\n\n % - 10s % - 20s % - s\r\n\n", "Група", "Студент", "Оцiнки");

textcolor (YELLOW);

while (! feof (infile))

{

fgets (record, 64, infile);

sscanf (record, "%s %s %s", gid,fio,ball);

if ( (strcmp (gid, request)! = 0) && (strcmp (fio, request)! = 0)) continue;

textcolor (YELLOW);

if (strpbrk (ball, "32n") == NULL) {goodc++; textcolor (LIGHTGREEN); }

if (strpbrk (ball, "2n")! = NULL) {badc++; textcolor (LIGHTRED); }

cprintf (" % - 10s % - 20s % - s\r\n", gid, fio, ball);

}

getch ();

setgraphmode (getgraphmode ());

}

// #####################################################

void dbshow (void);

void dbcreate (void);

void Pidgotovka (void);

void *saucer;

int size;

void main (void)

{

int STEP=100;

char c,vub;

int X,y,q=1, i,u=5,nuz,wer,poo;

int gdriver=DETECT,gmode,errorcode;

initgraph (&gdriver,&gmode,"");

errorcode=graphresult ();

if (errorcode! =grOk)

{

printf ("Помилка графiчного режиму типу: %s\n",grapherrormsg (errorcode));

printf ("Натиснiть будь-яку клавiшу для виходу");

getch ();

exit (1);

}

help_ ();

poch:

q=1;

X=140;

y=100;

Pidgotovka ();

// меню

setfillstyle (1,7);

setcolor (11);

settextstyle (0,0,1);

outtextxy (269, 123, "Формування");

outtextxy (295,227,"Запит");

outtextxy (298, 340, "Bихiд");

// перемiщення в меню

do

{

putimage (X,y,saucer,XOR_PUT);

c=getch ();

putimage (X,y,saucer,XOR_PUT);

switch (c)

{

case 80: y+=STEP; q++; if (y==400) {y=100; q=1; }break;

case 72: y-=STEP; q--; if (y==0) {y=300; q=3; }break;

case 13: if (q==3) goto po;

if (q==1)

{ dbcreate ();

goto poch; }

if (q==2)

{ dbshow ();

goto poch; }

}

} while (c! =27);

po:

free (saucer);

closegraph ();

}

void Pidgotovka (void)

{

draw (0,-2);

size=imagesize (133,100,230,180);

saucer=malloc (size);

getimage (133,100,230,180,saucer);

putimage (133,100,saucer,XOR_PUT);

}

Висновки

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

Це є важливою перевагою при написанні і компілюванні програм.

Размещено на Allbest.ru


Подобные документы

  • Порядок проектування програми для перегляду текстових файлів різного розміру, сфера її практичного застосування та алгоритм написання. Опис і обґрунтування проектних рішень системи. Інструкція користувача та текст програми, проведення її листингу.

    курсовая работа [20,7 K], добавлен 08.08.2009

  • Написання програм для перейменування файлів та копіювання файлів і підкаталогів (аналоги REN, XCOPY). Вибір методу розв'язки задачі та його обґрунтування. Алгоритм та реалізація програми, її системні вимоги. Інструкція для користувача та лістинг.

    курсовая работа [14,7 K], добавлен 08.08.2009

  • Актуальність розробки програми для відновлення помилково вилучених з диску комп'ютера файлів. Програма-аналог програми Dос Undelete на мові програмування ASM-86. Елементи каталогу, що стосуються відновлення стертих файлів. Алгоритм програми та її лістинг.

    курсовая работа [33,2 K], добавлен 08.08.2009

  • Основи розробки додатків Windows. Параметри функції WinMain. Запуск процесу, використання для цього вибраних на диску файлів. Відслідковування кожного з процесів (його статус, назву, час життя), діяльності користувача. Опис алгоритму роботи програми.

    курсовая работа [202,6 K], добавлен 14.05.2015

  • Аналіз теоретичної бази методів інтерполювання функцій. Розробка алгоритмів та вибір оптимального. Приклад програми інтерполювання функції за допомогою інтерполяційного многочлена Лагранжа: інструкція користувача, опис, тестування та лістинг програми.

    курсовая работа [1,0 M], добавлен 19.09.2013

  • Розробка програми GameBox, яка включає в себе дві гри, судоку та пятнашки. Опис структури даних та вимоги до них, процедур і функцій користувача, стандартних процедур і функцій, які використовувались в програмі, та файлів. Результати роботи програми.

    курсовая работа [5,3 M], добавлен 12.11.2011

  • Поняття про програму "Файловий менеджер". Середовище розробки, програмування в Delphi. Програма та методика тестування, інструкція користувача. Послідовність запуску програми, загальний вигляд лістингу, перенесення файлів. Блок-схема та UML-діаграма.

    курсовая работа [1,3 M], добавлен 19.11.2013

  • Робота з файлами, використовування програм-переглядачів, що забезпечують прокрутку тексту у вікні перегляду. Перегляд файлів в текстовому та інших форматах (шістнадцятеричному та бінарному). Алгоритм програми, системні вимоги, інструкція для користувача.

    курсовая работа [16,5 K], добавлен 08.08.2009

  • Опис структури даних та вимоги до них, процедур і функцій користувача, файлів та їх призначення. Інструкція для роботи з програмою. Результати роботи програми, її структура та функціональні компоненти, принципи роботи та сфери практичного застосування.

    курсовая работа [330,6 K], добавлен 04.02.2015

  • Створення комп'ютерної програми на мові програмування С++ для ведення обліку мобільних телефонів на складі-магазині. Вимоги до апаратного та програмного забезпечення. Схема зв'язку між складовими частинами програми. Інструкція користувача, тестування.

    дипломная работа [4,2 M], добавлен 06.06.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.