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

Исходные данные

I. Квадратурные формулы для вычисления интеграла (всюду ):

а) формула прямоугольников

;

За приближенное значение интеграла принимается такое, при котором .

II. Подынтегральная функция. Представим

.

Функция (x):

;

Функция (z):

;

III. Числовые данные

a

b

M

t1

t2

t3

t4

t5

t6

а)

0

1

0,1

3

-3,7

1,8

7,2

-

-

-

// integral_function

//arb2013_integral_function

#include<iostream.h>

#include<fstream.h>

#include<math.h>

#include<iomanip.h>

#include<string.h>

const int lengthColumn=20;

const int Indent=7;

const int lengthTable=43;

//////////////////////////

double Fi(double x)

{

return cos(x)*cos(x);

}

///////////////////////////////

double Psi(double x)

{

return (1-x*x)/(1+x*x);

}

/////////////////////////

double F(double x,double t)

{

return Psi(x)*Fi(x+ t/(1+x*x));

}

///////////////////////////////////////

void create(ifstream &f, double x[], int n)

{

int i;

for(i=0;i<n;i++) f>>x[i];

}

/////////////////////////////////////////

void show(ofstream &f, double x[], int n)

{

int i;

for(i=0;i<n;i++)

f<<x[i]<<' '; f<<endl;

}

/////////////////////////////////////////

double Integral(double a, double b, double e, double t)

{

double h,J1,J2;

int i,n;

n=1; h=(b-a)/n;

J2=h*F(a+h/2, t);

do

{

J1=J2;

n=n*2;

h=(b-a)/n;

J2=0;

for (i=0;i<=n-1;i++)

J2=J2+F(a+(2*i+1)*h/2,t);

J2=J2*h;

}while (fabs(J2-J1)>e);

return J2;

}

//////////////////////////////////////

void star(ofstream &f, int n, int m)

{

f.width(n);

int i;

for(i=0;i<m;i++)

f<<'*';

f<<endl;

}

/////////////////////////////////////

void star1(ofstream &f, int n, int m)

{

f.width(n); f<<'*';

int i;

for(i=0;i<m;i++)

{

f.width(lengthColumn+1);

f<<'*';

}

f<<endl;

}

//////////////////////////////////////

void table(ofstream &f,double* x,double* y,int m, char a[2][15])

{

int i;

f<<endl;

star(f,Indent+1,lengthTable);

star1(f,Indent+1,2);

f.width(Indent+1);

f<<'*';

for(i=0;i<2;i++)

{

f.width(10);

f<<a[i];

f.width(11);

f<<'*';

}

f<<endl;

star1(f,Indent+1,2);

star(f,Indent+1,lengthTable);

for(i=0;i<m;i++)

{

f.width(Indent+1);

f<<'*';

f.width(lengthColumn-5);

f<<x[i];

f.width(6);

f<<'*';

f.width(lengthColumn-5);

f<<y[i];

f.width(6);

f<<'*';

f<<endl;

star1(f,Indent+1,2);

star(f,Indent+1,lengthTable);

}

}

/////////////////////////////

void main()

{

ifstream in("arb.txt");

ofstream out("integral.txt");

double a,b,eps;

int m,i;

char name_task[80];

char name_x_y[2][15];

in.getline(name_task,80);

for(i=0;i<2;i++)

in>>name_x_y[i];

out<<name_task<<endl;

for(i=0;i<2;i++)

out<<name_x_y[i]<<' ';

out<<endl;

in>>a>>b>>eps>>m;

out<<"a= "<<a<<endl;

out<<"b= "<<b<<endl;

out<<"eps= "<<eps<<endl;

out<<"m= "<<m<<endl;

double* t, *y;

t=new double[m];

y=new double[m];

create(in, t,m);

out<<"arguments : "<<endl;

show(out,t,m);

for(i=0;i<m;i++)

y[i]=Integral(a,b,eps,t[i]);

out<<"value of integeral"<<endl;

show(out,y,m);

out<<endl;

out<<setw(15+strlen(name_task))<<name_task<<endl;

table(out,t,y,m,name_x_y);

in.close();

out.close();

delete []t;

delete []y;

}

////////////////////////////////////////

Файл arb.txt

Calculate integral.

x[i] y[i]

0 1 0.001 3 -3.7 1.8 7.2

//////////////////////////////////////

Файл integeral.txt

Calculate integral.

x[i] y[i]

a= 0

b= 1

eps= 0.001

m= 3

arguments :

-3.7 1.8 7.2

value of integeral

0.406703 0.0658141 0.335945

Calculate integral.

*******************************************

* * *

* x[i] * y[i] *

* * *

*******************************************

* -3.7 * 0.406703 *

* * *

*******************************************

* 1.8 * 0.0658141 *

* * *

*******************************************

* 7.2 * 0.335945 *

* * *

*******************************************

Вторая версия вычисление интеграла без файла

// integral_function

//arb2014_integral_function_without_file

#include<iostream>

#include<math.h>

#include<iomanip>

#include<string>

using namespace std;

const int lengthColumn=20;

const int Indent=7;

const int lengthTable=43;

//////////////////////////

double Fi(double x)

{

return cos(x)*cos(x);

}

///////////////////////////////

double Psi(double x)

{

return (1-x*x)/(1+x*x);

}

/////////////////////////

double F(double x,double t)

{

return Psi(x)*Fi(x+ t/(1+x*x));

}

///////////////////////////////////////

void create(double* x, int n)

{

int i;

for(i=0;i<n;i++)

{

cout<<"x["<<i<<"]=";

cin>>x[i];

}

}

/////////////////////////////////////////

void show( double* x, int n)

{

int i;

for(i=0;i<n;i++)

cout<<x[i]<<' ';

cout<<endl;

}

/////////////////////////////////////////

double Integral(double a, double b, double e, double t)

{

double h,J1,J2;

int i,n;

n=1;

h=(b-a)/n;

J2=h*F(a+h/2, t);

do

{

J1=J2;

n=n*2;

h=(b-a)/n;

J2=0;

for (i=0;i<=n-1;i++)

J2=J2+F(a+(2*i+1)*h/2,t);

J2=J2*h;

}while (fabs(J2-J1)>e);

return J2;

}

//////////////////////////////////////

void star( int n, int m)

{

cout.width(n);

int i;

for(i=0;i<m;i++)

cout<<'*';

cout<<endl;

}

/////////////////////////////////////

void star1( int n, int m)

{

cout.width(n); cout<<'*';

int i;

for(i=0;i<m;i++)

{

cout.width(lengthColumn+1);

cout<<'*';

}

cout<<endl;

}

//////////////////////////////////////

void table(double* x,double* y,int m, char a[2][15])

{

int i;

cout<<endl;

star(Indent+1,lengthTable);

star1(Indent+1,2);

cout.width(Indent+1);

cout<<'*';

for(i=0;i<2;i++)

{

cout.width(10);

cout<<a[i];

cout.width(11);

cout<<'*';

}

cout<<endl;

star1(Indent+1,2);

star(Indent+1,lengthTable);

for(i=0;i<m;i++)

{

cout.width(Indent+1);

cout<<'*';

cout.width(lengthColumn-5);

cout<<x[i];

cout.width(6);

cout<<'*';

cout.width(lengthColumn-5);

cout<<y[i];

cout.width(6);

cout<<'*';

cout<<endl;

star1(Indent+1,2);

star(Indent+1,lengthTable);

}

}

/////////////////////////////

void main()

{

double a,b,eps;

int m,i;

char name_task[80];

char name_x_y[2][15]; // x[i] y[i]

cout<<" enter the name of the table"<<endl;

cin.getline(name_task,80);//

for(i=0;i<2;i++)

{

cout<<" x[i] y[i] ";

cin>>name_x_y[i];// x[i] y[i]

}

cout<<endl;

cout<<name_task<<endl;

for(i=0;i<2;i++)

cout<<name_x_y[i]<<' ';

cout<<endl;

cout<<" a= "; cin>>a;

cout<<" b= "; cin>>b;

cout<<" eps= "; cin>>eps;

cout<<" m= "; cin>>m;

double* t, *y;

t=new double[m];

y=new double[m];

create( t,m);

cout<<"arguments : "<<endl;

show(t,m);

for(i=0;i<m;i++)

y[i]=Integral(a,b,eps,t[i]);

cout<<"value of integeral"<<endl;

show(y,m);

cout<<endl;

cout<<setw(15+strlen(name_task))<<name_task<<endl;

table(t,y,m,name_x_y);

delete []t;

delete []y;

}

