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

  2. Strncpy()

Формат strcpy(to, from)- копирует содержимое строки from в строку to.

to по длине не меньше from.

Присваивание выполняется с помощью функций стандарной библиотеки

или посимвольно "вручную" (что менее предпочтительно,

так как чревато ошибками)

Например, чтобы присвоить строке to строку from, можно воспользоваться функциями strcpy или strncpy:

Функция strcpy(to,from) копирует все символы строки,

yказанной вторым параметром (from), включая завершающий 0, в строку, указанную первым параметром (to).

Функция strncpy(to,from,n) выполняет то же самое, но не более n символов, то есть числа символов ,указанного третим параметром. Если нуль-символ в исходной строке встртится раньше, копирование прекращается, а оставшиеся до n символы строки to заполняются нуль-символами. В противном случае (если n меньше или равно длине строки from) завершающий нуль-символ в to не добавляется.

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

  1. Strcat()

Формат strcat(s1, s2)-присоединяет строку s2 к концу строки s1.

Примечание строка s2 не меняется.

  1. Strcmp()

Формат strcmp (s1, s2)- сравнивает s1 с s2( лексико-графический)

s1 =s2 функция возвращает 0

s1 >s2 функция возвращает положительное значение

s1 <s2 функция возвращает отрицательное значение

  1. Strclen()

strclen(s) – возвращает количество символов , не считая

Программист должен сам заботиться о том , чтобы в строке-приемнике хватило места для строки-источника ( в данном случае при выделении памяти значение переменной m должно быть больше или равно 100), и о том, чтобы строка всегда имела завершающий нуль-символ.

____________________________________________

Внимание

Выход за границы строки и отсутствие нуль-символа являются распространенными прчинами ошибок в программах обработки строк.

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

// Never trouble trouble, till trouble troubles you

// Никогда не беспокойте проблему , пока проблема не //беспокоит Вас

//arb2009_stroka6_1

#include<iostream.h>

#include<string.h>

void main()

{

int m;

char a[100] = "Never trouble trouble";

cout<<"Enter length of string m= ";

cin>>m;

char *p = new char[m];

strcpy(p,a);

cout<<"String p= "<<p<<endl;

char b[100] = "Good day!";

strncpy(p,b,strlen(b)+1);

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

}

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

Если задать m=20, то напечатается

"Never trouble trouble" и

"Good day!" и нет никаких сообщений

Если задать m=3, то напечатается

"Never trouble trouble" и

"Good day!" и

сообщения об ошибке и "приложение будет закрыто"

хотя под строку p было выделено 3 байта

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

// Never trouble trouble, till trouble troubles you

//Никогда не беспокойте проблему, пока проблема не //беспокоит Вас

//arb2014_basic_functions

#include<iostream.h>

#include<string.h>

void main()

{

int m;

char a[100] = "Never trouble trouble";

cout<<"Enter length of string m= ";

cin>>m;

char *p= new char[m];

strcpy(p,a);

cout<<"length p="<<strlen(p)<<endl;

cout<<"String p= "<<p<<endl;

char b[100] = "Good day!";

strncpy(p,b,strlen(b)+1));

cout<<"String p= "<<p<<endl;

}

Комментарии.

Введем m=30 и m=3 для первой функции

strcpy(p,a);

cout<<"length p="<<strlen(p)<<endl;

//длина всегда 30 (?)

//arb2009_stroka5_1

#include<iostream.h>

#include<string.h>

void main()

{

char a[100] = "Never trouble trouble";

int m;

cout<<"Enter length of string m= ";

cin>>m;

char *p = new char[m];

char *q = new char [m];

strcpy(p,a);

cout<<"String p= "<<p<<endl;

char b[100] = "Good day!";

strncpy(p,b,3);

cout<<"String p= "<<p<<endl;

strncpy(q,b,3);

cout<<"String q= "<<q<<endl;

}

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

Если введем m=3

оператор:

strcpy(p,a);

cout<<"String p= "<<p<<endl;

результат:

String p= Never trouble trouble;

операторы:

char b[100] = "Good day!";

strncpy(p,b,3);

cout<<"String p= "<<p<<endl

результат:

String p= Gooer trouble trouble;

операторы

strncpy(q,b,strlen(b)+1);

cout<<"String q= "<<q<<endl;

результат

String p= "Good day!";

и сообщение об ошибке

Если введем m=10

Все тоже самое, но нет сообщения об ошибке

Указатель p адресует память, в которую скопировали

строку "Never trouble trouble".

Теперь туда же снова копируем новую строку

"Good day!", но только из этой строки берем 3 символа

Поскольку в этих 3 символах не встречается нуль-символ,то печать строки продолжается до нуль-символа , который был поставлен первый раз.

Будет напечатано Gooer trouble trouble

p |.|------->| Never trouble trouble\0 |

Nev заменяется Goo

p |.|------->| Gooer trouble trouble\0 |

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

Функции преобразования

Для преобразования строки в целое число используется функция atoi(str).Функция преобразует строку, содержащую символьное представление целого числа, в соответствующее целое число.

Признаком конца числа служит первый символ, который не может быть интерпретирован как принадлежащий числу.

Если преобразование не удалось возвращает 0.

Аналогичные функции преобразования строки в длинное целое число (long) и в вещественное число с двойной точностью (double) называются atol и atof соответственно.

Пример

//arb2009_stroka7_1

#include<iostream>

#include<cstring>

#include<cstdlib>

using namespace std;

void main()

{

char a[]= "10) Height-162sm, weight-59.55 kg";

int num;

long height;

double weight;

num = atoi(a);

height = atol(&a[11]);

weight = atof(&a[25]);

cout<<num<<' '<<height<<' '<<weight<<endl;

}

Печатает 10 162 59.55

Демонстрация функций

Программа 1

//arb2014_demostr_functions_Cstring

#include <iostream.h>

#include <string>

#include <ctype.h>

using namespace std;

void main()

{

char s1[30], s2[30];

strcpy(s1,"C++");

strcpy(s2," is power language!");

cout<<"Length of string s1="<<strlen(s1)<<endl;

cout<<"Length of string s2="<<strlen(s2)<<endl;

if (!strcmp(s1,s2)) cout<<"This strings are equals"<<endl;

else cout<<"This strings are not equals"<<endl;

strcat(s1,s2);

cout<<"s1= strcat(s1,s2); s1= "<<s1<<endl;

strcpy(s2,s1);

cout<<"s2=strcpy(s2,s1) s2="<<s2<<endl;

if (!strcmp(s1,s2)) cout<<"This strings are equals"<<endl;

else cout<<"This strings are not equals"<<endl;

cout<<"enter s1=";

cin>>s1;

s1[0]='A';

cout<<"s1[0]='A' s1= "<<s1<<endl;

int i;

for (i=0;s1[i];i++)

s1[i]= toupper(s1[i]);

cout<<"Upper s1="<<s1<<endl;

for (i=0;s1[i];i++)

s1[i]= tolower(s1[i]);

cout<<"Lower s1="<<s1<<endl;

}

Программа 2

Подсчитать число вхождений строки t в строке u

Удалить все вхождения подстроки t в строке u

В строке u заменить все вхождения подстроки t на подстроку s

//arb2009_string_substring_fun3

#include<iostream.h>

#include<string.h>

//#include<stdio.h>

// get() <stdio.h>

const int n=100;

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

void strcpy1(char s[n], char t[n])

{

int i=0;

while((s[i]=t[i])!='\0')i++;

}

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

// string s is substring of p;

bool strstr1(char s[n],char p[n])

{

int i,j;

bool t=false;

for (i=0;i<strlen(p)-strlen(s)+1 &&!t;i++)

{

bool r=true;

for (j=0;j<strlen(s)&&r;j++)

if (s[j]!=p[i+j]) r=false;

t=r;

}

return t;

}

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

// position substring s in string p;

int strstr2(char s[n],char p[n])

{

int i,j;

int pos=-1;

bool t=false;

for (i=0;i<strlen(p)-strlen(s)+1&&!t;i++)

{

bool r=true;

for (j=0;j<strlen(s)&&r;j++)

if (s[j]!=p[i+j]) r=false;

t=r;

}

if (t) pos=i-1;else pos=-1;

return pos;

}

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

void conc(char x[n], char y[n])

{

int i,j;

int p=strlen(x);

int q=strlen(y);

i=p;

j=0;

while ((x[i]=y[j])!='\0'){j++;i++;}

}

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

void delette(char x[n],int pos,int len )

{

int i,j;

if (pos>strlen(x)-len)

{

cout<<"impossible!"<<endl;

return;

}

j=pos; i=pos+len;

while ((x[j]=x[i])!='\0')

{

i++;j++;

}

}

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

// insert string y[n] to string x[n]

// with position pos in x[n]

void insert(char y[n],int pos, char x[n])

{

if (pos==strlen(x))

{

conc(x,y); return;

}

if ((pos>strlen(x))||(pos<0))

{

cout<<" impossible!! ";

return;

}

char z[n],m[n];

int i,j;

i=0;

j=pos;

while ((z[i]=x[j])!='\0')

{

i++;j++;

}

strcpy1(m,y);

conc(m,z);

i=pos;

j=0;

while ((x[i]=m[j])!='\0')

{

i++;j++;

}

}

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

void main()

