Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ргр 2 сем.docx
Скачиваний:
1
Добавлен:
22.09.2019
Размер:
66.76 Кб
Скачать

Задача 5(№172)

Постановка задачи: Напишите программу для анализа внутреннего представления величин типа double. Предусмотрите возможность задания различных значений переменной типа double путем записи в отведенные под нее байты некоторых значений. Исследуйте, как выглядит внутреннее представление наибольшего и наименьшего положительного значения типа double.

Текст программы:

typedef union{ // Объединение можно рассматривать

double f; // как float

char str[sizeof(double)]; // или как массив символов

unsigned long l[2]; // или как long

}float_chars_long;

#include <iostream>

#include <conio.h>

using namespace std;

void prn_long_bin( unsigned long x )

{

int i,

n = sizeof( unsigned long ) * 8; // n- число двоичных разрядов в long

unsigned long h;

h= 1L << n - 1; //В Старшем разряде у h 1 и 0 в остальных

for ( i=1 ; i<= n;i++){

cout << ((x & h)!=0)<<(1 % 8 ?"":"");

x <<=1;

}

}

void main()

{

float_chars_long var;

char c,i;

cout<<"\n Vvedite chislo s plaf . \n";

cout<<"\n chislo as hex as bin\n";

while((cin>>var.f)!=NULL){

cout<<var.f<<'\t';

for(i=1;i<=sizeof(double);i++){

c=var.str[sizeof(double)-i];

cout<<hex<<((c & 0Xf0)>>4)<< (c & 0X0f)<<' ';

}

cout.put('\t');

prn_long_bin(var.l[1]);

prn_long_bin(var.l[0]);

cout<<endl;

}

getch();

}

Задача 6(№180)

Постановка задачи: Используя программу для работы с датами, проверьте, на какие дни недели пришлись некоторые исторические события. Например, 14 (26) декабря 1825г. произошло восстание декабристов, 9 (22) января 1905г. было Кровавое воскресенье, 25 октября (7 ноября) 1917 произошла Великая Октябрьская Социалистическая революция, 19 августа 1991 г. в СССР было объявлено о создании ГКЧП. Используйте даты нового стиля, указанные в скобках.

* Испытайте программу для работы с датами с другой начальной датой, для которой вам известен день недели.

Текст программы:

#include "stdafx.h"

class Date

{

int d,m,y; //День,месяц и год

static int d0,m0,y0; //Начальная дата

static int dw0; //День недели начальной даты

//1-понедельник, 2-вторник,...

public:

Date(int=0,int=0,int=0); //Конструктор

void Print(); //Функция печати

void Init_Date(int dd, int mm, int yy) //Инициализация даты

{d=dd;m=mm;y=yy;}

//Функция установки начальной даты

static void SetInitialDate(int di,int mi,int yi,int dwi)

{

d0=di; m0=mi; y0=yi; dw0=dwi;

}

int DayOfYear(); //Номер дня в году

int NumberDayOfWeek(); //Номер дня недели

friend int leapyear(Date); //Объявление функции друга

};

#include<iostream>

using namespace std;

//Массив дней в месяцах для невисокосного и високосного года

char daytab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},

{0,31,29,31,30,31,30,31,31,30,31,30,31}};

void Date::Print() //Определение функции печати

{

cout<<d<<"."<<m<<"."<<y;

}

//leap:возвращает 1, если год year високосный и 0, если нет

int leap(int year) //функция определяющая високосный год

{

return(year%4==0&&year%100!=0)||year%400==0;

}

int Date::DayOfYear() //Возвращает номер дня в году

{

int days=d; //Количество дней от начала месяца

int lp=leap(y); //Признак високосного года

for(int i=1;i<m;i++)

days+=daytab[lp][i];

return days;

}

int Date::NumberDayOfWeek() //Возвращает номер дня недели

{ //Понедельник-1

Date dti(d0,m0,y0); //Начальная дата формируется по статическим членам класса

long days=dw0-1; //Количество дней, прошедших от понедельника начальной недели

if(y0<y)

{

days+=365+leap(y0)-dti.DayOfYear(); //Учет дней в начальном году

for(int i=y0+1;i<y;i++) //Учет дней

days+=365+leap(i); // в промежуточных годах

days+=DayOfYear(); // Учет дней в заданном году

}

else if(y0==y)

days+=DayOfYear()-dti.DayOfYear();

return days%7+1;

}

int Date::d0;int Date::m0;int Date::y0;int Date::dw0;

int leapyear(Date dt)

{return leap(dt.y);}

//Реализация конструктора

#include <ctime>

Date::Date(int dd,int mm, int yy) //Инициализация системной даты

{

time_t seconds;

time (&seconds);

struct tm *ptm_time;

ptm_time=localtime(&seconds);

d=dd?dd:ptm_time-> tm_mday; //если день не задан, берется текущий

m=mm?mm:ptm_time-> tm_mon+1; //если месяц не задан, берется текущий

y=yy?yy:ptm_time-> tm_year+1900; //если год не задан, берется текущий

}

#include<conio.h>

int main()

{

setlocale(LC_ALL,"Russian");

int ds,ms,ys;

char*DayWeek[7]={"Понедельник","Вторник",

"Среда","Четверг","Пятница",

"Суббота","Воскресенье"};

Date::SetInitialDate(31,12,2010,5); //31 декабря 2010г. была пятница

Date Istor;

cout<<"\n Введите дату :";

cin>>ds>>ms>>ys;

Istor.Init_Date(ds,ms,ys); //Инициализация даты с клавиатуры

cout<<"\n День недели: ";

cout<<DayWeek[Istor.NumberDayOfWeek()-1]; //вывод дня недели в который

//произошло это событие

getch();

return 0;

}