- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
- •Int main(int argc, char* argv[])
Int main(int argc, char* argv[])
{
int m,s,k;
Record x,y,z;
x.Put(4,36); // min=4 sec=36
y.Put(2,4); // min=2 sec=4
k=y.Numbersec(); // k=124
z=z.Srednee(x,y);
// объект z вызывает метод Srednee с аргументами x,y
// возвращается объект типа Record, который
// присваивается z
printf(“%d “,k);
m=z.Getmin();
s=z.Getsec();
printf(“%d %d”,m,s); // 3 20
}
В лабораторной работе следует для определяемого класса определить методы:
метод инициализации Init;
ввод с клавиатуры Read;
вывод на экран Display;
Для Record методы Read, Init, Display имеют вид:
class Record
{
public:
int Numbersec(); // количество секунд
int Getmin(); // число минут
int Getsec(); // число секунд
Record Srednee(Record a,Record b);
void Read();
void Display();
void Init(int m,int s);
private:
int min;
int sec;
};
...............................
void Record::Read()
{
scanf(“%d,%d”,&min,&sec);
}
void Record::Display()
{
printf(“%d, %d”,min,sec);
}
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
Int main(int argc, char* argv[])
{
Record a,b;
a.Read(); // ввод с консоли 2 35
b.Init(1,19); //
a.Display(); // 2 35
printf(“\n”);
b.Display(); // 1 19
}
7) полями одного класса могут быть объекты другого, ранее определенного класса
При этом ранее определенный класс считается вспомогательным, а определяемый основным.
После класса Record определим класс Sportsman , в котором имеется фамилия и два результата по бегу. Для Sportsman определим методы доступа к фамилии и метод Best определение лучшего из двух результатов. Также определим метод Init для задания фамилии и двух результатов спортсмена.
В Record оставлено минимальное число методов для иллюстрации
#include "stdafx.h"
#include <string.h>
class Record
{
public:
int Numbersec(); // количество секунд
void Init(int m,int s); // задание начальных значений полей
private:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
int Record::Numbersec()
{
return min*60+sec;
}
class Sportsman
{
public:
char* GetFam(); // возвращает строку-фамилию
void PutFam(char *s); // задание фамилии
Record Best(); // выбрать из двух результатов лучший и вернуть
void Init(char *f,int m1,int s1,int m2,int s2); // задание фамилии и значений min,sec обеим результатам
private:
char Fam[30]; // фамилия
Record FirstRezult; // первый результат спортсмена
Record SecondRezult; // второй результат спортсмена
};
char* Sportsman::GetFam()
{
return Fam;
}
void Sportsman::PutFam(char *s)
{
strcpy(Fam,s);
}
void Sportsman::Init( char *f,int m1,int s1,int m2,int s2)
{
strcpy(Fam,f);
FirstRezult.Init(m1,s1); // FirstRezult.min=m1 FirstRezult.sec=s1
SecondRezult.Init(m2,s2); // SecondRezult.min=m2 SecondRezult.sec=s2
// FirstRezult.min=m1; // ошибка обращенеие к private
}
Record Sportsman::Best()
{
int sec1,sec2; // секунды первого и второго результатов
sec1=FirstRezult.Numbersec(); // вычисление числа секунд 1 результата
sec2=SecondRezult.Numbersec(); // вычисление числа секунд 2 результата
if (sec1<sec2)
return FirstRezult;
else
return SecondRezult;
}
int _tmain(int argc, _TCHAR* argv[])
{
Sportsman F,S; // два спортсмена
char c[30];
// тест для задания и получения фамилий спортсменов
F.PutFam("First"); // фамилия у P ->First
strcpy(c,F.GetFam());
printf("%s",c); // вывод извлеченной фамилии Pu
printf("\n");
S.PutFam("Second"); // фамилия у Z ->Me
strcpy(c,S.GetFam());
printf("%s",c); // вывод извлеченной фамилии Me
printf("\n");
// кто из спортсменов лучше
Sportsman S,N;
Record sb,nb; // для записи лучших результатов P,Z
int ssec,nsec; // число секунд в лучшем результате P,Z
S.Init("So",1,15,2,5); // у S 1 мин,15 сек и 2 мин,5 сек
N.Init("Na",3,5,1,40); // у N 3 мин,5 сек и 1 мин, 40 сек
// S.FirstRezult.Init(1,15); // ошибка вызов S.FirstRezult private
sb=S.Best(); // pb лучшее время у S (1 мин, 15 сек)
n0b=N.Best(); // zb лучшее время у N (1 мин, 40 сек)
ssec=sb.Numbersec(); // число секунд во времени pb (75)
nsec=nb.Numbersec(); // число секунд во времени zb
if(ssec<nsec) // кто из спортсменов лучше
printf("S лучше");
else
printf("N лучше");
return 0;
}
8) принятый способ размещения классов по файлам
В консольном приложении классы размещаются подряд
class Record // описание класса
{
....
};
void Record::Init(int m,int s) // методы класса Record
{
.....
}
....
class Sportsmen // описание следующего класса
{
....
};
char* Sportsman::GetFam() // методы следующего класса
{
...
}
....
int main(int argc, char* argv[]) // главная программа
{
....
}
C++ Builder, Visual C++, Qt и другие размещают классы по файлам:
файл Record.h // заголовочный
class Record // описание класса
{
....
};
файл Record.cpp // методы класса
void Record::Init(int m,int s) // методы класса Record
{
.....
}
....
файл Sportsman.h // заголовочный
class Sportsmen // описание следующего класса
{
....
};
файл Sportsman.cpp
char* Sportsman::GetFam() // методы следующего класса
{
...
}
....
файл lab1.cpp // главная программа
int main(int argc, char* argv[]) // главная программа
{
....
}
9) Отладчик в Visual Studio
F9 - установить точку останова программы
F5 - выполнить программу (до первой точки останова, если есть)
F10 - выполнить строку
F11 - зайти в функцию, если она есть в строке
.....
int Record::Numbersec()
{
....
}
....
k=a.Numbecsec(); // F11 -> Numbersec
Shift-F5 - сброс выпоненияы
Для просмотра переменных подвести курсор мыши