{

char t[n];

int pos;

char u[n],s[n];

int p;

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

cout<<"Task 1"<<endl;

cout<<" calculate number of substr t in str u"<<endl;

cout<<" Enter string u= "<<endl;

cin.getline(u,n);

cout<<" Enter substring t t= "<<endl;

cin.getline(t,n);

p=0;

while (strstr2(t,u)!=-1)

{

u[strstr2(t,u)]='#';

p++;

}

cout<<"u = "<<u<<endl;

cout<<"number of input substring t in string u p= "<<p<<endl;

cin.get();

cout<<"reconstruction u"<<endl;

int i=0;

while (i<strlen(u))

{

if (u[i]== '#') u[i]=t[0];

i++;

}

cout<<"u = "<<u<<endl;

cin.get();

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

cout<<"Task 2"<<endl;

cout<<"delete substring t in string u"<<endl;

while (strstr2(t,u)!=-1)

{

delette(u,strstr2(t,u),strlen(t));

}

cout<<"new u = "<<u<<endl;

cin.get();

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

cout<<"Task3"<<endl;

cout<<"in string u change substring t on substring s"<<endl;

cout<<" Enter string u= "<<endl;

cin.getline(u,n);

cout<<" Enter string t= "<<endl;

cin.getline(t,n);

cout<<" Enter string s= "<<endl;

cin.getline(s,n);

if (strstr2(t,u)==-1)

{

cout<<" string t is not substring of string u:

error!!"<<endl;

return ;

}

while (strstr2(t,u)!=-1)

{

p=strstr2(t,u);

cout<<"p= "<<p<<endl;

delette(u,p,strlen(t));

cout<<" after delete new string u = "<<u<<endl;

cout<<"length u= "<<strlen(u)<<endl;

cin.get();

insert(s,p,u);

cout<<"after insert new u = "<<u<<endl;

cout<<"len u= "<<strlen(u)<<endl;

cin.get();

}

cout<<"new u = "<<u<<endl;

cin.get();

}

Лекция №12

Файловый ввод-вывод

Потоки С++

Принципиальным для понимания С++-системы ввода-вывода является то что она опирается на понятие потока. Поток (stream)

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

В самой общей форме поток можно назвать логическим интерфейсом с файлом. С++ -определение термина «файл» можно отнести к дисковому файлу, экрану, клавиатуре, порту, файлу на магнитной ленте и пр. Хотя файлы отличаются по форме и возможностям , все потоки одинаковы.

Поток связывается с файлом при выполнении операции открытия файла и отсоединяется от него с помощбю операции закрытия.

Существуют два вида потоков текстовый и двоичный. Текстовый поток используется для ввода-вывода символов. При этом может происходить некоторые преобразования символов. Например, при выводе символ новой строки может быть преобразован в последовательность символов: возврата каретки и перехола на новую строку. Поэтому может не быть взаимно- однозначного соответствия между тем , что посылается в поток и тем что в действительности записывается в файл.

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

Говоря о потоках , необходимо понимать , что , что вкладывается в понятие «текущая позиция». Текущая позиция- это место в файле , с которого будет выполняться следующая операция доступа к файлу. Например, если длна файла равна 100 байт, и известно, что уже прочитана половина этого файла, то слежующая операция чтения произойдет на байте 50 , который в данном случае и является текущей позицией.

Встроенные С++-потоки

В С++ содержится ряд встроенных потоков (cin, cout, cerr, clog), которые автоматически открываются , как только программа начинает выполняться. cin – стандартный входной , а cout – стандартный выходной поток. Потоки cerr и clog предназначены для вывода информации об ошибках. По умолчанию стандартные С++- потоки связываются с консолью..

Как открыть и закрыть файл.

Чтение и запись текстовых файлов.

Лекция

Текстовые файлы (продолжение )

Задача 1.

Задан файл (.txt) целых чисел.

Записать его в другой файл , используя функцию eof()

//arb2014_file1

#include<fstream>

#include<iostream>

using namespace std;

void main()

{

ifstream in("arb.txt");

ofstream out("out.txt");

ofstream out1("out1.txt");

int x;

cout<<"file in"<<endl;

if(!in)

{

cout<<"can't open file!"<<endl;

exit(-1);

}

cout<<"file in:"<<endl;

out<<"file in:"<<endl;

out1<<"file in:"<<endl;

while(!in.eof())

{

in>>x;

cout<<"!in.eof()= "<<!in.eof()<<" "<<x<<endl;

out1<<"!in.eof()= "<<!in.eof()<<" "<<x<<endl;

out<<x<<' ';

}

out<<endl; out1<<endl;

out1.close(); out.close(); in.close();

cout<<endl;

}

File in(“arb.txt”)

1 2 3 4 5 6 7 8 9 10 11

File out(“out.txt”)

file in:

1 2 3 4 5 6 7 8 9 10 11

File out1(“out1.txt”)

file in:

!in.eof()= 1 1

!in.eof()= 1 2

!in.eof()= 1 3

!in.eof()= 1 4

!in.eof()= 1 5

!in.eof()= 1 6

!in.eof()= 1 7

!in.eof()= 1 8

!in.eof()= 1 9

!in.eof()= 1 10

!in.eof()= 0 11

Задача 2.

Задан файл (.txt) целых чисел.

Разбить его на два файла , содержащие четные и нечетные числа

//arb2014_file2

#include<fstream>

#include<iostream>

using namespace std;

void main()

