Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР Молодцов.doc
Скачиваний:
0
Добавлен:
21.09.2019
Размер:
126.98 Кб
Скачать

Федеральное агентство по образованию

Государственное образовательное учреждение высшего профессионального образования

НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ АРХИТЕКТУРНО – СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ

Кафедра информационных систем и технологий

Расчётно – графическая работа по дисциплине

ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ

Выполнил студент гр. ИС-20 Молодцов Р. Е.

Проверил доцент кафедра ИСиТ, Тарасов В.Л.

к.т.н.

Нижний Новгород, 2012год.

Содержание:

Введение…………………………………………………………………………………………………...3

Задача 1(№129)……………..…………………………………………..………………...………....…….4

Задача 2(№132)…………………..…………………………………………………..………...………….5

Задача 3(143)……………………..……………………………………………………………..…………6

Задача 4(№163)…………………..……………………………………………………………..…………8

Задача 5(№170)………..………………………………………………………………………..………....9

Задача 6(№179)…………………..………………………………………………………………..……..11

Задача 7(№187)……………..………………………..…………………………………………..………11

Задача 8(№194)……………..……………………………………………………………………………14

Задача 9(№197)…………..………………………………………………………………………………17

Список используемой литературы…………………………………….……………………………….18

Введение.

О языках Си и C++.

В качестве базового языка программирования выбран C++, который является одним из главных инструментом в современном программировании. C++ является мощным и достаточно объемным языком, но, в то же время, у него есть достоинства, которые позволяют рекомендовать его для первоначального обучения программированию. Отметим, например, последовательную реализацию в C++ концепции структурного программирования, простой и удобный ввод и вывод.

Предшественником языка C++ является язык Си, разработанный Денисом Ритчи в начале 1970-х годов Си относится к языкам среднего уровня, поскольку в нем сочетаются управляющие структуры высокого уровня и возможность манипулировать отдельными битами, байтами и адресами. Язык Си быстро завоевал популярность у программистов благодаря своей лаконичности, выразительности и эффективности. Долго время единственным руководством по языку Си была книга заслужившая почетное название «библия языка Си». В 1989г. принят стандарт языка Си Международной организацией стандартов (International Standard Organization – ISO), в 1999г. был принят новый стандарт. Если программа написана в соответствии со стандартом языка, это гарантирует, что она будет выполняться на любом компьютере и в любой среде разработки.

В 1979г. Бьярн Страуструп на основе языка Си разработал язык C++. Главным нововведением было включение в язык понятия класса, с помощью которого реализована концепция объектно-ориентированного программирования. В 1998г. принят стандарт языка C++. Язык Си является, за небольшими исключениями, подмножеством языка C++, так что программа, написанная на Си, является и программой на C++.

Синтаксис языков Си и C++ использован в новейших языках программирования Java и C# (произносится Си-шарп), которые предназначены для разработки приложений, работающих в сети Интернет. Таким образом, знакомство с языком C++ может служить базой для изучения других современных языков.

Задача 1(№129)

/* Задача №129Постановка задачи:

Написать функцию которая получает в качестве аргумента указатель на функцию double (*f)(double x) и возвращает минимальное значение функции f на отрезке [a, b].

Алгоритм: Применим для решения задачи метод перебора. Выберем на отрезке [a, b] n точек, расположенных на одинаковом расстоянии друг от друга, вычислим их координаты. В каждой точке вычислим значение функции и выберем из них минимальное. С помощью указателей выводим аргумент функции и минимальное значение.

Решение:

double min fun (double (*f)(double x), (double x), double a, double b, int n) { double dx, fx, min; dx=(b-a)/(n-1); min=f(a); while ((a+=dx)<=b) { fx=f(a); if(fx<min) min=fx; } return min; } #include <iostream>, <conio.h>, <math.h> #define M_Pi 3.141592 using namespace std; double ert(double); void main () { cout<<”\n min sin(x) при 0<x<Pi=”<<minfun(sin, 0, M_Pi, 50); cout<<”\n min erf(x) при -2<x<2=”<<minfun(erf, -2, 2, 50); getch(); } double erf(double x) { return -1/(1+x*x); }

Пример работы программы:

n min sin(x) при 0<x<Pi = 0

min erf(x) при -2<x<2 = -1

Задача 2(№132)

/*

Задача №132

Постановка задачи:

Написать функцию, которая возвращает ссылку на максимальный из трех своих аргументов. Используя ее, заменим значение максимального из трех чисел их средним значением.*/

Алгоритм: Просим ввести сумму займа и процент годовых. После ввода сумма выплаты вычисляется по формуле x=p/100*r и выводится на экран.

Решение:

double& max3 (double& a, double& b, double& c);

