понедельник, 21 декабря 2015 г.

Класс! - Наследование и полиморфизм

Поэтапно решим задачу
Создать класс «окружность» (метод рассчитывает площадь) и два производных класса «цилиндр» и «конус» » (методы каждого класса рассчитывают площадь поверхности объемной фигуры и её объём). Продемонстрировать необходимость виртуальных методов при использовании указателей на объекты.

Этап 1. Создание класса Окружность.  (Использовать материал)
а) Определение класса (поля: r, L,S; методы: конструктор, Длина окружности, Площадь).
б) Описание конструктора.
в) Функция main(): описание объекта-экземпляра класса
г) Описание других методов
д) Функция main(): вызов методов для вычисления и печати длины окружности и площади.
е) Описание указателя на объект класса. Создание динамического объекта. Вызов методов для вычисления и печать длины окружности и площади с помощью оператора ->(см. ниже)

Пример работы с динамическими объектами (нажмите на рис, чтобы сделать крупнее):


Этап 2. Создание класса-наследника Цилиндр (использовать материал)
а) Описание класса-наследника: доп. поля (высота); переопределённый метод Площадь; новый метод Объём.
б) Описание конструктора с вызовом конструктора родителя.
в) Функция main(): добавляем описание объекта-экземпляра класса-наследника.
г) Переопределение метода Площадь, его вызов для проверки.
д) Определение метода Объём, его вызов для проверки.

Этап 3. Демонстрация возможностей позднего связывания
а) Убираем из main() вывод на экран полей всех объектов
б) Добавляем в родительский класс поле nom, которое используем для определения типа объекта. Напишем метод, который будет возвращать это поле.
в) Описываем функцию AllPrint (не принадлежащую классам), которая выводит на экран радиус, высоту (если есть), площадь поверхности и объем (если есть) объекта, переданного с помощью указателя.
г) убеждаемся, что система неправильно рассчитывает площадь (потому что вызывает метод родителя для любого объекта.
д) Делаем нужные методы виртуальными.


Этап 4. Создание класса Конус


Пример программы
Здесь позже появится пример программы.
Вопросы задавайте в комментариях к этому сообщению.

понедельник, 14 декабря 2015 г.

Пишем классные программы!


Пишем первую программу в стиле ООП. Разработку ведем поэтапно, как описано в материале

Классы (Часть 1. Определение и описание)

написав очередную часть, запускаем проект.

вторник, 8 декабря 2015 г.

Задача о поиске шаблона

