Методические указания по обработке списков

Рассмотрим в качестве примера организацию систем учета вкладов в отделении сбербанка. Будем считать, что в простейшем случае информация о вкладе содержит фамилию вкладчика и сумму вклада в рублях. Запишем эту информацию в виде структуры:

Struct vklad

{

char family[12];

float sum;

}

Пусть стоит задача разместить вклады в алфавитном порядке вкладчиков. Операции, которые надо произвести в программе, следующие: во-первых, нужно определить: имеется ли вкладчик с данной фамилией (НАЙТИ), во-вторых, включить новый вклад (ВКЛЮЧИТЬ), в-третьих, вычеркнуть вклад из системы (ИСКЛЮЧИТЬ).

Для обработки данных обо всех вкладах можно использовать массив вкладов:

strukt vklad array [1000],

тогда поиск вклада может быть выполнен быстро, например, при числе вкладов К при использовании метода деления пополам максимальное время поиска примерно пропорционально целой части двоичного логарифма К.

Однако, операция ВКЛЮЧИТЬ в общем случае требует сдвига части

массива. Удаление вклада приводит либо к незаполненным «окнам», когда информация стирается (например, поле family элемента массива array заполняется пробелами), либо опять требует сдвига части массива. Сдвиг массива – это нежелательное действие, которое занимает время, пропорциональное длине массива К.

Разрешить возникшую проблему выполнения операции ВКЛЮЧИТЬ и

ИСКЛЮЧИТЬ можно в результате отказа от статического размещения элементов массива (вкладов) и организации динамического списка. Список состоит из элементов, каждый из которых в общем случае является структурой, в которой выделены содержательная и вспомогательная части. Вспомогательная часть используется для организации связей между элементами списка и содержит одно или несколько полей ссылочного типа.

В программе учета вкладов, использующей динамические списки, содержательная часть элементов остается такой же, как указано выше, и к ней добавляется в простейшем случае одно поле для указания следующего элемента списка (sled). Переменные - указатели sled должны быть переменными ссылочного типа. Элементы списка можно представить в виде следующего описания:

Strukt vklad

{

char family[12];

float sum;

strukt vklad sled;

}

Тогда информацию, например о четырех вкладах, можно представить в виде списка. Переменная top типа strukt vklad* указывает на первый элемент списка, а поле sled в последнем элементе имеет значение NULL.

Сформировать такой список можно с помощью программы включающей следующий фрагмент:

strukt vklad *top;

strukt vklad *p;

……………..

top=NULL;

for(i=0; i<4; i++)

{

p=(strukt vklad*)malloc((sizeof(strukt vklad)));

p->sled=top;

printf(“Введите фамилию вкладчика:”) ;

gets(p->family);

printf(“Введите сумму вклада:”);

scanf(“%f”,p->sum);

top=p;

}

Рассмотрим поиск элемента списка с заданным значением одного из полей. Пусть, например, необходимо увеличить сумму вклада кладчика А. Для этого рассмотрим еще одну переменную типа strukt vklad *pt, которая будет перемещаться по списку до обнаружения нужной фамилии:

pt=top;

while(pt->family !=A)

pt=pt->sled;

Этот фрагмент можно пояснить так. Сначала pt указывает на первый элемент списка. До тех пор пока фамилия вкладчика, на которую указывает переменная pt, не будет совпадать с заданной фамилией А, нужно передвигать pt на переменную, задаваемую полем структуры, на которую в данный момент выполнения указывает pt.

Приведенный фрагмент будет решать задачу ПОИСК только в том случае, когда можно гарантировать, что человек с фамилией А имеет в системе учета некоторый вклад.

Если это не так, то, «подойдя» к последнему элементу списка, переменная pt приобретает значение NULL, и на следующем шаге выполнения цикла обращение к полю pt--> family вызовет аварийное окончание программы, так как требуемого элемента просто не существует.

Опознать конец списка можно попытаться так:

pt=top;

while(pt!=0 && (pt->family!=A))