{

if (a>b && a>c)

return a;

else if (b>a && b>c)

return b;

else return c;

}

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

double SrZna4;

double x, y, z;

cout<< “Vvedite 3 4isla:’’;

cin>>x>>y>>z;

cout<<”x=”<<x<<”z=”<<z<<”y=”<<y<<endl;

SrZna4= (x+y+z)/3;

Cout<<”Среднее значение: “<<SrZna4<<”\n”;

Cout<<”Заменим max значение средним”;

Max3 (x, y, z)=SrZna4

Cout<<”after excheinge \n”;

Cout<<’’x=”<<x<<”, y=”<<y<<”, z=”<<z<<endl;

Return 0;

}

Пример работы программы:

Vvedite 3 4isla: 3 5 1

Среднее значение: 3

Заменим max значение средним

after excheinge

3 3 1

Задача 3(№143)

/*

Задача №143

Постановка задачи:

Написать программу, которая находит и выводит самую длинную строку текстового файла.

*/

Алгоритм: ввести с клавиатуры имя входного файла, затем читать строки из файла, пока не достигнут его конец. Находим длину строки и запоминаем её в переменной В, количество символов в переменной К. Если количество прочитанных строк (К) сравнимо со счетчиком (i), то выводим на печать эту строку. В конце программы закрываем входной файл

Решение:

#include <fstream>

#include <conio.h>

#include <string.h>

#include <stdlib.h>

using namespace std;

const int lenname=13; //Длина строки с именем файла

const int MAXLEN=200; //Максимальная длина строки

int main()

{

clrscr();

ifstream fin; //Файловый поток для ввода

char filename[lenname]; //Массив для имени файла

char line[MAXLEN]; //Массив для строк

cout<<"Ввести имя входного файла ";

cin>>filename;

fin.open(filename);

if(!fin){ //Если не удалось открыть входной файл

cerr<<"Не удалось открыть файл "<<filename<<'\n';

exit(1);

}

int i=0; //Количество прочитанных символов

int A; //Длина прочитанной строки

int B=1; //Единичная строка

int K; //Количество символов

cin.get(); //Убираем код из cin

while (!fin.eof()){ //Пока не достигнут конец файла

fin.getline(line,MAXLEN); //Читаем строку из файла

A=strlen(line); //Нахождение длины строки

if(A>B){ //Если текущая строка больше единичной

B=A; //то в В запоминаем длину прочитанной строки

K=i; //переменной К присваиваем количество прочитанных символов

}

i++; //Увеличиваем счётчик

}

fin.close();

fin.open(filename);

i=0; //Зануляем счетчик

while(!fin.eof()){ // Пока не достигнут конец файла

fin.getline(line,MAXLEN); //Читаем строку из файла

if(i==K){ //Если счетчик сравним с количеством прочитанных символов,

cout<<line; //то выводим строку на печать

}

i++; //Увеличиваем счетчик

}

fin.close(); //Закрытие входного файла

getch();

}

Пример работы программы:

Ввести имя входного файла 1.txt

Sycshestvyet dva vida potokov: tekstovye i binarnye.

Задача 4(№163)

/*

Задача №163

Постановка задачи:

Написать функцию setbits(x, p, n, y), возвращающую значение х, в котором n бит, начиная с p – ой позиции справа, заменены на n правых разрядов из y (остальные биты не меняются).

*/

Алгоритм: применяя, различные побитовые операторы и путем введения переменой onebit получилась функция setbits(x, p, n, y), возвращающая значение х, в котором n бит, начиная с p – ой позиции справа, заменены на n правых разрядов из у. Решение:

#include<iostream>

#include<conio.h>

#include<string.h>

using namespace std;

int main()

typedef char Typei;

//itobin: формирует строку из 0 и 1 с двоичным представлением n, возвращает указатель на s

char* itobin(Typei n,char* s)

{

int i,d;

int size=sizeof(Typei)*8; //Размер целого типа в байтах

Typei onebit=1;

//Заполнение двоичными цифрами, начиная с последней

for(i=0;i<size;i++,onebit<<=1)

s[i]=n & onebit? '1' : '0';

s[i]='\0';

strrev(s); //Реверсирование строки

return s;

}

int setbits(unsigned char x,unsigned char p,unsigned char n,unsigned char y)

