Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ АРХИТЕКТУРНО – СТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ
Кафедра информационных систем и технологий
Расчётно – графическая работа по дисциплине
ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ
Выполнил студент гр. ИС-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