Реферат Курсовая Конспект
Лекция 1 Понятие программы и языка программирования - раздел Программирование, Лекция 1 ...
|
Структурная схема компьютерной программы
Взаимосвязь алгоритма и данных в программе не является простой и линейной. Процесс выполнения любой программы можно рассматривать с двух точек зрения: как последовательность выполнения команд, в которых содержится информация об операндах (данных), которые они обрабатывают – поток команд (поток управления).С другой стороны – любой элемент данных можно рассматривать как результат выполнения действий над исходными данными и как источник данных (операнд) для последующих результатов (Рис.1.1), т.е. в программе также присутствует логическая последовательность вычислений (преобразований данных), называемая потоком данных.Исторически сложилось так, что в традиционной (фон Неймановской) архитектуре в программе в явном виде задается последовательность команд, т.е. программа выглядит как поток управления,в котором алгоритмическая компонента является первичной (ведущей), а данные – вторичной (ведомой).
Рис.1.1. Структурная схема компьютерной программы
Вычисление суммы и количества целых чисел, введенных пользователем с клавиатуры
Демонстрация работы со строками на основе использования класса string
//proba_4.cpp
#include <iostream>
#include <string> //библиотечный класс string
#include <conio.h>
using namespace std;
int main() {
string response="Enter Your name: "; //определение строки response класса string
cout << response;
string name; //определение объекта-строки name класса string
cin >> name; //ввод значения объекта-строки name до пробела
string greeting ="Hello, "; //определение строки greeting класса string
greeting = greeting + name + "!"; //конкатенация (сцепление) строк
cout << greeting << endl;
_getch();
return 0;
}
Результаты выполнения программы:
Enter Your name:Larisa<enter>
Hello, Larisa!
Виды представления программы и данных
Программа имеет два представления:
o последовательность машинных команд, которая получается как результат обработки (компиляции) исходного текста программного модуля и которая не может быть непосредственно выполнена компьютером (объектный код);
o двоичный машинный код, готовый к исполнению и хранимый в виде exe-файла;
Данные имеют также два представления:
· внешнее – в тексте программы, при вводе или выводе значений на экран и, возможно, хранении (в текстовом файле)
· внутреннее – двоичный код, формируемый по определенным правилам компилятором и средой исполнения в оперативной памяти (в зависимости от типа данного).
Процесс компиляции программы
Функцию перевода программы в машинный код выполняет программа-транслятор,имеющая две разновидности: компилятор и интерпретатор.
Интерпретация – непосредственное выполнение программы на языке высокого уровня, не требующее трансляции инструкций (операторов) формального языка в машинный код. Интерпретаторы требуют наличия исполняющей среды для выполнения программы; удобны, когда программы часто перекомпилируются для добавления в них новых возможностей и исправления ошибок.
Компиляция–перевод текста программы с исходного формального языка на другой, более простой язык. Скомпилировать исходный код – означает выполнить программу-компилятор.В С++ компилятор является одним их компонентов IDE (Integrated Development Environment) – интегрированной среды разработки, предоставляющей программисту средства для комплексной работы с программой (редактирование, компиляция, компоновка, загрузка, выполнение, отладка, справка). Удобство IDE (например, Microsoft Visual Studio 2005) заключается в том, что не приходится работать с множеством приложений, так как все задачи выполняются в рамках IDE.
Компиляция и интерпретация отличаются совмещением фаз обработки объектов программы во времени:
· при компиляции фазы преобразования и выполнения действий разнесены во времени, но зато каждая из них выполняется над всеми объектами программы одновременно;
· при интерпретации, наоборот, преобразование и выполнение действий объединены во времени, но для каждого объекта программы. Отлаженные скомпилированные программы выполняются более эффективно.
Различные языки программирования включают процессы компиляции и интерпретации в разных пропорциях и сочетаниях. Язык Си++ является «чистым компилятором»:результатом трансляции является программный код, в который транслятор не включает никаких «лишних» команд (например, проверки установленных ограничений или обнаружения ошибок), что позволяет гарантировать эффективность и независимость программного кода и делает язык единственным (кроме Ассемблера) языком системного программирования, на котором пишутся ядро операционной системы, драйверы и т.п.
Классическая схема подготовки исполняемой программы
Программа выполняется в компьютере, архитектура которого обеспечивает язык программирования, именуемый машинным кодом.Данные в этом языке представлены машинными словами,хранящимися в памяти и в регистрах процессора, а выполняемые действия – системой команд. Рассмотрим схему подготовки исполняемой программы в типичной среде программирования С++ (Рис.1.3):
(1) – программа набирается в текстовом редакторе среды разработки и запоминается на диске (расширение имени файла .срр);
(2) – программа-препроцессор распознает в тексте программы директивы препроцессора (начинаются с символа #), обрабатывает директиву #include<…..>и подключает к исходному тексу программы указанные в ней файлы. Основная цель препроцессора – закончить формирование исходного кода программы на С++, поэтому типичное для него действие – добавление или изменение исходного кода перед компиляцией. Выполняя директиву, препроцессор преобразовывает исходный код программы в расширенный код («единицу трансляции»), который и подается на вход компилятора.
(3) – программа-компилятор выделяет лексемы (минимальные смысловые конструкции языка), затем на основе грамматики языка распознает более сложные смысловые конструкции языка (определения, объявления, выражения, операторы и т.д.), построенные из лексем, выявляет синтаксические ошибки и при их отсутствии создает код на языке Ассемблера; в языке программирования Ассемблерсистема команд, способы адресации, машинные слова и их адреса обозначаются символическими именами; Ассемблер работает с компьютерной архитектурой, но ее элементы представлены не во внутренней (двоичной) форме, а в обычной текстовой;
Рис.1.3. Схема подготовки исполняемой программы в типичной среде программирования С++
(4) – программа-ассемблерпереводитассемблерный код на машинный язык, создает объектный модуль программы с расширением .obj и сохраняет его на диске. Файл, содержащий скомпилированную программу, – это объектный модуль программы.
(5) – программа-компоновщик (редактор связей, Linker) объединяет объектный код программы (совместно компилируемые модули) с объектными кодами используемых ею библиотечных функций (библиотечные файлы имеют расширение .lib) и стандартным кодом начальной загрузки, в результате чего создается исполняемый загрузочный модуль программы – файл с расширением .exe, сохраняемый на диске. Обычно программы содержат ссылки на функции, определенные вне самой программы: в стандартных или личных библиотеках, а объектный код содержит «дыры» из-за этих отсутствующих частей; компоновщик заполняет эти «дыры».
(6) – программа-загрузчик размещает скомпонованную программу в памяти (забирает исполняемый код с диска и размещает его в памяти).
Язык Си++ имеет прямой выход на компьютерную архитектуру, многие его компоненты напрямую на нее отображаются. Базовые типы данных совпадают с основными формами представления данных в процессоре, имеется прямое соответствие между переменными и машинными словами, набор операций соответствует общепринятому минимуму для системы команд, указатели интерпретируются как адреса, имеется возможность работы с памятью на низком (архитектурном) уровне. Поэтому Си++ можно назвать машинно-независимым Ассемблером. Особенности выполнения указанных действий зависят от конкретного компилятора языка С++ и операционной системы, в которой он работает. Технические подробности следует изучить по документации конкретного программного продукта.
Область определения глобальных переменных ограничена пределами одного файла (File1.cpp), и, следовательно, эти переменные невидимы в другом файле (File2.cpp). Для их использования требуется также объявление extern (например, линия 5 для массива array; линия 7 для переменной ext_ch; только функцияfunction3() для переменной ext_pp).
|
|
Рис.1.9. Структура программы из двух файлов и область действия переменных в программе
Пример более сложной программы на С++ (сортировка строк)[10]*
Программа сортирует строки в лексикографическом порядке, возрастающем или убывающем в зависимости от признака, передаваемого функции main() через аргумент argv, и выводит их на экран.
Исходный текст программы представлен в текстовых файлах (main.cpp, bblsort.cpp) и в заголовочных файлах (Рис.1.10):
· стандартном заголовочном файлеstdafx.h
· файлеbblsort.h (подключаемом в начале каждого из текстовых файлов в рамках файлаstdafx.h).
Рис.1.10. Структура программы сортировки строк
Программа с комментариями и подробное описание действий, выполняемых каждым фрагментом (А, B, C, D, …), представлены ниже:
//bblsort.h – заголовочный файл | |
А | #define MAXLINES 10 #define LINESIZE (12+1) |
//stdafx.h – стандартный заголовочный файл | |
B | #include <iostream> //для ввода/вывода #include <conio.h> //для _getch() #include <cstring> //для strcmp(), strcpy_s() #include "bblsort.h" //для MAXLINES, LINESIZE int rdlines(void); //прототипы функций, определенных в файле main.cpp void wrlines(int); int lexcmp(int, int);//прототипы функций,определенных в файле bblsort.cpp void swap(int, int); void bblsort(int); using namespace std; |
//main.cpp – программный файл | |
C | #include "stdafx.h" //подключение стандартного заголовочного файла |
D | //глобальные переменные char Line[MAXLINES] [LINESIZE]; //буфер строк int Revflg; //признак направления сортировки |
E | //определение функции main() int main (int argc, char **argv) //аргументы вызова программы // argc - число аргументов, argv – указатель на строки-аргументы |
{ | |
F | int numlines; //локальная переменная функции main() |
G | Revflg = (argc>1 && argv[1][0] =='-'); numlines = rdlines();//вызов функции ввода строк cout << "n----------------------n" ; bblsort(numlines);//вызов функции сортировки,аргумент – количество строк wrlines(numlines);//вызов функции вывода строк,аргумент – количество строк cout << "n----------------------n" ; _getch(); //функция _getch(); ожидает нажатия клавиши return 0; } |
H | //определение функции rdlines() ввода строк с клавиатуры static int rdlines() //функция доступна только в данном файлеmain.cpp |
I | { int i; //локальная переменная функции rdlines() for (i=0; i < MAXLINES; i++) if (!cin.getline(Line[i], LINESIZE) ) break; return i; //функция возвращает количество введенных строк } |
J | //определение функции wrlines() вывода n строк на экран static void wrlines(int n) //функция доступна только в файле main.cpp { unsigned i; //локальная переменная функции wrlines() for (i=0; i<n; i++) cout << Line[i] << endl; return; //функция выводит строки и ничего не возвращает } |
//bblsort.cpp – программный файл | |
K | #include "stdafx.h" //подключение стандартного заголовочного файла |
L | extern char Line [][LINESIZE]; //объявление массива Line, // определенного в файле main.cpp |
M | //определение функции bblsort()сортировки строк void bblsort( int n) // n - число строк { unsigned i, j; //локальные переменные функции bblsort() for (i=1; i<n-1; i++) for (j=n-1; j>=i; j--) if (lexcmp(j-1, j)) swap(j-1, j); return; //функция сортирует строки и ничего не возвращает } |
N | // определение функции lexcmp() сравнения строк //аргументы i, j – номера строк для сравнения static int lexcmp (int i, int j) {//функция доступна только в файле bblsort.cpp extern int Revflg; //объявление Revflg, определение в файле main.cpp int lc; lc= strcmp(Line[i], Line[j]); //библиотечная функция сравнения строк return ((lc<0 && Revflg) || (lc > 0 && !Revflg)); }//функция lexcmp() возвращает 1 или 0 в зависимости от результата //сравнения строк lc и признака Revflg направления сортировки |
O | //определение функции swap() обмена строк // аргументы i, j – номера строк для обмена static void swap( int i, int j) //функция доступна только в этом файле { char temp [LINESIZE]; strcpy_s(temp, Line[j]); //библиотечная функция копирования строк strcpy_s(Line[j], Line[i]); strcpy_s(Line[i], temp); return; //функция swap() меняет строки и ничего не возвращает } |
А– заголовочный файл bblsort.h с препроцессорными константами MAXLINES и LINESIZE. Препроцессорные константы обычно помещаются в заголовочный файл, включаемый в другие файлы программы, по мере необходимости. При изменении значений констант изменения затронут только файлbblsort.h.
B – стандартный заголовочный файл stdafx.h. Содержит директивы препроцессора для подключения стандартных заголовочных файлов с прототипами библиотечных функций (для работы со строками и другими функциями, вызываемыми в файле); директиву препроцессора для подключения пользовательского заголовочного файла bblsort.hс препроцессорными константами MAXLINES и LINESIZE; прототипы функций rdlines(), wrlines(), определенных в файле main.cpp, иlexcmp(), swap(), bblsort(), определенных в файле bblsort.cpp программы, а также директиву using namespace std; определяющую для данной программы в качестве пространства,в котором распознаются ее имена, стандартное пространство имен std (за пределами его имена будутнеизвестны).
БлокиотСдоJвключительно представляют содержание файла main.cppс головной функцией main()и вызываемыми в ее теле функциями rdlines()иwrlines().
– Конец работы –
Используемые теги: Лекция, Понятие, программы, языка, программирования0.075
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Лекция 1 Понятие программы и языка программирования
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов