Методические указания по обработке списков
Рассмотрим в качестве примера организацию систем учета вкладов в отделении сбербанка. Будем считать, что в простейшем случае информация о вкладе содержит фамилию вкладчика и сумму вклада в рублях. Запишем эту информацию в виде структуры:
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. Это простой однонаправленный список, в котором каждый элемент (кроме последнего) имеет ссылку на следующий элемент и поле информации. Можно организовать также кольцевой список (в нем последний элемент будет содержать ссылку на первый) или двунаправленный список
|
|
|
…..
Рис.8.1
(Рис.8.2), когда каждый элемент, кроме первого и последнего, имеет две ссылки : на предыдущий элемент и следующий элемент и т.д.
|
|
|
Рис.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, СПб, Малоохтинский пр., Отпечатано