{

int z=0,i;

int onebit=1;

char s[33];

cout<<"onebit = "<<int(onebit)<<" = "<<itobin(onebit,s)<<'\n';

//Создаем переменную, у которой справа n – единиц

for(i=0;i<n;i++,onebit<<=1)

z|=onebit;

cout<<"z = "<<int(z)<<" = "<<itobin(z,s)<<'\n';

int y1=(y&z)<<p;

cout<<"y1 = "<<int(y1)<<" = "<<itobin(y1,s)<<'\n';

z<<=p;

cout<<"z = "<<int(z)<<" = "<<itobin(z,s)<<'\n';

z=~z;

cout<<"z = "<<int(z)<<" = "<<itobin(z,s)<<'\n';

x=x&z;

cout<<"x = "<<int(x)<<" = "<<itobin(x,s)<<'\n';

x=x|y1;

cout<<"x = "<<int(x)<<" = "<<itobin(x,s)<<'\n';

return x;

}

int main()

{

clrscr();

char s[33];

unsigned char x=227,p=2,n=4,y=217,x1;

cout<< "p ="<<int(p)<<" n= "<<int(n)<<'\n';

cout<<"x = "<<int(x)<<" = "<<itobin(x,s)<<'\n';

cout<<"y = "<<int(y)<<" = "<<itobin(y,s)<<'\n';

x1= setbits(x,p,n,y);

cout<<"x1 = "<<int(x1)<<" = "<<itobin(x1,s);

getch();

return 0;

}

Пример работы программы:

p = 2 n = 4

x =227 = 11100011

y =217 = 11011001

onebit =1 = 00000001

z = 15 = 00001111

y1 = 36 = 00100100

z = 60 = 00111100

z = -61 = 11000011

x = 195 = 11000011

x = 231 = 11100111

x = 231 = 11100111

Задача 5(№170)

/*

Задача №170

Постановка задачи

Разработайте структуру с битовыми полями для хранения времени, то есть часов, минут и секунд., такую чтобы для её хранения отводилось как можно меньше памяти. Напишите программу, включающую функцию для печати времени, а так же функцию, вычисляющую длину промежутка между двумя моментами времени.

Алгоритм программы

С клавиатуры вводим два момента времени, пишем функцию, которая сравнивает эти два момента времени, переводя их в секунды, и как результат выдаёт временной промежуток между этими временами в формате чч, мм, сс

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

class Vremia{

int c,m,s;

public: //Открытые члены класса

void Init_Vremia(int cc,int mm,int ss) //Функция инициализации даты

{c=cc; m=mm; s=ss;}

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

Vremia Raznica(Vremia V2); //Функция нахождения разницы между двумя моментами времени

};

#include<iostream.h>

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

{cout<<c<<'.'<<m<<'.'<<s;}

Vremia Vremia::Raznica(Vremia V2) //Определение функции разницы между двумя моментами времени

{

Vremia Dif;

int sec1=c*3600+m*60+s; //Перевод первой даты в секунды

int sec2=V2.c*3600+V2.m*60+V2.s; //Перевод второй даты в секунды

int sec;

if(sec1>sec2) //Сравнение двух моментов времени по секундам

sec=sec1-sec2;

else sec=sec2-sec1;

int cD=sec/3600;

sec=sec-cD*3600;

int mD=sec/60;

int sD=sec%60;

Dif.Init_Vremia(cD,mD,sD);

return Dif; //Возвращает разницу во времени в формате чч, мм, сс

}

#include<conio.h>

int main()

{

clrscr();

Vremia V1,V2;

int cc,mm,cc1,mm1,cc2,mm2,ss1,ss,ss2;

cout<<"vvedite 1 vremia\n";

cin>>cc>>mm>>ss;

V1.Init_Vremia(cc,mm,ss); V1.Print(); cout<<endl; //Инициализация и печать первой даты

cout<<"vvedite 2 vremia\n";

cin>>cc1>>mm1>>ss1;

V2.Init_Vremia(cc1,mm1,ss1); //Инициализация второй даты

V2.Print(); //Печать второй даты

cout<<"\nraznica vremeni ";

Vremia D=V1.Raznica(V2); //Нахождение разницы во времени

D.Print();

getch();

return 0;

}

Пример работы программы

Введите первое время 12 00

Введите второе время 13 00

Разница времени 1 00

Задача 6(№179)

/*

Задача №179

Постановка задачи:

Используя программу для работы с датами, проверьте, на какие дни недели пришлись некоторые исторические события. Например, 26 декабря 1825г. Произошло восстание декабристов, 22 января 1905г. было Кровавое воскресенье, 7 ноября 1917г. произошла Великая Социалистическая революция, 19 августа 1991г. в CCCP было объявлено о создании ГКЧП.*/

Алгоритм: С клавиатуры вводим дату, пишем функцию которая подсчитает день недели и выводим на экран название дня недели на который приходилась та или иная дата. Функцию пишем так что мы задаем один день с названием дня недели самостоятельно в программе, а функция считает разницу между этим днём и заданной датой и находит название дня недели.

Решение:

class Date

