Цитата:
Цитата котвася
Так что думаю тут без * никак так как надо передавать массив. Или есть другой "правильный путь"? »
|
Правильно. Используй символьный массив указателей. Я когда-то решал подобную задачу.
Date.h
Код:
// Определение класса Time
// Функции-члены определены в Date1.cpp
// Процессорные директивы, которые предотвращают
// многократное включение заголовочного файла
#ifndef DATE_H
#define DATE_H
class Date{
public:
// конструктор
Date(int = 1, int = 1, int = 1990);
// печать дат в формате месяца/дня/года. 05.01.1997
void print() const;
// печать дат в формате число, срока названия месяца, год. 5 января 1997 год.
void print_Day_StringMonth_Year() const;
~Date();
// функцияи 'set' Установка и проверка вводимых параметров
void setDate(int, int, int); // установка дня, месяца, года
private:
int day; // День от 1 - 31
int month; // Месяц от 1 - 12
int year; // Год. Целое число
// функция-утилита для проверки соответствия дня месяца и году
int checkDay(int); // На всякий случай ;)))))
};
#endif
Date.cpp
Код:
// определения функции-членов класса Date
#include <iostream.h>
using std::cout;
using std::endl;
#include "date.h"
// конструктор: поддержка соответствующего значения месяца;
// вызвать функцию-утилиту checkDay для поддержки соответствующего
// значения дня
Date::Date(int dy, int mn, int yr)
{
setDate(dy, mn, yr); // Функция правильной установки дня, месяца, и года
}
// печать объекта Date в форме месяца/дня/года. 05.01.1997--------------------
void Date::print() const
{
int NumbNullDay_and_Month, // Счётчик
NumbNull_Day, // индекс для массива NumberDay_Month, для правильного отображения числа ДНЯ с нулём
NumbNull_Month; // индекс для массива NumberDay_Month, для правильного отображения числа МЕСЯЦА с нулём
static const char *NumberDay_Month [10] = {"", "01", "02", "03", "04", "05", "06", "07", "08", "09"};
// Проверка дня, если в числе ДНЯ один разряд, вычислить соответствующий индекс массива NumberDay_Month...
if(day < 10){
for(NumbNullDay_and_Month = 0; NumbNullDay_and_Month < 11; NumbNullDay_and_Month++){
if(NumbNullDay_and_Month == day)
NumbNull_Day = NumbNullDay_and_Month;
}
}
// Если в числе ДНЯ, больше одного разряда, то присвоить переменной NumbNull_Day, тоже число, что и было
else if(day > 9)
NumbNull_Day = day;
// Проверка дня, если в числе МЕСЯЦА один разряд, вычислить соответствующий индекс массива NumberDay_Month...
if(month < 10){
for(NumbNullDay_and_Month = 0; NumbNullDay_and_Month < 11; NumbNullDay_and_Month++){
if(NumbNullDay_and_Month == month)
NumbNull_Month = NumbNullDay_and_Month;
}
}
// Если в числе МЕСЯЦА, больше одного разряда, то присвоить переменной NumbNull_Day, тоже число, что и было
else if(month > 9)
NumbNull_Month = month;
// Вывод вариантов
if(day < 10 && month < 10) // Если в ДНЕ И в МЕСЯЦЕ число меньше десяти
cout<<NumberDay_Month[NumbNull_Day]<<"."<<NumberDay_Month[NumbNull_Month]<<"."<<year<<endl;
else if(day < 10 && month > 9) // Если в ДНЕ меньше деСяти, И в МЕСЯЦЕ больше деВяти
cout<<NumberDay_Month[NumbNull_Day]<<"."<<NumbNull_Month<<"."<<year<<endl;
else if(day > 9 && month < 10) // Если в ДНЕ больше деВяти, И в МЕСЯЦЕ больше деСяти
cout<<NumbNull_Day<<"."<<NumberDay_Month[NumbNull_Month]<<"."<<year<<endl;
else if(day > 9 && month > 9) // Если в ДНЕ И в МЕСЯЦЕ число больше деСяти
cout<<NumbNull_Day<<"."<<NumbNull_Month<<"."<<year<<endl;
}
// печать дат в формате число, строка названия месяца, год--------------------
void Date::print_Day_StringMonth_Year() const
{
int i;
static const char *Month [13] = {"", "Yanvaria", "Fevralia", "Marta", "Aprelia",
"May", "Yuni", "Yuli", "Avgusta", "Sentyabria",
"Ortyabria", "Noyabria", "Dekabria"};
for(i = 0; i < 14; i++){
if(month == i)
cout<<day<<" "<<Month[i]<<" "<<year<<" God."<<endl;
}
}
// функция-утилита для поддержки соответствующего
// значения дня в зависимости от месяца и года.
// является ли 2000-й год високосным?-----------------------------------------
int Date::checkDay(int testDay)
{
static const int daysPerMonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(testDay > 0 && testDay <= daysPerMonth[month])
return testDay;
if(month == 2 && // февраль: проверка високосноо года
testDay == 29 &&
(year % 400 == 0 || (year %4 == 0 && year % 100 != 0)))
return testDay;
cout<<" DENY: "<<testDay<<" NEPRAVILNIY. USTANOVITY DENY 1 \n\n";
print();
print_Day_StringMonth_Year();
return 1; // если значение неправильное
}
// Проверка и Установка даты через setDate------------------------------------
void Date::setDate(int dy, int mn, int yr)
{
if(mn > 0 && mn <= 12) // проверка месяца
month = mn;
else{
month = 1;
cout<<" MEZYAC: "<<mn<<" NEPRAILNIY. USTANOVITY MEZYAC 1. \n\n";
}
year = yr;
day = checkDay(dy); // проверка дня
print();
print_Day_StringMonth_Year();
cout<<"\n KONSTRUKPOR OBEKTA 'DATE'\n";
cout<<endl;
}
// деструктор-----------------------------------------------------------------
Date::~Date()
{
cout<<" DESTRUKTOR DATE-OBEKTA DLA DATY ";
print();
cout<<endl;
}
//---------------------------------------------------------------------------
// демонстрация композиции: объект с объектами-членами
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;
#include "date.h"
int main()
{
int dayy,
monthh,
yearr,
z;
Date d(3, 12, 1988);
cout<<'\n';
// Формат 05.01.1997
d.print();
cout<<'\n';
// Формат 5 января 1997 года.
d.print_Day_StringMonth_Year();
cout<<"\n PROVERKA KONSTRUKTORA 'DATE' S NEPRAVILYNIVI ZNACHENIAVI: \n";
Date dd(14, 35, 1994); // неправильные Date-значения
cout<<endl;
do{
cout<<"\n Enter '0' START AND '-1' FINISH: ";
cin>>z;
cout<<endl;
// Ввод нужных значений
cout<<"Enter Day: ";
cin>>dayy;
cout<<"Enter Month: ";
cin>>monthh;
cout<<"Enter Year: ";
cin>>yearr;
// Функция установки и проверки правильности ввода
d.setDate(dayy, monthh, yearr);
// Вывод вариантов отображения
d.print();
d.print_Day_StringMonth_Year();
}
while(z != -1);
cin>>z;
return 0;
}
//---------------------------------------------------------------------------
|