////////////////////////////////////////

Форматированный ввод-вывод данных.

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

Форматирование данных с использованием функций-членов класса ios

В системе ввода-вывода С++ каждый поток связанс набором флагов форматирования информации. В классе ios объявляется перечисление fntflags, в котором определены следующие значения

adjustfield

basefield

boolalpfa

dec

fixed

floatfield

hex

internal

left

oct

right

scientific

showbase

showpoint

showpos

skipws

unitbuf

upprecase

Эти значения мспользуются для установки или очистки флагов форматирования.

Если флаг skipws установлен , то при потоковом вводе данных ведущие пробельные символы , или символы пропуска (т.е. пробелы , символы табуляции и новой строки ), отбрасываются.

…..

Установка и сброс флагов форматирования

Для установки любого флага используется функция setf(), которая является членом класса ios.

Лекция №10

Строки

Чаще всего одномерные массивы используются для создания символьных строк. Первый ( и наиболее популярный ) предполагает , что строка определяется как символьный массив , который завершается символом (‘\0’). Таким образом, строка с завершающим нулем состоит из символов и конечного нуль-символа. Строка С++ - это строка с завершающим нулем.

Однако существует и другой тип представлениястрок в С++.

Он заключается в применении объектов класса string, который является частью библиотеки классов С++. Таким образом, класс string – не встроенный тип.

Основы представления строк

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

const int n=80;

char a[n];

a=”KAZAN”; 0 символ обозначает конец строки.

char b[11]; - если нужно ввести 10 символов;

cin>>a; //Ввод строки Kazan State University

cout<<a; //На экране будет только Kazan.

// Массив читается только до пробела.

С++ позволяет определятьстроковые константы (литералы)

Строковый литерал – это список символов, заключенный в двойные кавычки

Например:

“Привет”

“Мне нравится С++ ”

“”

Строка “” называется нулевой. Она состоит только из одного нулевого символа (признака завершения строки). Нулевые строки используются для представления пустых строк.

Программа 1

//arb2014_string_cin

#include <iostream>

using namespace std;

void main()

{

const int n=30;

char S[n];

char T[n];

char R[n];

cout << "enter 3 words s=" << endl;

cin>>S;

cout << "string S="<<S<<endl; ;

//Ввод строки Kazan State University

//На экране будет только слово Kazan

cin>>T>>R;

cout<<T<<' '<<R<<endl; //Вsвод двух слов State University

// эти два слова остались во входном потоке

// они заносятся в переменные Т и R и выводятся

}

Программа 2

Функции cin.get(), cin.getline().

//arb2015_get_getline

#include <iostream>

using namespace std;

void main()

{

const int n=30;

char S[n];

cout<<" new line ch= "<<(int)'\n'<<endl;//10

cout<<" 0-symbol ch= "<<(int)'\0'<<endl;//0

cout<< "enter S1="<< endl;

cin.getline(S,n); //Ввод строки Kazan State University

cout<<" S1="<<S<<endl; //Вывод Kazan State University

char V[]="abc";

cout<<"V= "<<V<<endl;// печатает abc

cout<<V[0]<<V[1]<<V[2]<<(int)V[3]<<endl;

// печатает abc0

}

Метод getline считывает из входного потока n-1 символов

или менее ( если символ перевода строки встретится раньше) и записывает их в строковую переменную S. Символ перевода строки тоже считывается (удаляется) из входного потока, но не записывается в строковую переменную, вместо него размещается

завершающий 0.

Если в строке исходных данных более n-1 символов, следующий ввод будет выполняться из той же строки , начиная с первого несчитанного символа

//arb2015_cinget_get

#include <iostream>

using namespace std;

void main()

{

const int n=30;

char S[n];

cout<<"enter string s= ";

cin.get(S,n);

cout<<" S= "<<S<<endl;

cin.get();

cout<<"enter string s= ";

cin.get(S,n);

cout<<" S= "<<S<<endl;

}