pt=pt->sled;

Это решение в общем случае не устранит аварийное окончание по той же самой причине : в конце списка pt==NULL и элемента pt-> с полем family, который требуется для выполнения операции сравнения с А в программе учета не создано.

Два варианта правильного решения приведены ниже:

1) pt=top;

while(pt->sled!=NULL)&&(pt->family!=A))

pt=pt->sled;

if (pt->family!=A)

pt=NULL;

2) pt=top;

int b=1;

while(pt!=NULL&&b)

b=0;

else

pt=pt->sled;

В обоих случаях после выполнения фрагмента справедливо положение: если человек с фамилией А является вкладчиком, то pt указывает на его вклад, иначе pt==NULL.

Время поиска элемента с заданным полем пропорционально длине списка, так как при поиске просматривается последовательно весь список.

Следующая типовая задача состоит в том, чтобы вставить новый элемент в список. Для нашего примера это соответствует появлению нового вклада. Вставка возможна в начало списка (перед элементом, на который указывает переменная top) или после любого элемента, например, после элемента, на который указывает pt.

strukt vklad *new ;

new=(strukt vklad *)malloc(sizeof(strukt vklad));

new->sled=pt->sled ;

pt->sled=new;

Существуют два вида списков: связанный и кольцевой. Связной список показан на рис.8. 1. Это простой однонаправленный список, в котором каждый элемент (кроме последнего) имеет ссылку на следующий элемент и поле информации. Можно организовать также кольцевой список (в нем последний элемент будет содержать ссылку на первый) или двунаправленный список

Элемент 1    
Элемент 2    
Элемент n   NULL  

…..

                               
       
 
       
 
   

Рис.8.1

(Рис.8.2), когда каждый элемент, кроме первого и последнего, имеет две ссылки : на предыдущий элемент и следующий элемент и т.д.

Элемент 2
           
     
Элемент 1   NULL
Элемент n   NULL

                         
   
       
 
 
     
   
 
 
 

Рис.8.2

Кроме того, можно помещать в начале списка дополнительный элемент, называемый заголовком списка, который может использоваться для хранения информации обо всем списке. В частности, он может содержать счетчик числа элементов списка.

Элемент дважды связанного списка содержит два поля указателей, один из которых указывает на следующий элемент, а другой – на предыдущий. Такая организация позволяет перемещаться списку в двух направлениях: влево и вправо. Циклический список представляет собой «кольцо» элементов и является простой модификацией рассмотренного выше линейного списка: последний элемент в поле связи вместо значения NULL содержит ссылку на первый элемент списка.

Рассмотрим пример оформления функции, формирующей дважды связанный линейный список. В «содержательной» части элементов списка записан один символ. Формирование списка заканчивается при вводе символа ‘*’.

Struct element

{

char inf;

struct element *lev;

struct element * prav;

}

…….

void form(struct element*perv)

{

struct element *tek;

char ch;

perv=NULL;

do

{

tek=(struct element*) malloc(sizeof(structelement));

tek->prav=perv;

tek->lev = NULL;

scanf(“%c” ,ch);

tek->inf=ch;

perv = tek;

if (tek -> prav !=NULL)

tek->prav->lev=tek;

}

while(ch==’*’);

}

Ниже приведен заголовок функции, осуществляющий удаление элемента, содержательное поле которого совпадает с заданным значением. Параметрами функции является ссылочная переменная- указатель головы списка и заданный символ.

void udalen(strukt element*top, char ch);

Задание к работе

Составить программу обработки списка в соответствии с номером задания. Вид списка определяется номером строки табл.8.1, а вид обработки – номером столбца, в котором стоит номер задания в табл.8.2. Например, для задания 12 следует рассматривать линейный дважды связанный список и произвести проверку: входит ли в список заданный элемент с заданным значением информационного поля?

В программе предусмотреть функцию формирования списка, функцию его вывода и функцию обработки. Тело программы представляет собой последовательность четырех обращений к функциям: ввод списка, его контрольный вывод, обработку, вывод результата.

