- •Содержание:
- •Введение
- •Задача 1(№130)
- •Текст программы:
- •Задача 2(№133)
- •Текст программы:
- •Задача 3(№140)
- •Текст программы:
- •Задача 4(№161)
- •Текст программы:
- •Задача 5(№172)
- •Текст программы:
- •Задача 6(№180)
- •Текст программы:
- •Задача 7(№188)
- •Текст программы:
- •Текст программы:
- •Задача 9(№201)
- •Текст программы:
- •Список используемой литературы
Задача 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;
}