{

int d,m,y;

static int d0,m0,y0;

static int dw0;

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.h>

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;}

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 <dos.h>

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

{

date sysd;

getdate(&sysd);

d=dd?dd:sysd.da_day;

m=mm?mm:sysd.da_mon;

y=yy?yy:sysd.da_year;

}

#include<conio.h>

using namespace std;

int main()

{

clrscr();

int ds,ms,ys;

char*DayWeek[7]={"poned","vtornic","sreda","4etverg","piatnica","sybbota","voskres"};

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

Date Istor;

cout<<"\n Sobitie, vvedite daty : ";

cin>>ds>>ms>>ys;

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

cout<<"\n Day nedeli: ";

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

getch();

return 0;

}

Пример работы программы:

Введите дату 26 12 1825

День недели понедельник

Задача 7(№187)

/*

Задача №187

Постановка задачи:

Постановка задачи

Напишите программу для работы со стеком целых чисел. Помещайте вводимые числа в стек, найдите сумму чисел, помещённых в стек, максимальное число в стеке.

Алгоритм программы

Для решения этой задачи необходимо организовать функцию для помещения элементов в стек и функцию извлечения числа из стека. Стек представляет собой «стопку листов бумаги». Когда мы извлекаем элемент из стека, он берётся с вершины стопки. Также нам нужна функция isEmpty, которая определяет, не пуст ли стек. В функции Main организуем заполнение стека, после чего берём каждый элемент с вершины и проверяем, не больше ли он максимального элемента и добавляем его к сумме.

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

#pragma hdrstop

#include "UnStack.h"

#pragma package(smart_init)

//файл Stack.cpp

#include <iostream.h>

static const int SZ=1000;

static int s[SZ];

static int sp = 0;

//push: поместить c в стек

void push(int c)

{

if(sp<SZ)

s[sp++]=c;

else

cerr<<"Stek polon, "<<char(c)<<"ne pomeshaensya \n";

}

//pop: извлечь элемент из вершины стека

int pop()

{

if(sp>0)

return s[--sp];

else{

cerr<<"Stek pust\n";

return EOF;

}

}

bool isEmpty()

{

if(sp==0) return true;

else return false;

}

#pragma hdrstop

#pragma argsused

#include <iostream.h>

#include <stdlib.h>

#include <conio.h>

#include "UnStack.h"

int main(int argc, char* argv[])

{

int c,i,sum = 0;

cout<<"Vvodite elementi steka: ";

for (i = 0; i <= 4; i++) {

cin>>c;

push(c);

}

int max = pop();

sum+=max;

cout<<"\nStack: "<<max<<" ";

while(isEmpty() == false){

c=pop();

cout<<c<<" ";

sum+=c;

if(c>max) max = c;

}

cout<<"\nSumma = "<<sum<<"\n";

cout<<"Max = "<<max;

getch();

return 0;

}

#ifndef UnStackH

#define UnStackH

void push(int c);

int pop();

bool isEmpty();

#endif

Пример работы программы

Vvodite elementi steka: 5 4 3 2 1

Stack: 1 2 3 4 5

Summa = 15

Max = 5

Задача 8(№194)

/*

Задача №194

Постановка задачи:

Напишите класс Integral, включающий указатель на функцию. для вычисления некоторой математической функции и границы отрезка ее области определения. Предусмотрите в классе функцию-оператор для вычисления значения интеграла на заданном отрезке.

*/

Алгоритм решения данной задачи:

Мы задаем функцию, а программа подсчитывает её определённый интеграл и выдаёт результат

Решение:

#ifndef UnIntegralH //Страж включения

#define UnIntegralH //Страж включения

#include<math.h>

class Integral

{ double (*f)(double);

double a,b;

public: //Открытые члены класса

Integral (double(*fi)(double),double ai,double bi) //Инициализация подинтегральной функции и границ интегрирования

{f=fi;a=ai;b=bi;}

double operator!(); //Функция подсчёта интеграла

}; #endif

Файл INTEGRAL.CPP

#include"UnIntegral.h"

#include<iostream>

#include<conio.h>

using namespace std;

int main ();

double bb,aa;

const int N=100;

double Integral::operator!() //Перегрузка оператора для вычисления интеграла

{

double sum=0, x=a, dx=(b-a)/(N-1);

for(int i=0;i<N-1;i++){

sum+=f(x)*dx;

x+=dx;

}

return sum; //Возвращение подсчитанного интеграла

}

void main()

{

double aa,bb;

double(*ff)(double);

Integral fun(sin,0,M_PI);

double funn=fun.operator!();

cout<<funn;

getch();

}

Пример работы программы:

Интеграл от sin от –M_PI до M_PI =2