Таблица 8.1

Вид списка

Вид списка
Линейный      
Линейный дважды связанный  
Линейный циклический

Таблица 8.2

Вид обработки списка

Номер списка Вид обработки
Подсчитать число элементов списка
Добавить новый элемент. Элемент задан ссылочной переменной
Добавить новый элемент после заданного. Элемент задан значением информационного поля.
Удалить заданный элемент из списка. Элемент задан ссылочной переменной.
Удалить заданный элемент. Элемент задан значением поля; удаляется первый элемент
Удалить заданный элемент. Элемент задан значением поля; удаляются все такие элементы.
Проверить: входит ли заданный элемент в список?
Подсчитать: сколько имеется элементов с заданным содержимым одного из полей
Объединить два списка- второй добавить в хвост первого ( циклические списки разрываются в произвольном месте)
Найти элемент с заданным значением информационного поля (из функции обработки возвращается значение ссылочной переменной, указывающей на первый элемент).
Подсчитать число элементов списка
Добавить новый элемент. Элемент задан ссылочной переменной
Добавить новый элемент после заданного. Элемент задан значением информационного поля.
Удалить заданный элемент из списка. Элемент задан ссылочной переменной.
Удалить заданный элемент. Элемент задан значением поля; удаляется первый элемент
Удалить заданный элемент. Элемент задан значением поля; удаляются все такие элементы.
Проверить: входит ли заданный элемент в список?
Подсчитать: сколько имеется элементов с заданным содержимым одного из полей
Объединить два списка- второй добавить в хвост первого ( циклические списки разрываются в произвольном месте)
Найти элемент с заданным значением информационного поля (из функции обработки возвращается значение ссылочной переменной, указывающей на первый элемент).
Удалить заданный элемент из списка. Элемент задан ссылочной переменной.
Продолжение табл.8.1
Удалить заданный элемент. Элемент задан значением поля; удаляется первый элемент
Удалить заданный элемент. Элемент задан значением поля; удаляются все такие элементы.
Проверить: входит ли заданный элемент в список?
Подсчитать: сколько имеется элементов с заданным содержимым одного из полей

Для сохранения списка и последующего вывода его на печать в программе предусмотреть файл для чтения и записи. Файл должен содержать все необходимые поля, представленные в виде таблицы.

Содержание отчета

1. Цель работы и индивидуальное задание.

2. Алгоритм решения задачи с необходимыми комментариями.

3. Рисунки, поясняющие процессы обработки списка.

4. Разработанную программу.

5. Сформированный текстовый файл.

Контрольные вопросы

1. Какой список называется линейным?

2. Какой список называется кольцевым?

3. Как проверить: входит ли заданный элемент в список?

4. Как найти список с заданны значением информационного поля?

Работа № 9

Вывод графиков функций

Цель работы:Изучить методы построения графиков функций в графическом редакторе языка Си. Составить программу для расчета и вывода в графическом режиме заданной функции. Результаты расчета выводятся в графической форме на экран и принтер.

Исходные данные: Математическая функция, диапазоны изменения параметров функции.

Пример построения графика

Напишем программу, которая выводит на экран точечный график функции y=0,5x2+4x-3.Диапазон изменения аргумента: от –15 до 5; шаг аргумента –0,1.

График вывести на фоне оцифрованной координатной сетки. Начало координат должно находится в центре экрана. Предусмотреть вывод графика в виде точечной кривой и сплошной линии какого-либо цвета. Оси координат вывести в виде сплошной линии цвета фона. Линии координатной сетки вывести тонкими точечными линиями.

Программу целесообразно составить из двух функций: функции grid(), выводящей на экран оцифрованную координатную сетку, и функции grafik(), строящей график функции.

void grid()