Итак, окончательная версия программы. Отладочная печать оставлена, чтобы можно было проследить, как это работает. Поправка, которую необходимо было сделать, чтобы программа работала корректно: в функции поиска оператор     p2=psh; нужно поставить перед оператором
if(*p1==*p2){cout<<*p1<<" "<<n1<<endl; (т.к. мы портили указатель p2 и дальнейшее сравнение было некорректным). Под этой версией расписаны отдельные шаги, которые могут повторить те, у кого что-то не получилось (правда, имена переменных несколько другие - это шпаргалка, в которую я не подглядывала).

Окончательная версия программы

 Заголовочный файл  head.h
#include <iostream>
#include <string.h>
using namespace std;

int vvsh(char sh[]);
int poisk(char* pstr,char* psh,int nsh);

main.cpp
#include "head.h"

void main()
{
char str[]="moja mama varit mamalygu na balkone";
char shablon[10];
int nsh=vvsh(shablon);
cout << "dlina= "<< nsh << endl;
puts(shablon);
char* pstr=str;
char* psh=shablon;
int nn=poisk(pstr,psh,nsh);
cout << "mesto shablona= "<< nn << endl;
cout << "biblio function= "<<strstr(str,shablon)-str<< endl;

}


/*
Написать программу с функцией поиска первого вхождения шаблона в текст. В качестве
первого параметра функция принимает указатель на строку, в которой нужно искать шаблон. В
качестве второго параметра указатель на строку-шаблон, которую нужно найти. Функция
возвращает позицию первого вхождения строки-шаблона, если он присутствует в строке
(помните, что в C++ принято считать с 0), и -1, если шаблона в тексте нет. В основной
программе инициализировать строку при описании, строку-шаблон вводить с клавиатуры.
Проверить правильность работы написанной функции с помощью функции strstr(s1,s2) из
библиотеки <string.h>
Контрольный пример:
Строка "moja mama varit mamalygu na balkone"
Шаблоны: "mama" , "mamalygu"

*/
vvod.cpp

#include "head.h"

int vvsh(char sh[])
{
cout<<"vvedite shablon ";
gets(sh);
return strlen(sh);
}

poisk.cpp
#include "head.h"

int poisk(char* pstr,char* psh,int nsh)
{
char* p1=pstr; char* p11;
char* p2=psh;
int n1=0,nn=-1,n2;
if(*p2==0) return n1;
while(*p1!=0)
{
    p2=psh;
if(*p1==*p2){cout<<*p1<<" "<<n1<<endl;
p11=p1;  n2=0;
while(n2<nsh && *p11==*p2){p11++; p2++; n2++; cout<<*p11<<" "<<*p2<<" | ";} cout<<endl;
if(*p2==0) return n1;
}
p1++;
n1++;
}
return nn;
}

Отладка программы по шагам:

понедельник, 30 ноября 2015 г.

Обработка символьных строк



В языках Си/Си++ нет специально определенного строкового типа данных. Символьные строки организуются как массивы символов, последним из которых является символ \0..
Строка описывается как символьный массив:
char STR[20];
char S[10]="cTpoKa"; -инициализация значения
char S[]="cTpoKa";
char S [10] = { 'с' ,'Т',‘р',‘о',‘К','а','\0'} ; 
Отдельные символы строки идентифицируются индексированными именами.
S [ 0 ] = 'С' , S[5]='a'.
Пример 1. Обработка строк обычно связана с перебором всех символов от начала до конца. Однако, ввод-вывод строк удобно делать с помощью функций gets() и  puts() из библиотеки <string.h>
В примере с помощью цикла символы в строке s1 заменяются звёздочкой. Признаком конца  перебора символов является обнаружение нулевого символа в конце строки. То же самое можно сделать с помощью указателя ( в программе - символы в строке s заменяются на ^).
На экран выводится следующее:


Пример 2. Использование библиотеки  <string.h>
Многие нужные функции реализованы в библиотеке <string.h>. При необходимости можно ознакомиться с описанием функций здесь.
В примере ниже  функция strchr(p,c) возвращает указатель на первый символ строки, на которую указывает указатель р, совпадающий со значением переменной с.
В конце программы строка выводится с найденного символа, и выводится на экран его номер.

Пример 3. Обработка строк в функции
Эта программа  делает такую же замену, как в примере 1. Однако, это действие оформлено в виде функции, в которую передаются указатель на строку и символ для замены.



Задачи для самостоятельного решения

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

2. Написать  программу с функцией поиска первого вхождения шаблона в текст. В качестве
первого параметра функция принимает указатель на строку, в которой нужно искать шаблон. В
качестве второго параметра указатель на строку-шаблон, которую нужно найти. Функция
возвращает позицию первого вхождения строки-шаблона, если он присутствует в строке
(помните, что в C++ принято считать с 0), и -1, если шаблона в тексте нет. В основной
программе инициализировать строку при описании, строку-шаблон вводить с клавиатуры.
Проверить правильность работы написанной функции с помощью функции strstr(s1,s2) из
библиотеки <string.h>
Контрольный пример:
Строка "moja mama varit mamalygu na balkone"
Шаблоны: "mama" ,  "mamalygu"

понедельник, 23 ноября 2015 г.

Массивы и указатели

Указателем называется переменная, содержимым которой является адрес другой переменной определенного типа.
При описании указателя обязательно определяется, на данное какого типа он указывает:
int *p;
double *t;

Для получения адреса переменной используется операция раскрытия указателя & :
int a;
int* p;
p=&a;

 Для получения указателя на массив достаточно приравнять указатель имени массива:
long mas1[10]={0};
long* p=mas1;

Любой указатель ссылается на неограниченную в обе стороны область памяти, заполненную переменными указуемого типа. Поэтому, получив адрес 0-го элемента ( p=mas1), легко получить адрес 5-того: р+5. Значение mas1[5] при этом  можно получить таким образом: *(p+5)

 Пример работы с массивом с помощью указателя и ввода-вывода массива из (в) файла:
#include <fstream>
#include <iostream>
using namespace std;
void main()
{
ifstream input("test.txt");
long mas1[10]={0};
long* p=mas1;
long s=0;
for(int i=0; i<10;i++) input>>mas1[i];   // ввод из файла test.txt
for(int i=0; i<10;i++) cout<<*(p+i)<<"   ";   // вывод массива на экран с помощью указателя
for(int i=0; i<10;i++) s+=*(p+i);                   // работа с массивом
cout<<s<<"  s="<<s<<endl;
ofstream output("prim.txt");
for(int i=0; i<10;i++) output<<mas1[i];     // вывод в файл prim.txt
}



По аналогии решите задачи:

 1. Напишите программу в которой нужно

  •    описать массив целого типа из 50 элементов, равных 0.
  •     заполнить массив числами Фибоначчи: F0=0, F1=1, F(n+1)=F(n)+F(n-1)
  •     вывести массив в файл Fib.txt
  •     с помощью указателей найти номер числа Фибоначчи, равного 4181


2. Напишите программу в которой нужно:

  •     описать массив действительного  типа из 50 элементов, заданный с помощью генератора случайных чисел в диапазоне [-5,5[
  •     найти максимальный элемент массива и его номер
  •     считать из файла Fib.txt пятое число и сравнить его с найденным максимальным элементом

понедельник, 9 ноября 2015 г.

Введение в С/С++

Для закрепления большого объема нового материала (кратко см. на странице Введение в С/С++) решите несколько задачек:

1. Проверьте свои предсказания значений переменных в примере:


Переработайте программу так, чтобы она выдавала таблицу вида (подписи на русском языке!)


2. Напишите следующую программу, которая должна корректно работать с математическими функциями (без предупреждений о несоответствии типов!). В программе опишите переменную х1 целого типа, х2  типа float,  х3  типа double. Организовать корректнос вычисление функции для каждой из переменных, введенных с клавиатуры





3. Напишите еще одну программу, которая заполняет таблицу:


воскресенье, 8 ноября 2015 г.

Приветствую новый поток системных инженеров!

 Начинаем изучение языков программирования С/С++:

1. Для взаимодействия регистрируемся в Google. Инструкцию смотрите здесь.
Можно сразу освоить работу с Google-диском.

2. Устанавливаем компилятор С/С++. Если нет лицензионного, пользуемся свободной кроссплатформеной средой разработки Code::BlocksСкачать ее можно здесь.


3. Установили? Повторите решение задачи, разбиравшейся на занятии:

I. Создайте консольное приложение. 


Запустите проект:
o Запишите файл на диск (нажмите на значок дискеты)
o Откомпилируйте его -меню Построение/Построить решение (F7) Если есть ошибки –исправьте и откомпилируйте снова.
o Произведите компоновку -меню Построение/Построить Имя_проекта
o Запустите на выполнение -меню Отладка/Запуск без отладки


II. Внесите в программу изменения
а) Выведите заголовок таблицы "Tablica umnozenija"
б) Опишите еще одну переменную m. Сделайте ввод переменной m с клавиатуры с подсказкой "n(max)="
в) Сделайте так, чтобы переменная цикла изменялась от 1 до m.
г) Рассмотрите выводимую на экран таблицу при m=15. Убедитесь, что таблица стала неровной. Сделайте ее ровной.
д) Рассчитайте среднее значение произведения в таблице и выведите его под таблицей.



Желающие могут выбрать себе задачу отсюда.
Вопросы, программу для обсуждения можно выкладывать здесь

Вопросы на засыпку:

1. Кто такие эти весёлые бородатые дядьки?
2. Почему они появились в этом сообщении?
3. Какую награду они получили за свои труды?