- •Первый семестр
- •1) Цикл с предусловием
- •2) Цикл с постусловием
- •Преобразование типа переменной в программе
- •Continue
- •Вычислить сумму произведений элементов
- •Найти максимальную из построчных сумм
- •Умножение матриц
- •Void show(int**X, int n)
- •Void mult ( int **X, int**y, int**z)
- •Void add ( int **X, int**y, int**z)
- •Void create(int**X, int n)
- •Исходные данные
- •За приближенное значение интеграла принимается такое, при котором .
- •Strcpy()
- •Strncpy()
- •Strcat()
- •Strcmp()
- •Strclen()
- •Int** create(ifstream &f , int n )
- •Int** subtr (int** X, int**y, int n)
- •Int** mult (int** X, int**y, int n)
Strcpy()
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 не добавляется.
Обе эти функции возвращают указатель на результирующую строку. Если области памяти , занимаемой строкой-назначением и строкой-источником, перекрываются, поведение программы не определено.
Strcat()
Формат strcat(s1, s2)-присоединяет строку s2 к концу строки s1.
Примечание строка s2 не меняется.
Strcmp()
Формат strcmp (s1, s2)- сравнивает s1 с s2( лексико-графический)
s1 =s2 функция возвращает 0
s1 >s2 функция возвращает положительное значение
s1 <s2 функция возвращает отрицательное значение
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
Лекция
Новые функции