{

int x0,y0; //начало координат

int dx,dy; //шаг координатной сетки (в пикселах)

int h,w; //высота и ширина области вывода

int x,y;

float lx,ly; // метки линий сетки по X и Y

float dlx,dly; // шаг меток линий сетки по X и Y

char st[8]; // изображение метки линии сетки

x0=50; y0=400; // начало осей координат

dx=40; dy=40; //шаг приращения по осям

dlx=0.5;

dly=1;

h=300;

w=400;

lx=0;

ly=0;

line (x0,y0,xo,y0-h); //ось X

line (x0,y0,xo+w,y0); // ось Y

/*засечки, сетка и оцифровка по оси X*/

x=x0;

do

{

//засечка

setlinestyle(SOLID_LINE,0,1); //вид линии

line (x,y0-3,x,y0+3);

//оцифровка

sprintf(st,”%2.1f”,lx);

outtextxy(x-8,y0+5,st);

lx+=dlx;

//линия сетки

setlinestyle(DOTTED_LINE,0,1);

line (x,y0-3,x,y0-h);

x+=dx;

}

while(x<x0+w);

/*засечки, сетка и оцифровка по оси Y*/

y=y0;

do

{

//засечка

setlinestyle(SOLID_LINE,0,1);

line (x0-3,y,x0+3,y);

//оцифровка

sprintf(st,”%2.1f”,ly);

outtextxy(x0-40,y,st);

ly+=dly;

//линия сетки

setlinestyle(DOTTED_LINE,0,1);

line (x0+3,y,x0+w,y);

setlinestyle(SOLID_LINE,0,1);

y-=dy;

}

while(y>y0-h);

} // конец программы grid().

Построим точечный график для функции y=0,5x2+4x-3.

#include<graphics.h>

#include<math.h>

#include<stdlib.h>

#include <conio.h>

#include<stdio.h>

void zaggraf();

void grafik()

{

float x,dx;

float x1,x2;

float y;

int mx,my;

int x0,y0;

int px,py;

x0=320;y0=240;

mx=20;my=20;

line(10,y0,630,y0);//ось х , строится если нет сетки

line(x0,10,x0,470);//ось y, строится если нет сетки

x1=-25;

x2=5;

dx=0.1;

x=x1;

moveto(x,0);

while(x<x2)

{

y=0.5*x*x+x*4-3;

px=x0+x*mx;

py=y0-y*my;

putpixel(px,py,WHITE);//построение графика по точкам

setcolor(WHITE);

//lineto(px,py); в случае сплошного графика

x+=dx;

}

}

Запишем теперь главную функцию.

void main(void)

{

zaggraf(); // загрузка графики

grafik(); // ввод функции графика

grid(); // ввод функции сетки

getch();

closegraph();

}

Задание на выполнение работы

Разработать программу построения графика одной из функций. Варианты заданий приведены в табл.9.1.

Таблица 9.1