{

ifstream in("arb.txt");

ofstream out2("out2.txt");

ofstream out1("out1.txt");

int x;

if(!in)

{

cout<<"can't open file!"<<endl;

exit(-1);

}

out1<<"file odd numbers:"<<endl;

out2<<"file even numbers:"<<endl;

while(!in.eof())

{

in>>x;

if (x%2) out1<<x<<’ ‘;else out2<<x<<’ ‘;

}

out1<<endl; out2<<endl;

out1.close(); out2.close(); in.close();

}

arb.txt

1 2 3 4 5 6 7 8 9 10

out1.txt

file odd numbers:

1 3 5 7 9

out1.txt

file even numbers:

2 4 6 8 10

Задача 3.

Задан файл (.txt) целых чисел.

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

//arb2014_file3

#include<fstream>

#include<iostream>

using namespace std;

void create_file(ifstream &f, ofstream &g1, ofstream &g2)

{

int x;

if(!f)

{

cout<<"can't open file!"<<endl;

exit(-1);

}

g1<<"file odd numbers:"<<endl;

g2<<"file even numbers:"<<endl;

while(!f.eof())

{

f>>x;

if (x%2) g1<<x<<’ ‘;else g2<<x<<’ ‘;

}

g1<<endl; g2<<endl;

}

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

void main()

{

ifstream in("arb.txt");

ofstream out2("out2.txt");

ofstream out1("out1.txt");

create_file(in,out1,out2);

out1.close();

out2.close();

in.close();

}

Задача 4.

Задан файл (.txt) целых чисел.

Разбить его на два файла , содержащие четные и нечетные числа и найти max (с помощью функций).

//arb2014_file4

#include<fstream>

#include<iostream>

using namespace std;

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

void create_file(ifstream &f, ofstream &g1, ofstream &g2)

{

int x;

if(!f)

{

cout<<"can't open file!"<<endl;

exit(-1);

}

while(!f.eof())

{

f>>x;

if (x%2) g1<<x<<’ ‘;else g2<<x<<’ ‘;

}

g1<<endl; g2<<endl;

}

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

int max(ifstream &f)

{

int x,m;

if(!f)

{

cout<<"can't open file!"<<endl;

exit(-1);

}

f>>m;

while(!f.eof())

{

f>>x;

if (m<x) m=x;

}

return m;

}

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

void main()

{

ifstream in("arb.txt");

ofstream out2("out2.txt");

ofstream out1("out1.txt");

create_file(in,out1,out2);

out1.close();

out2.close();

in.close();

ifstream in1(“out1.txt”); ifstream in2(“out2.txt”);

cout<<”max odd= “<<max(in1)<<endl;

cout<<”max even= “<<max(in2)<<endl;

in1.close();in2.close();

}

}

Пример 1.

#include <iostream.h>

#include <fstream.h>

const int n=10;

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

{

int i,j;

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

for (j=0; j<k; j++)

f>>x[i][j];

}

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

{

int i,j;

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

{

for (j=0; j<k; j++)

f<<a[i][j]<<’ ’;

f<<endl;

}

}

void mult (int **x, int**y, int**z, int n)

{

int i, j, k;

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

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

{

z[i][j]=0;

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

z[i][j]=z[i][j]+x[i][k]*y[k][j];

}

}

void main()

{

int a[n][n], b[n][n],c[n][n];

ifstream in1(“in.txt”);

//связь логического имени файла с физическим.

// Открытие файла для чтения

ifstream in2(“in2.txt”);

ofstream out(“out.txt"); //открываем файл для записи

create(in,a,n);

create(in2,b,n);

in1.close();

in2.close();

// закрытие файлов- ОБЯЗАТЕЛЬНО!

mult(a,b,c,n);

show(out, c,n);

out.close();

}

Таблица успеваемости факультета ВМК

Session results on faculty of computer science(VMK)

perfect

good

satisfy

poor

first

2

3

4

5

second

2

3

3

3

third

3

3

3

3

fourth

4

4

4

4

fifth

5

5

5

5

Total:

Двумерный массив данных

Массив Total

Массив строки

Массив курсов

Массив оценок

Данные во входном файле

Session results on faculty of computer science

Perfect good satisfy poor

2 3 4 5

2 3 3 3

3 3 3 3

4 4 4 4

5 5 5 5

#include<iostream>

#include<iomanip>

#include<fstream>

#include<cstring>

using namespace std;

const int numberCourse=5;

const int numberMark=4;

const int lengthIndent=7;// длина абзаца

const int lengthTable=56;// длина таблицы

const int lengthColumn=10;// длина колонки

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

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

cout.width(n);

cout<<"*";

cout.width(lengthColumn+1);

cout<<"*";

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

{

cout.width(lengthColumn+1);

cout<<'*';

}

cout<<endl;

}

void main()

{

char name_Course[numberCourse][15];

char name_Mark[numberMark][20];

int number_Student[numberCourse][numberMark];

char name_Faculty[80];

int Total[numberMark];

ifstream in("arb.txt");

ofstream out("vmk.txt");

int i,j;

in.getline(name_Faculty,80);

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

in>>name_Course[i];

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

in>> name_Mark[i];

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

for (j=0;j<numberMark;j++)

in>> number_Student[i][j];

/*

cout<<name_Faculty<<endl;

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

cout<<name_Course[i]<<" ";

cout<<endl;

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

cout<< name_Mark[i]<<" ";

cout<<endl;

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

{

for (j=0;j<numberMark;j++)

cout<<number_Student[i][j]<<" ";

cout<<endl;

}

*/

cout<<endl<<endl;

cout.width( lengthTable + 4 );

cout<<name_Faculty<<endl;

cout<<endl<<endl;

star(lengthIndent+1,lengthTable);//

star1(lengthIndent+1);

cout.width(lengthIndent+1);

cout<<"*";

cout.width(lengthColumn+1);

cout<<"*";

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

{

cout<<" "<<name_Mark[i];

cout.width(lengthColumn-strlen(name_Mark[i]));

cout<<"*";

}

cout<<endl;

star1(lengthIndent+1);

star(lengthIndent+1,lengthTable);

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

{

star1(lengthIndent+1);

cout.width(lengthIndent+1);

cout<<"*";

cout<<" "<<name_Course[i];

cout.width(lengthColumn-strlen(name_Course[i]));

cout<<"*";

for(j=0;j<numberMark;j++)

{ cout<<setw(6)<<number_Student[i][j];

cout<<setw(5);

cout<<"*";

}

cout<<endl;

star1(lengthIndent+1);

star(lengthIndent+1,lengthTable);

}

for(j=0;j<numberMark;j++)

{

Total[j]=0;

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

Total[j]+=number_Student[i][j];

}

star(lengthIndent+1,lengthTable);

star1(lengthIndent+1);

cout.width(lengthIndent+1);

cout<<"*"<<" Total *";

for(j=0;j<numberMark;j++)

{ cout<<setw(6)<<Total[j];

cout<<setw(5);

cout<<"*";

}

cout<<endl;

star1(lengthIndent+1);

star(lengthIndent+1,lengthTable);

cout<<endl;

}

Лекция №12

Форматирование

4 функции

Создать массив ( целый и вещественный ) в зависимости от флагов форматирования

#include <iostream.h>

#include <iomanip.h> //манипуляторы

#include <fstream.h>

const int n=10;

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

void create(ifstream&f, double x[n]); // перегрузка функции create

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

void show(ofstream&f, double x[n], int k); // перегрузка функции show

void main()

{

ifstream in1(“in1.txt”);

ifstream in2(“in2.txt”);

ofstream out1(“out1.txt”);

ofstream out2(“out2.txt”);

out1.setf( ios::left); //установить флаг форматирования

out1.setf( ios::show pos) ;

out1.setf( ios::oct);

out1.unset( ios::oct);

out1.setf( ios::right);

out2.setf( ios::saentific);

// saentific-плавающая точка; fixed-фиксированная точка

out2.unset( ios:: saentific);

//установка точности

out2. precision(2);

double b[n];

int a[n];

create (in1,a);

in1.close();

show(out1,a);

out1.close();

create (in2,b,20);

in2.close();

show(out2,b,20);

out2.close();

}

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

{int i;

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

f>>x[i];

}

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

{int i;

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

f>>x[i];

}

void show(ifstream&f, int x[n], int k)