cout << "enter S2=" << endl;

Никогда не обращайтесь к разновидности метода get с двумя аргументами два раза подряд, не удалив \n из входного потока

/После каждого использования cin.get(S,n)

необходимо очищать входной поток от символа начало новой строки, который не снимается функцией cin.get(S,n) при считывании этого символа на экране появляется пустая строка

Во входном потоке остается \n символ новой строки; для того чтобы , снять с потока символ новой строки,

необходимо применить функцию cin.get() без формальных

параметров

Обработка символьной информации.

Задача 1

Задана символьная строка, содержащая

фамилию , имя и отчество.

Создать три символьные строки , содержащие

отдельно фамилию, имя и отчество.

//arb2015_fio_srring

#include <iostream>

#include<string.h>

using namespace std;

const int n=80;

void main()

{

char a[n],b[n],c[n],d[n];

cout<<" enter fio=";

cin.getline(a,n);

cout<<"a="<<a<<endl;

int i,j;

for( i=0;a[i]!=' ';i++)

b[i]=a[i];

b[i]='\0';

i++; j=0;

while(a[i]!=' ')

{

c[j]=a[i];

i++;

j++;

}

c[j]='\0';

i++;

j=0;

while(a[i]!='\0')

{

d[j]=a[i];

i++; j++;

}

d[j]='\0';

cout<<"b="<<b<<endl;

cout<<"c="<<c<<endl;

cout<<"d="<<d<<endl;

}

Задача 2

Вывод введенной строки символов в обратном порядке.

Ввод строки в массив.

//arb2014_gusen_8_1

#include <iostream>

using namespace std;

void main()

{

char str[20];

int i,n;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

// Символ ‘\0’ – признак конца строки.

for(n=0; str[n]!='\0'; n++);

for(i=n-1; i>=0 ;i--)

cout << str[i]; // Посимвольный вывод строки.

cout << endl;

}

Задача 3

Вывод введенной строки символов в обратном порядке.

Ввод строки в массив.

Второй вариант программы с использованием библиотеки

работы со строками символов – string.

//arb2014_gusen_8_2

#include <iostream>

#include <cstring>

using namespace std;

void main()

{

char str[20];

int i,n;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

n = strlen(str);

for(i=n-1; i>=0 ;i--)

cout << str[i]; // Посимвольный вывод строки.

cout << endl;

}

Задача 4

Исключить из строки все символы, не являющиеся

буквами. Ввод строки в массив.

//arb2014_gusen_8_3

#include <iostream>

#include <cstring>

using namespace std;

void main()

{

const m=30;

char str[m];

int n;

bool fl=true;

cout << "Enter string :";

cin >> str; ; // Можно ввести не более 29 символов.

for (int i=0; str[i] != '\0'; i++)

if ( str[i]>='a' && str[i]<= 'z' || str[i]>='A' && str[i]<= 'Z')

cout << str[i];

cout << endl;

}

Задача 5

Определить, является ли введенное слово полиндромом.

Ввод строки в массив.

//arb2014_gusen_8_4

#include <iostream>

using namespace std;

void main()

{

const m = 20;

char str[m];

int i,n;

bool fl = true;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

// Символ ‘\0’ – признак конца строки.

for(n=0; str[n]!='\0'; n++);

for(i=0; i<n/2 && fl ;i++)

if (str[i] != str[n-i-1])

fl = false;

cout << (fl ? "Polindrom" : "Non polindrom")<<endl;;

}

Задача 6

Сортировка слова в лексикографическом порядке

методом “пузырька”.

Ввод строки в массив.

//arb2014_gusen_8_5

#include <iostream.>

using namespace std;

const m=20;

void main()

{

char str[m], k;

int i,j,n;

bool fl = true;

cout << "Enter string:";

cin >> str; // Можно ввести не более 19 символов.

// Подсчет количества символов в строке.

// Символ ‘\0’ – признак конца строки.

for(n=0; str[n]!='\0'; n++);

for(i=0;i<n && fl;i++)

{

fl = false;

for(j=0;j<n-i-1;j++)

if (str[j] > str[j+1])

{

k=str[j];

str[j]= str[j+1];

str[j+1] = k;

fl = true;

}

}

cout << str << endl;

// Вывод С-строки (последний символ - ‘\0’)

}