№ варианта Функция Диапазон изменения аргумента
y= 1.3x2-1.8+log(x) [-1.2,1.2]
Окружность x=0.5+2cos(t); y=0.2+2sin (t) [0, 3600]
Степенная функция y=x3-2x2+x [-1-3]
Эллипс x=3cos(t); y=15sin(t) [0, 3600]
Показательная функция y=exp(x2) [-1.3- 1.3]
Кардиоида x=4cos(t) (1+cos t) y=4sin(t)(1+cos t) [0, 2 ]
Дробно-рациональная функция y= (1.5x +3) /(x-2)   [–4.2, 1.9]
Декартов лист x=3at /(1 + t3) y=3at2 /(1 + t3)   [-0.5, 10] а=2
Функция синус y=2.5sin(x) + 0.5 [–2 , 2 ]
Циссоида x=5t2 /(1 + t2) y=5t2 /(1 + t2) t=tg(f) [- /4, /4]
Тригонометрическая функция y=cos(x2) [–2 , 2 ]
Строфоида x=4(t2-1) /(t2+1) y=4t(t2-1) /(t2+1) t=tg(f)   [- /2.5, /2.5]
Тригонометрическая функция y=tg(x) – 2x [- /2.5, /2.5]
Астроида x=3.5cos3 (t), y=3.5sin3 (t) [0, 2 ]
Арксинус y=arcsin (0.5x) X=[–2, 2]
Эпициклоида x=(a+b)cos(t) – acos ((a+b)t/a), y=(a+b)sin(t) – asin ((a+b)t/a) a=6, b=9 t = [ , 2 ]
Логарифм y=ln(x+2) -1.5, 5
Гопоциклоида x=2acos(f) + acos(2f), y=2asin(f) + acos(2f) [–2 , +2 ] a=1.5
Арктангенс y=3 arctg(x) [–5, 5]
Эвольвента окружности x=a cos(f) + af sin(f) y=a sin(f) – acos(f) f=[ –900,900] a=1.5
Дробно- рац. нелинейная y=ax+c/ bx+cx2 [0.18, 3] a=1, b=2, c= -0.5
Леминиската x=rcos(f) y=rsin(f), r=asqrt(2cos(2f))   [- , ]
Локон Аньези y= a3/x2 + a2 [–5, 5], a=2
Архимедова спираль x=rcos(f) y=rsin(f) ,r=af [-600, 600] a=1.5
Продолжение табл.9.1
Трохоида (Удлиненный цикл) x=a(1+b sin(f)) y=a(1-b cos(f))   [-2 , 4 ] a=1.5, b=1.3
Гиперболическая спираль x=(a cos(f))/f y=(a sin(f))/f   [0, ] a=3
Удлиненная эпициклоида x=5cos(f) – 2cos(5f) y=5sin(f) – 2sin(5f)   [0, ][
Логарифмическая спираль x=rcos(f), y=rsin(f) r=aexp(bf) f =[0, 4 ]   a=1.3, b=0.5
Удлиненная гипоциклоида x=4cos(f) + 2cos(4f) y=4sin(f) – 2sin(4f) f [0, 2 ]
Конхоида Никомеда x=a+bcos(f) y=atg(f) + bsin(f) [-1.5, 1.5] a=1, b=2
Улитка Паскаля x=2cos2(t) + 3cos(t), y=2cos(t)sin(t) + 3sin(t)   [0, 2 ]  

Содержание отчета

1. Краткие теоретические сведения о графических методах обработки данных.

2. Программа построения графика заданной функции.

3. Комментарии к программе и полученным результатам.

4. Распечатку графика функции.

Работа № 10

Освоение работы в среде С++

Цель работы:приобретение практических навыков работы с объектно-программируемым языком С++

Введение в основы языка С++

Объектно-ориентированное программирование включает элементы структурного программирования, дополняет его новыми идеями, которые переводят в новое качество подход к созданию программ.

Наиболее важное понятие языков объектно-ориентированного программирования - это понятие объекта. Обьект - логическая единица, которая содержит данные и методы обработки этих данных.- функции. Внутри объекта данные и функции могут быть частными (приватными, ргivаtе), защищенными (ргоtесtеd) и общими (public). Можно сказать, что объект - это переменная определенного пользователем типа. Объектно-ориентированные языки обладают четырьмя важнейшими характеристиками: инкапсуляцией, наследованием, полиморфизмом и абстракцией типов. Понятие инкапсуляции означает, что в качестве единицы целого рассматривается объединение некоторой группы данных и некоторой группы функций. Наследование позволяет одним объектам приобретать атрибуты и свойства других объектов. Полиморфизм означает, что одно и тоже имя может использоваться для логически связанных, но разных целей. Свойства объектов хранятся в структурах данных, напоминающие структуры языка Си, а поведение объектов реализуется в виде функций, называемых функциями-членами. В языке С++ реализована защита данных и функций. Если они в объекте объявлены приватными (частными), то к ним нет доступа извне. Зато, если они объявлены общими, то они доступны любому внешнему объекту.

В языке С++ для ввода и вывода данных используются, так называемые перегружаемые функции. Они имеют прототипы в заголовочном файле iostrem.h.

Пример 1:

#include< iostrem.h>

void main(void)

{

cout<<” Язык программирования С++”; // оператор вывода данных работает как функция printf().

cin>>m; // работает как функция scanf().

cout<<m<<”\n”; //вывод нескольких операндов

}

Обе функции не требуют задания спецификаторов полей данных. Можно использовать стиль комментариев языка Си. Можно использовать функцию printf() для вывода и функцию scanf() для ввода чисел.

Понятие класса и объекта

Одним из главных понятий языка С++ является понятие класса (class). Чтобы определить объект надо сначала определить его форму с помощью ключевого слова class.

Пример 2. Объявление класса

//Объявим класс queue

class queue {

private: //режим доступа частный

int q[100];

int i,j;

public: //режим доступа открытый

void func1(void);

int func2(int i);

protected:

int a,d; //режим доступа защищенный

} [список объектов];

Список объектов может быть задан непосредственно при формировании класса или же в функции main() по аналогии с переменными структур в языке Си. Например, для рассматриваемого класса: queue a,b задаются два объекта a и b. Когда же требуется описать функцию-член класса, то необходимо указать к какому классу она принадлежит. Например, функция func1(void) принадлежит классу queue. Это записывается формой

queue :: func1(int i)

{ i=0;

………..

}

Чтобы вызвать функцию-член класса в той части программы, которая не является частью класса, надо использовать имя_объекта и операцию доступа (.). Например, если объявлен объект а класса queue (queue a ), то для вызова функции func1() нужно записать:

a. func1();

Основная форма наследования

Class имя_наследующего_класса: режим_доступа наследуемый_класс.

Пример 3: Объявление наследуемого класса

сlass queue1: public queue {

//Объявлен класс queue1 наследователь queue

int sum;

public:

int get_sum(void);

};

Задание на программирование

1. Составить программу ввода и вывода матрицы на базе функций языка С++.

2. Ввести программу, реализующую очередь (Пример 4). Найти и исправить ошибки.

3. Дополнить класс queue защищенной функцией для вычисления факториала и вызвать ее в главную функцию.

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

Пример 4.

#include <iostream.h>

class queue {

int q[10];

int sloc,rloc;

public:

void init();

void qput(int i);

int qget(void);

};

void queue::init(void)

{ sloc=rloc=0;

}

int queue::qget() {

if(sloc==rloc)

{cout<<"ochered pusta"<<"\n";

return 0;

}

return q[rloc++];

}

void queue::qput(int i)

{

if(sloc==10)

cout<<"ochered polna"<<"\n";

return;

}

q[sloc++]=i;

}