{ int i;

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

{ f. width(k);

f.fill(‘#’);

f<<x[i]<<endl;

}

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

{ int i;

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

{ f. width(k);

f.fill(‘#’);

f<<x[i]<<endl;

}

Файловый ввод-вывод.

Задача 1

// Поиск минимального элемента в массиве.

// Ввод массива из файла fstream.h

// Вывод на экран iostream.h

#include <iostream.h>

#include <fstream.h>

void main()

{

int i, min, mas[10];

ifstream myin("test.txt"); //Открытие файла для ввода.

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

myin >> mas[i];

min=mas[0];

for(i=1;i<10;i++)

if (mas[i]<min)

min=mas[i];

cout << "min = " << min << '\n';

}

Задача 2

// Приближенное вычисление 1/x

// Последовательности {ак} и {вк} заданы рекуррентно: а0 =1,

// в0=1-х; (0<x<2)

// ак= ак-1(1+вк-1), вк=в2к-1, к=1,2,…

// Вычислить аn для наименьшего n, при котором вn ≤ ∂ (∂>0).

// Ввод значения переменной х с экрана iostream.h

// Вывод всех членов последовательностей a и b,

// а также результата в файл fstream.h

#include <iostream.h>

#include <fstream.h>

const double eps= 0.001;

void main()

{

double a=1, b, x;

ofstream myout("result.txt"); //Открытие файла для вывода.

cout << "Enter x:";

cin >> x;

if (x<=0 || x>=2)

cout << "not decision";

else

{

b=1-x;

do

{

a=a*(1+b);

b=b*b;

myout << "a = " << a << " b = " << b << endl;

}

while(b>eps);

myout << "1/x=" << a << endl;

cout<<Проверка Вычислений "<< 1/x <<endl;;

}

}

Задача 3

// Запись вектора в обратном порядке

// Файловый ввод-вывод fstream.h

#include <fstream.h>

const int SIZE= 9;

void main()

{

int i, k, mas[SIZE];

ifstream myin("test.txt"); //Открытие файла для ввода.

ofstream myout("result.txt"); //Открытие файла для вывода.

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

myin >> mas[i];

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

{

k=mas[i];

mas[i]= mas[SIZE-i-1];

mas[SIZE-i-1] = k;

}

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

myout << mas[i] << " ";

cout<<endl;

}

Задача 4

// Транспонирование матрицы.

// Файловый ввод-вывод fstream.h

#include <fstream.h>

void main()

{

int i, j;

const int n = 4;

double b[n][n], x;

ifstream myin("test.txt"); //Открытие файла для ввода.

ofstream myout("result.txt"); //Открытие файла для вывода.

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

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

myin >> b[i][j];

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

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

{

x = b[i][j];

b[i][j] = b[j][i];

b[j][i] = x;

}

myout << "Транспонированная матрица :”<<endl;

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

{

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

myout << b[i][j] << ' ';

myout << endl; // Построчный вывод матрицы.

}

}

Задача 5

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

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

не более SIZE символов.

*/

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

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

// Файловый ввод-вывод fstream.h

#include <fstream.h>

#include <string.h>

const int SIZE =30;

void main()

{

char buf[30];

int n, len=0;

ifstream myin("text.txt");

ofstream myout("result.txt");

myin >> buf;

while( !myin.eof() )

{

n = strlen(buf);

if (len+n <= SIZE)

len=len+n+1;

else

{

len=n+1;

myout << '\n';

}

myout << buf << ' ';

myin >> buf;

}

}

Задача 6

/* В упакованном представлении текста – цифра “К” означает

К-кратное повторение следующей за ним буквы. Например,

текст “3bc3a” интерпретируется как ”bbbcaaa”.

Выполнить распаковку текста, считая, что символы символы- цифры рядом не встречаются.

*/

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

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

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

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

// Функция put(f) вводит символ f в выходной поток.

// Файловый ввод-вывод.

#include <fstream.h>

void main()

{

char symb;

int n, i;

ifstream myin("text.txt");

ofstream myout("result.txt");

symb=myin.get();

while( !myin.eof() )

{

if ( symb >='0' && symb <='9')

{

n = symb - '0';

symb=myin.get();

if (!myin.eof() )

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

myout.put(symb);

}

else

myout.put(symb); // Вывод символа в файл.

symb=myin.get();

}

}

Задача 7

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

В каждой строке текста первое и последнее слово поменять

местами.

*/

#include <fstream.h>

#include <string.h>

void main()

{

const size=81; // Длина строки не более 80 символов.

char buf[size];

int n, i;

int first; // Позиция начала первого слова строки

int count_first; // Кол-во символов первого слова

int last; // Позиция окончания последнего слова

int count_last; // Кол-во символов последнего слова

ifstream myin("text.txt"); // Открытие файла для ввода

ofstream myout("result.txt"); // Открытие файла для вывода

while( !myin.eof() )

{ // Чтение строки в буфер

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

n=strlen(buf); // n – кол-во символов в buf (без ‘\0’)

// Вывод начальных пробелов строки

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

if(buf[i]==' ')

myout.put(buf[i]);

else

break;

if(buf[i]=='\0') // Если пустая строка

{

myout.put('\n');

continue; // Переход к следующей итерации цикла

}

first=i; // Позиция начала первого слова строки

count_first=1;

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

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

if(buf[i]!=' ' && buf[i]!='\0')

count_first++;

else

break;

// Пропуск пробелов в конце строки

for(i=n-1; i>=0 && buf[i]==' '; i--);

last=i; // Позиция окончания последнего слова строки

count_last=0;

// Подсчет кол-ва символов в последнем слове

for(i=last; i>=0; i--)

if(buf[i]!=' ')

count_last++;

else

break;

// Если в строке только одно слово

if(first+count_first > last-count_last)

myout << buf << '\n'; // Вывод всей строки без изменений

else

{ // Вывод последнего слова

for(i=last-count_last+1; i<=last; i++)

myout.put(buf[i]);

// Вывод “середины” строки

for(i=first+count_first; i<=last-count_last; i++)

myout.put(buf[i]);

// Вывод первого слова

for(i=first; i<first+count_first; i++)

myout.put(buf[i]);

myout << '\n';

}

}

}

Задача 8

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

#include <fstream.h>

#include <iostream.h>

const int SIZE=512;

void main()

{

int nl=0; // Кол-во строк

int nw=0; // Кол-во слов

int nc=0; // Кол-во символов

int n,i;

char buf[SIZE]; // Размерность физического блока на диске

bool inword=false; // Находимся в слове

ifstream myin("text.txt");

while( !myin.eof() )

{

myin.read(buf, SIZE); // Чтение в буфер

n=myin.gcount();

nc+=n;

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

{

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

++nl;

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

inword=false;

else

if (!inword)

{

inword=true;

++nw;

}

}

}

cout<<"Lines= "<<nl<<endl;

cout<<"Words= "<<nw<<endl;

cout<<"Symbols= "<<nc<<'endl;

}

Задача

#include <iostream.h>

#include <iomanip.h>

void main()

{

int a=904;

double b=905.906901;

cout<<setw(10)<<a<<endl;

cout<<setw(10)<<setioflags( ios::right)<<a<<endl;

cout<<setw(10)<< setfil(‘*’)<<a<<endl;

cout<<setw(10)<<setioflags( ios::left)<<b<<endl;

cout<<setw(10)<< setfil(‘*’)<<b<<endl;

}

Лекция

Файловый ввод и вывод (продолжение)

на примере печати таблицы

«Успеваемость на факультете ВМК»

//arb2009_table_file_VMK

#include<iostream.h>

#include<iomanip.h>

#include<fstream.h>

#include<string.h>

const int numberCourse=5;

const int numberMark=4;

const int lengthIndent=7;// длина абзаца

const int lengthTable=56;// длина таблицы

const int lengthColumn=10;// длина колонки

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

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

f.width(n);

f<<"*";

f.width(lengthColumn+1);

f<<"*";

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

{

f.width(lengthColumn+1);

f<<'*';

}

f<<endl;

}

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

void main()

{

char name_Course[numberCourse][15];

char name_Mark[numberMark][20];

int number_Student[numberCourse][numberMark];

char name_Faculty[80];

int Total[numberMark];

ifstream in("arb.txt");

ofstream out("vmk.txt");

int i,j;

in.getline(name_Faculty,80);

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

in>>name_Course[i];

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

in>> name_Mark[i];

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

for (j=0;j<numberMark;j++)

in>> number_Student[i][j];

in.close();

out<<endl<<endl;

out.width( lengthTable + 4 );

out<<name_Faculty<<endl;

out<<endl<<endl;

star(out,lengthIndent+1,lengthTable);//

star1(out,lengthIndent+1);

out.width(lengthIndent+1);

out<<"*";

out.width(lengthColumn+1);

out<<"*";

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

{

out<<" "<<name_Mark[i];

out.width(lengthColumn-strlen(name_Mark[i]));

out<<"*";

}

out<<endl;

star1(out,lengthIndent+1);

star(out,lengthIndent+1,lengthTable);

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

{

star1(out,lengthIndent+1);

out.width(lengthIndent+1);

out<<"*";

out<<" "<<name_Course[i];

out.width(lengthColumn-strlen(name_Course[i]));

out<<"*";

for(j=0;j<numberMark;j++)

{

out<<setw(6)<<number_Student[i][j];

out<<setw(5);

out<<"*";

}

out<<endl;

star1(out,lengthIndent+1);

star(out,lengthIndent+1,lengthTable);

}

for(j=0;j<numberMark;j++)

{

Total[j]=0;

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

Total[j]+=number_Student[i][j];

}

star(out,lengthIndent+1,lengthTable);

star1(out,lengthIndent+1);

out.width(lengthIndent+1);

out<<"*"<<" Total *";

for(j=0;j<numberMark;j++)

{

out<<setw(6)<<Total[j];

out<<setw(5);

out<<"*";

}

out<<endl;

star1(out,lengthIndent+1);

star(out,lengthIndent+1,lengthTable);

out<<endl;

}

Файл arb.txt

Session results on Faculty of Computer Science(VMK)

first second third fourth fifth

perfect good satisf poor

2 3 4 5

2 3 3 3

3 3 3 3

3 3 3 3

3 3 3 3

Файл vmk.txt

Session results on Faculty of Computer Science(VMK)

perfect

good

satisfy

poor

first

2

3

4

5

second

2

3

3

3

third

3

3

3

3

fourth

3

3

3

3

fifth

3

3

3

3

Total:

13

15

16

17

Лекция

Задана квадратная матрица из положительных целых чисел. Вычислить

op1(A), prime(SP(A[i][j]))

A=

op2(A), otherwise.

prime(SP(A[i][j])) – сумма( по i) произведение (по j) A[i][j]

есть простое число.

Операция op1(A)- транспонированная матрица A.

Операция op2(A) - i –ая строка матрицы A сдвигается циклически влево на 1 позицию, если она содержит число, сумма цифр, которого является простым число, и

сдвигается циклически вправо на 1 позицию, в противном случае.

//arb2015_mas_bool

#include<iostream>

#include<fstream>

#include<cmath>

using namespace std;

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

void create(ifstream &f,int** x, int n)

{

int i,j;

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

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

f>>x[i][j];

}

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

void show(ofstream &f,int** x, int n)

{

int i,j;

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

{

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

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

f<<endl;

}

}

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

int sum_cifr(int x)

{

int s=0;

while(x>0)

{

s=s+x%10;

x=x/10;

}

return s;

}

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

int sum_mult(int** x, int n)

{

int i,j;

int s=0;

int p;

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

{

p=1;

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

p=p*x[i][j];

s=s+p;

}

return s;

}

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

bool prime(int x)

{

int i;

if (x<=1) return false;

if(x==2)return true;

bool p=true;

for(i=2;i<=sqrt(x) && p;i++)

if (x%i==0)p=false;

return p;

}

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

bool f1(int**x, int n)

{

return prime(sum_mult(x,n));

}

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

bool f2(int*x, int n)

{

int j;

bool p=false;

for(j=0;j<n && !p;j++)

if (prime(sum_cifr(x[j]))) p=true;

return p;

}

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

void shift_left(int* x,int n)

{

int r,i;

r=x[0];

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

x[i]=x[i+1];

x[n-1]=r;

}

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

void shift_right(int* x,int n)

{

int r,i;

r=x[n-1];

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

x[i]=x[i-1];

x[0]=r;

}

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

void op1(int** x,int n)

{

int i,j;

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

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

{

int r=x[i][j];

x[i][j]=x[j][i];

x[j][i]=r;

}

}

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

void op2(int** x,int n)

{

int i;

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

if (f2(x[i],n)) shift_left(x[i],n);

else shift_right(x[i],n);

}

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

void main()

{

int n,i;

int** a;

ifstream in("arb.txt");

ofstream out("out.txt");

if(!in)

{

cout<<"can't open file!"<<endl;

exit(-1);

}

cout<<"enter size of array n=";

cin>>n;

a=new int*[n];

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

a[i]=new int[n];

create(in,a,n);

out<<"array a:"<<endl;

show(out,a,n);

if(f1(a,n))op1(a,n);else op2(a,n);

out<<" new array a:"<<endl;

show(out,a,n);

in.close();

out.close();

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

delete [] a[i];

delete []a;

}

Файл arb.txt

1 22 33

4 5 6

7 8 9

Файл out.txt

array a:

1 22 33

4 5 6

7 8 9

new array a:

33 1 22

5 6 4

8 9 7

1.8 Преобразование матрицы.

По заданной матрице А (размерности nn) вычислить новую матрицу X:

где Е1 и Е2 - заданные преобразования матрицы А. Входными данными программы являются: число n и элементы матрицы А; выходными  элементы матрицы X.

В программе предусмотреть:

- процедуру вычисления матрицы Е1(А) с формальными параметрами: размерность матрицы m, массивы А и В (исходная матрица и вычисляемая);

- процедуру-функцию булевского типа вычисления значения предиката с формальными параметрами: размерность матрицы и массив ее элементов.

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

I. Две различные операции Е1 и Е2 над вещественными матрицами из следующего списка:

б) умножение на 3 всех элементов тех и только тех строк, в которых диагональный элемент больше 1;

е) преобразование в симметричную с сохранением элементов, находящихся справа от главной диагонали;

III. Предикат P (A) на вещественных матрицах:

а) все определители второго порядка положительны (т.е.

;

IV. Числовые данные. Размерность матрицы n = 5, 6, 7 или 8, а элементы матрицы выбираются произвольно.

//arb2014_semestr_task_array

#include<iostream>

#include<fstream>

#include<iomanip>

using namespace std;

void create(ifstream &f , int** x, int n )

{

int i,j;

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

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

f>>x[i][j];

}

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

void show(ofstream &f , int** x, int n )

{

int i,j;

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

{

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

f<<setw(5)<<x[i][j];

f<<endl;

}

f<<endl;

}

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

void E1(int** x, int** y, int n)

{

int i,j;

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

{

if (x[i][i]>1)

for(j=0;j<n;j++) y[i][j]=x[i][j]*3;

else

for(j=0;j<n;j++) y[i][j]=x[i][j];

}

}

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

void E2(int** x, int** y, int n)

{

int i,j;

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

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

if (i>=j)

{

y[i][j]=x[i][j];

y[j][i]=y[i][j];

}

}

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

bool AA(int** x, int n)

{

bool p=true;

int i,j;

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

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

if ( x[i][j]*x[i+1][j+1] - x[i+1][j]*x[i][j+1]<=0) p=false;

return p;

}

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

void main()

{

ifstream in("arb.txt");

ofstream out("out.txt");

int** a,**b;

int n,i;

cout<<"enter size of array n=";

cin>>n;

a=new int* [n];

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

a[i]=new int[n];

b=new int* [n];

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

b[i]=new int[n];

create(in ,a,n);

in.close();

out<<"array a:"<<endl;

show(out,a,n);

if( AA(a,n)) E1(a,b,n); else E2(a,b,n);

out<<"array b:"<<endl;

show(out,b,n);

out.close();

}

Файл “arb.txt”

3 2 1

3 3 2

2 3 3

Файл “out.txt”

array a:

3 2 1

3 3 2

2 3 3

array b:

9 6 3

9 9 6

6 9 9

Лекция

Новые функции