Задача 7

Дан текст, состоящий из слов, разделенных пробелами и

заканчивающийся точкой.

Вывести на экран этот текст, печатая каждое слово в обратном

порядке.

Чтение производится в буфер (массив) по одному слову.

Длина каждого слова не должна превышать 29 символов.

//arb2014_gusen_8_6

#include <iostream>

#include <cstring> // Библиотека С-строковых функций (‘\0’)

using namespace std;

void main()

{

char buf[30];

int n;

bool fl=true;

cout << "Enter text :";

while(fl)

{ cin >> buf; // Чтение слова в массив.

n = strlen(buf); // Возвращает кол-во символов в строке.

if (buf[n-1] == '.')

{ n--;

fl=false;

}

for (int i=n-1; i>=0; i--)

cout << buf[i];

if (fl)

cout << ' ';

}

cout << '\n';

}

Задача 8

Дан текст, состоящий из слов, разделенных пробелами и

заканчивающейся точкой. Подсчитать, сколько слов содержит

ровно две буквы m.

Посимвольный ввод входного текста.

Длина слов не не ограничена.

Функция get() вводит очередной символ из входного потока

и возвращает его в качестве своего значения.

Функция get(f) вводит символ в переменную f.

//arb2014_gusen_8_7

#include <iostream>

using namespace std;

void main()

{

char symb;

int count_word=0,count_let=0;

cout << "Enter text:";

symb=cin.get(); // Ввод символа (в том числе и пробела)

while (symb != '.')

{

if (symb==' ')

{

if (count_let==2) count_word++;

count_let=0;

}

else

if (symb=='m') count_let++;

symb=cin.get(); // Экв. cin.get(symb);

}

if (count_let==2) count_word++;

cout << "Word count = " << count_word << '\n';

}

// Другой вариант решения:

// Заголовок цикла while ((symb=cin.get()) != '.') и

// удалить операторы symb=cin.get();

Задача 9

Дан текст, состоящий из строк и заканчивающейся пустой

строкой (‘\n’). Если последний символ строки цифра N, то

первые N символов строки заменить символом &.

Функция getline(buf,size,symb) читает символы из входного

потока, пока не встретится символ symb (включая и его).

Будет прочитано size-1 символов, если symb не встретится.

Вместо symb (или в конце строки) подставляется ‘\0’.

Результат чтения помещается в массив buf.

и возвращает его в качестве своего значения.

//arb2014_gusen_8_8

#include <iostream>

#include <string>

using namespace std;

void main()

{

const size=100;

char buf[size];

int n,i,lstr;

cout << "Enter text:\n";

while(1)

{

cin.getline(buf, size, '\n');

if (buf[0] == '\0')

break;

lstr=strlen(buf);

if (buf[lstr-1] >= '1' && buf[lstr-1] <= '9') // Если цифра.

n = buf[lstr-1] - '0';

else

n = 0;

for(i=0; i<n && i<lstr; i++)

buf[i] = '&';

cout << "Result :" << endl << buf <<endl;

cout<< "Enter new line or press 'Enter' :"<<endl;

}

}

Задача 10

Подсчитать количество строк, введенных с экрана терминала.

Ввод конца файла с экрана терминала: <Ctrl>z в первой позиции

новой строки и <Enter>

Функция read(buf, size) читает в массив buf или size символов,

или меньшее количество.

Если читается конец файла, то функция gcount() возвращает количество прочитанных символов.

//arb2014_gusen_8_9

#include <iostream>

#include <cstring>

using namespace std;

void main()

{

const size=10;

char buf[size];

int n,i,count=0;

cout << "Enter text:"<<endl;

while(!cin.eof())

{

cin.read(buf, size);

n=cin.gcount();

for(i=0; i<n; i++)

if(buf[i]=='\n')

count++;

}

cout << "Number of line =" << count <<'\n';

}

Лекция №11

Библиотечные функции обработки строк

Операции над строками

Для строк не определена операция присваивания,

поскольку строка является не основным типом данных,

а массивом.