main()

{

queue a,b;

a.init();

b.init();

a.qput(7);

a.qput(9);

a.qput(11);

cout<< a.qget()<<"\n";

cout<< a.qget()<<"\n ";

cout<< a.qget()<<"\n" ;

cout<< a.qget()<<"\n";

for(int i=0;i<12;i++)

b.qput(i*i);

for(i=0;i<12;i++)

cout<<b.qget()<<" ";

cout<<"\n";

getch();

return 0;

}

Указания для выполнения

В наследуемом классе

class queue1:public queue{

int sum;

public:

int get_sum(void);

void show_sum(void);

};

Создаем объект: queue1 obj.

Описываем функции наследующего класса.

int queue1::get_sum(void)

{

sum=0;

for(int i=rloc;i<sloc;i++)

sum+=q[i];

return sum;

}

void queue1::show_sum(void)

{cout<<"summa ochered="<<sum<<"\n"; }

Дополняем главную функцию программы фрагментом вызова функций.

queue1 obj;

obj.init();

for(int i=0;i<5;i++)

{

obj.qput(100+i);

obj.get_sum();

obj.show_sum();

}

for(i=0;i<6;i++)

{obj.get_sum();

obj.show_sum();

obj.qget();

}

Контрольные вопросы

1. Дайте определение класса и объекта.

2. Дайте определение инкапсуляции и наследования.

