понедельник, 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;
}

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