3. Какие функции называются перегружаемые и почему?

4. Что общего между классом и структурой в языке Си?

Приложение

// консольное приложение программы «Угадай число»[5]

#pragma hdrstop

#include <stdio.h>

# include <conio.h> // для доступа к getchf)

#include <stdlib.h> // для доступа к srand(), rand()

#include <time.h> // для доступа к time_t и time()

char*rus (char* st) ; // преобразует ANSI-строку в строку ASCII

#pragma argsused

main()

{

int comp, // число, "задуманное" компьютером

igrok, // вариант игрока

n=0; // число попыток

// ГСЧ — генератор случайных чисел

time_t t; // текущее время (для инициализации ГСЧ)

srand( (unsigned)time (&t) ) ; // инициализация ГСЧ

comp = rand () % 10 + 1;

puts ( rus ( " \n Компьютер \"задумал\" число от 1 до 10."));

puts ( rus ( "Вы должны его угадать за три попытки ."));

do

{

printf ("->");

scanf("%i",&igrok) ;

while ( igrok != comp && n < 3) ;

if (igrok == comp)

printf ( rus ( " Вы проиграли! " ) ) ;

else{

puts ( rus ( "Вы проиграли . " ) ) ;

printf ( rus ( "Компьютер \"задумал\" число %d") , comp) ;

}

printf (rus ("\пДля завершения нажмите любую клавишу. " ) ) ;

getch( );

return 0;

}

/* Функция rus преобразует ANSI -строку в строку ASCII и может использоваться для вывода сообщений на русском языке в консольных программах.*/

char*rus (char*st)

{

unsigned char* p = st;

/* при объявлении символов как char русские буквы кодируются отрицательными числами */

while ( *р)

{

if (*p >= 192) // здесь русская буква

if (*р <= 239) // А, Б, ... Я, а, б, ... п

*р -=64;

else//p ... я

*р -= 16;

p++;

} return st;

}

Список рекомендуемых источников

1. Шишкин А.Д. Программирование на языке СИ. Учебное пособие. СПб.: Изд. РГГМУ, 2003.-104 с.

2. Березин Б. И., Березин С. Б. Начальный курс С и С++. – М.: ДИАЛОГ - МИФИ, 2001.-288 с.

3.Культин Н. Б. С/С++ в задачах и примерах – СПб.: БХВ- Петербург, 2011.

4. Крячков А. В., Сухинина И. В., Томшин В.К. Программирование на С и С++. Практикум: Учеб. пособие для вузов / Под ред. В.К.Томшина – 2-е изд., исправ.- М.: Горячая линия – Телеком, 2000.

5. Культин Н. Б. Самоучитель С++ Builder.- СПб.: БХВ-Петербург, 2004.-320 с.

6. С/С++. Структурное программирование: Практикум/ Т.А. Павловская, Ю.А. Щупак.- СПб: Питер, 2003.-240 с.

7. Секунов Н.Б. Самоучитель Visual C++.- СПб.: БХВ - Петербург, 2004.-960 с.

Содержание    
Введение в интегрированную среду программирования
Работа №1. Базовые операции языка Си
Работа №2. Организация вычислительных процессов
Работа №3. Условные операторы и операторы выбора
Работа №4. Обработка одномерных массивов
Работа №5. Обработка двумерных массивов
Работа №6. Функции пользователя и динамическое распределение памяти
Работа №7. Организация работы с файлами
Работа №8. Обработка списков
Работа №9. Вывод графиков функций
Работа №10 Освоение работы в среде С++
Приложение
Список рекомендованной литературы

Практикум

по дисциплине «Языки программирования»

Раздел: Программирование на языке Си и С++

А.Д. Шишкин

Е.А. Чернецова

Редактор И.Г. Максимова

Подписано в печать Формат 60/901/2 Бумага книжно – журнальная

Печ. л. Тир. 150

РГГМУ, 195196, СПб, Малоохтинский пр., Отпечатано

Наши рекомендации