Операторы базовых конструкций — КиберПедия 

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

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Операторы базовых конструкций

2020-12-06 93
Операторы базовых конструкций 0.00 из 5.00 0 оценок
Заказать работу

Опрераторы следования выполняются в порядке их написания сверху вниз. Они используются для описания сложных последовательных операций, например, 1)ввод переменных, 2)запись переменных в массив, 3)запись массива в файл. Допускается (но не рекомендуется) описывать сложные процедуры в виде одной, это усложняет чтение прграммы.

Условный оператор IF относится к конструкции ветвление и имеет синтаксис:

  if  (условие)      {операторы 1}

[ else                       {операторы 2 }]

Второй оператор (else) является опциональным и может отсутствовать.

Используется в случае использования сложных математических конструкций оператора 1 и оператора 2 в зависимости от заданного условия.

Блок схема действия оператора IF:

             
 
if совместно с else
if без else

 

Пример: определение наибольшего из четырех чисел.

#include <iostream>

#include <windows.h>

using namespace std;

 string Rus(string text)            //установка вывода русского языка в строке

          { CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str());

          return text;}

int main()

{

    int a,b,c,d,max;

    cout << Rus ("Введите первое число "); cin >> a;

    cout << Rus ("Введите второе число "); cin >> b;

    cout << Rus ("Введите третье число "); cin >> c;

    cout << Rus ("Введите четвертое число "); cin >> d;

    if (a > b)                                    //Классический синтаксис

            { max = a;}

    else

            { max = b;}

    if (c > max) max = c ;                  //Упрощенный синтаксис

    if (d>max) max=d;

    cout << Rus ("Максимальное из чисел ")<< max << endl;

return 0;

}

Пример: сравнение 2-х чисел.

#include <iostream>

using namespace std;

int main()

{

  int a=2, b=3, x=2, y=3;

  if (a==x and b==y)

  {cout<<"a=x "<<"b=y"<<endl;}

return 0;

}

Тернарный оператор также относится к конструкции ветвление и является частным случаем оператора IF. Используется в случае использования простых математических конструкций выражение 1 и выражение 2 в зависимости от заданного условия.

Он имеет синтаксис: условие? выражение 1: выражение2.

Блок схема действия тернарного оператора:

 

 

 

Пример: определение наибольшего из двух чисел.

# include < iostream >

# include < windows. h >           //установка команд операционной системы

using namespace std;

string Rus (string text)             //установка вывода русского языка в строке

{ CharToOem ((LPCTSTR) text. c _ str (), (LPSTR) text. c _ str ()); return text;}

int main()

{

int a,b,max;

cout <<Rus("Введите первое число "); cin >>a;

cout <<Rus("Введите второе число "); cin >>b;

max=(a>b)? a:b;

cout<<Rus(" Наибольшее число ")<<max<<endl;

system (" pause ");                   //команда операционной системе о приостановке

return 0;

}

Здесь конструкция установки русификации текста

string Rus(string text)

{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}

требует подключения заголовочного файла <windows.h>.

Оператор SWITCH относится к конструкции ветвление и имеет синтаксис: switch (выражение)

{

case 1:

    операторы; break;

case 2:

операторы; break;

...

default:

операторы;

}

 

Пример: простейший калькулятор.

# include < iostream >

#include <windows.h>

using namespace std;

int main()

{

    double a,b,result; char operation; int x;

    CALCULATOR:

    system (" cls ");                    //системная крманда очистки экрана

    cout <<"Input first number: ";

    cin>>a;

    cout <<"Input operation: "; cin>>operation;

    cout <<"Input second number: "; cin>>b;

    cout <<"\n"; bool f=true;

    switch (operation)

        {

           case '+': result=a+b; break;

           case '-': result=a-b; break;

           case '*': result=a*b; break;

           case '/': result=a/b; break;

           default: cout <<"Unknown operation!!!!!!!!\n"; f=false;

        }

        if (f>0) cout <<a<<operation<<b<<"="<<result<<endl;

    cout << "Do you want to continue? (yes=y/no=any key)";

    char cont; cin >> cont;

    if (cont=='y') goto CALCULATOR;

return 0;

}

Оператор FOR относится к конструкции цикл и имеет синтаксис:

  for (инициализация, условие, изменение переменных)

{ операторы}

Использует заданное число циклов.

Блок схема действия оператора for:

 

 


Пример: вычисление суммы четных чисел (нет конструкции i ++).

#include <iostream>

#include <windows.h>

using namespace std;

int main()

{

    int n, i =200;                          //объявление глобальной i =200

    SUM_OF_NUMBERS:

    cout <<"Enter number n="; cin>>n;

    int s=0;

    for (int i=0; i<=n; i=i+2)    // объявление локальной (int)  0=i<102

           {s=s+i;}

    cout<<"Sum of numbers is:" <<s<<endl;

    cout<<i<<endl;

    cout<< "Do you want to continue? (yes=y/no=any key)";

    char cont; cin>>cont; cout<<endl;

    if (cont=='y') goto SUM_OF_NUMBERS;

return 0;

}


Оператор WHILE относится к конструкции цикл и имеет синтаксис:

  while (условие)

{операторы}

Блок схема действия оператора while аналогична блок схеме for. Использует неопределенное число циклов. Следует пользоваться крайне аккуратно, неверное условие приводит к зацикливанию программы.

Пример: вычисление суммы нечетных чисел.

#include <iostream>

#include <windows.h>

using namespace std;

int main()

{

    int n, i=1, s=0;

    SUM_OF_NUMBERS:

    cout <<"Enter number n="; cin >> n;

    while (i<=n)

           {s=s+i;  i=i+2;}

    cout << "Sum of numbers is:" << s << endl;

    cout << "Do you want to continue? (yes=y/no=any key)";

    char cont; cin >> cont;

    cout << endl;

    if (cont=='y') goto SUM_OF_NUMBERS;

return 0;

}

Все конструкции SWITCH, FOR, WHILE могут сочетаться произвольным образом.

Пример: ввод пароля.

#include <iostream>

#include <conio.h>            //getch() – ввод без отображения на мониторе

#include <windows.h>      //установка команд операционной системы

using namespace std;

int main()

{

char c; char mass1[15]; int i=0, j=0;

char passw[15]={'I','v','a','n','_','1','9','9','7'};

cout<<"Enter your password: ";

while (c!=char(13))

       {c=getch(); cout<<"*"; mass1[i]=c; i=i+1;} //getche() – выводит символы!!!

cout<<endl; cout<<endl; bool f=true;

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

   {if (mass1[j]!=passw[j]) f=false;}

if (f==false)

{cout<<"Password incorrect!!!!"; cout<<endl; return 0;}

cout <<"Continue to work, please..."<<endl;

cout<<endl;

system("pause");

return 0;

}

 


Полезная функция – генерация 4-х случайных чисел в диапазоне A – В:

#include <iostream>

#include <windows.h>

#include<ctime>

using namespace std;

int main()

{

srand(time(0));

for (int i=1; i<=4; i++)

{

int b=rand()% (B-A+1)+A;

cout<<b<<" ";

Sleep (30);

}

return 0;

}

Здесь оператор srand (time (0)); явяляется 15-разрядным счетчиком (0-32767), который поставляет начальные исходные значения для программы генерации псевдослучайных чисел. Оператор Sleep (30); осуществляет задержку вывода на 30 мс.

Задание 1. Выполнить лабораторную работу 5 (Операторы базовых конструкций).

Задание 2. Выполнить лабораторную работу 5а (Операторы базовых конструкций).


Лекция 6

Функции

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

Синтаксис ссылки на функцию: тип_возвращаемой_переменной имя_функции (параметры).

Пример программы без объявления функции.

#include <iostream>

...

using namespace std;

int main()

{

//начало рограммы

...

вычисление некого значения y=f(x1,y1,z1);    //y – сложная конструкция

продолжение программы

...

вычисление некого значения y=f(x2,y2,z2);   //y – сложная конструкция

продолжение программы

...

вычисление некого значения y=f(x3,y3,z3);   //y – сложная конструкция

продолжение программы

...

return 0;

}

Пример программы с объявлением в функции заданных исходных данных.

#include <iostream>

...

объявление функции y = f (x, y, z);   //возвращает y=f(x,y,z);

using namespace std;

int main()

{

//начало рограммы

...

y=f(x 1, y 1, z 1);                         //обращение к функции y

продолжение программы

...

y=f(x 2, y 2, z 2);                         //обращение к функции y

продолжение программы

...

y=f(x 3, y 3, z 3);                         //обращение к функции y

продолжение программы

...

return 0;

}


Пример: вычисление гипотенузы.

#include <iostream>

#include <windows.h>

#include <cmath>

double hypot(double a, double b)                        // Объявление функции hypot

   {

   double c; c=sqrt(a*a+b*b); return (c);

   }

using namespace std;

int main()

{

double a,b,c;

cout<<"Input first cathetus: "; cin >>a;

cout<<"Input second cathetus: ";cin >>b;

c=hypot(a,b);                                          //Вызов функции

cout <<"Hypotenuze is: " << c << endl;

return 0;

}

 

Массивы

При использовании простых переменных каждой области памяти для хранения данных соответствует свое имя. Если с группой величин одинакового типа требуется выполнять однообразные действия, им дают одно имя, а различают по порядковому номеру. Это позволяет компактно записывать множество операций с помощью циклов. Конечная именованная последовательность однотипных величин называется массивом.

  Описание одномерного массива в программе отличается от описания простой переменной наличием после имени квадратных скобок, в которых задается количество элементов массива (размерность): float а [10];   // описание массива из 10 вещественных чисел.

Элементы массива нумеруются с нуля. При описании массива используются те же модификаторы (класс памяти, инициализатор), что и для простых переменных. Инициализирующие значения для массивов записываются в фигурных скобках. Значения элементам присваиваются по порядку. Если элементов в массиве больше, чем инициализаторов, элементы, для которых значения не указаны, то их значения обнуляются: int b[5] = {3, 2, 1};   / / b[0]=3, b[l]=2, b[2]=l, b[3]=0, b[4]=0.

Элементы массива должны быть одного типа.

Пример (одномерных массивов – int, int):

#include <iostream>

#include <windows.h>

using namespace std;

string Rus(string text)                         //установка вывода русского языка в строке

 { CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text; }

int main()

{

int mass1[40]={'A','B','C','D','E'};

int mass 2[40]={1,20,300,400,5000};

int i;

cout << Rus ("Содержимое первого массива до копирования")<< endl;

for (i=0; i<=15; i=i+1)

{ cout<<mass1[i]<<" "; }

cout << endl; cout << endl;

cout << Rus ("Содержимое второго массива до копирования")<< endl;

for (i=0; i<=15; i=i+1)

{ cout<<mass2[i]<<" "; }

cout << endl; cout << endl;

for (i =0; i <=15; i = i +1)        //копирование первого массива во второй

{ mass 2[ i +5]= mass 1[ i ]; }

cout << Rus ("Содержимое второго массива после копирования")<< endl;

for (i=0; i<=15; i=i+1)

{ cout<<mass2[i]<<" "; }

cout<<endl;

return 0;

}

Поскольку переменная обоих массива заявлена как int, то

- ячейка первого массива имеет длину 4 байта (символьная переменная отображается в массиве как число длиной 1 байт);

- ячейка второго массива имеет длину 4 байта;

- копирование первого массива во второй происходит без проблем.

Пример (одномерных массивов – char, int):

#include <iostream>

#include <windows.h>

using namespace std;

string Rus(string text)                       //установка вывода русского языка в строке

 {CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text; }

int main()

{

char mass1[40]={'A','B','C','D','E'};

int mass 2[40]={1,20,300,400,5000};

int i;

cout << Rus ("Содержимое первого массива до копирования")<< endl;

for (i=0; i<=15; i=i+1)

{cout<<mass1[i]<<" "; }

cout << endl; cout << endl;

cout << Rus ("Содержимое второго массива до копирования")<< endl;

for (i=0; i<=15; i=i+1)

{ cout<<mass2[i]<<" "; }

cout<<endl; cout<<endl;

for (i =0; i <=15; i = i +1)        //копирование второго массива в первый

{ mass1[i+5]=mass2[i]; }

cout << Rus ("Содержимое первого массива после копирования")<< endl;

for (i=0; i<=15; i=i+1)

{cout<<mass1[i]<<" "; }

cout << endl;

return 0;

}

Поскольку переменная первого массива заявлена как char, то

- ячейка первого массива имеет длину 1 байт;

- ячейка второго массива имеет длину 4 байта;

- копирование второго массива в первый происходит с потерей информации: при выводе mass1[i] с типом переменной char имеем:


1=>               00000001=>1 => ' '

20=>             00010100=>20 => '╕'

300=>         1 00101100=>44 => ','

400=>         1 10010000=>144=> 'Р'

5000=>1001111 00010000=>136=> 'И'

 

Cпособ объединения (“склеивания”) символьных массивов:

#include <iostream>

#include <cstring>                  //включение библиотеки операций со строками

using namespace std;

int main()

{

char s1[8] = "q wert ";

char s2[4] = "123";

char s3[10];

strcpy(s3, s1);                        //копирование 1 строки в 3

strcat(s3, s2);                        //добавление 2 строки в конец 3

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

{

cout<<s3[i];                        // содержимое 3 строки

}

return 0;

}

Многомерные массивы задаются указанием каждого измерения в квадратных скобках, например, оператор

int matr ix [6][8];

задает описание двумерного массива из 6 строк и 8 столбцов. В памяти такой массив располагается в последовательных ячейках построчно. Многомерные массивы размещаются так, что при переходе к следующему элементу быстрее всего изменяется последний индекс (номер колонки). Для доступа к элементу многомерного массива указываются все его индексы, например, matrix[i][j].

При инициализации многомерного массива он представляется либо как массив из массивов, при этом каждый массив заключается в свои фигурные скобки:

int mass 1 [3][4] = { {1, 2}, {3,0,5}, {6,7,8,9} };

Расположение элементов такого массива приведено в табл.6.1 

 

Табл. 6.1. Расположение элеменов массива mass1

  j=0 j=1 j=2 j=3
i=0 [0] [0]=1 [0] [1]=2 [0] [2]=0 [0] [3]=0
i=1 [1] [0]=3 [1] [1]=0 [1] [2]=5 [1] [3]=0
i=2 [2] [0]=6 [2] [1]=7 [2] [2]=8 [2] [3]=9

 

Возможно выборочная запись переменной массива:

mass1[0][3]=100;

 


Пример (двумерного массива –  int):

#include <iostream>

#include <windows.h>

using namespace std;

string Rus (string text)              //установка вывода русского языка в строке

{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text; }

int main()

{

int mass1 [3][4] = {{1, 2}, {3,0,5}, {6,7,8,9} };

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

{

 cout<<Rus("Cтрока ")<<i<<": ";

for (int j=0; j<=3; j++)

{

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

}

cout<<endl;

}

cout<<"***********************"<<endl;

mass1[0][3]=100;

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

{

cout<<Rus("Cтрока ")<<i<<": ";

for (int j=0; j<=3; j++)

{

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

}

cout<<endl;

}

return 0;

}

6.3. Указатели

Когда компилятор обрабатывает оператор определения переменной, например, int i=10; он выделяет память в соответствии с типом (int) и инициализирует ее указанным значением (10). Все обращения в программе к переменной по ее имени (i) заменяются компилятором на адрес области памяти, в которой хранится значение переменной. Программист может определить собственные переменные для хранения адресов  областей памяти. Такие переменные называются указателями. Итак, указатели предназначены для хранения адресов областей памяти.

У казатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного). Простейшее объявление указателя на объект (в дальнейшем называемого просто указателем) имеет вид: тип_данных *имя_указателя;. Указатели применимы только к целым числам и массивам.

Существуют две операции для работы с указателями. Во-первых, это определение адреса ячейки по имени переменной, для этого используется оператор &. Во-вторых, это определение значения переменной записанного по данному адресу, для этого используется оператор *.


Пример целочисленной переменной:

#include <iostream>

#include <windows.h>

using namespace std;

string Rus(string text)             //установка вывода русского языка в строке

{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}

int main()

{

int a=100, b=0;

int *pa, *pb;

pa =& a;         //указатель на адрес, где хранится a

cout << Rus ("Переменная а=")<< a << Rus (" находится в ячейке ")<< pa << endl;

cout << Rus ("В ячейке с номером ")<< pa << Rus (" хранится переменная ")<<* pa << endl;

cout << Rus ("Номер следующей ячейки ")<< pa +1<< endl;

cout << endl;

* pa =* pa +10;

cout << Rus ("Переменная а стала равна ")<<* pa << endl; //эквивалентно a = a +10

b = a; pb =& b;

cout << Rus ("Переменная b стала равна ")<<* pb << endl;

return 0;

}

Пример одномерного массива:

#include <iostream>

#include <windows.h>

using namespace std;

string Rus(string text)             // установка вывода русского языка в строке

{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}

int main()

{

int a[5] = {3, 2, 1};

int *pa; pa=&a[0];

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

{

pa=&a[i];

cout<<Rus("Переменная ")<<*pa<<Rus(" хранится по адресу ")<<pa<<endl;

}

return 0;

}

Задание 1. Выполнить лабораторную работу 6 (Функции).

Задание 2. Выполнить лабораторную работу 6а (Массивы).


 

Лекция 7

Операции с файлами

Большие объемы данных хранятся на диске в виде файлов. Существуют два основных типа файлов: текстовые и двоичные.

Т екстовыми называются файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конца строки». Конец самого файла обозначается символом «конца файла». Чтение тестового файла можно просмотреть с помощью любого текстового редактора.

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

В программах на C++ при работе с текстовыми файлами необходимо подключить библиотеку fstream.

При работе с файлами используются специальные типы данных, называемые потоками. Переменная для записи символов в файл имеет вид с ofstream <переменная_потока>,  а переменная для чтения символов из файла имеет вид с ifstream <переменная_потока>.

Ф айл может быть открыт в одном из следующих режимов:

· ios::in — открыть файл в режиме чтения данных;

· i os::out — открыть новый файл в режиме записи данных (при этом информация о существующем файле уничтожается);

· ios::app — открыть файл в режиме записи данных в конец файла;

· ios::ate — передвинуться в конец уже открытого файла;

· ios::trunc — очистить файл, это же происходит в режиме ios::out;

· ios::nocreate — не выполнять операцию открытия файла, если он не существует;

· ios::noreplace — не открывать существующий файл.

 

Открытие текстового файла для записи

Для открытия и записи в файл используются переменная fstream <имя_переменной>; оператор <переменная_потока>. open(путь_к_файлу, режим);

Для закрытия файла используется оператор <переменная_потока>.close();

Пример: открытие файла1 для записи в колонку пяти вещественных чисел.

 

#include <iostream>              //библиотека ввода/вывода

#include <windows.h>          //установка команд операционной системы

#include <cstdio>                  // для функции gets()

#include <fstream>                //потоки ввода/вывода в файлы;

using namespace std;

string Rus(string text)            //установка вывода русского языка в строке

{ CharToOem ((LPCTSTR) text. c _ str (), (LPSTR) text. c _ str ()); return text;}

int main()

{

int i, n=5; float a;

fstream file1 ;            //объявляет имя потока для записи/чтения данных в файл

file1.open("C:\\SOURCE\\qwerty.dot", ios::out); //c оздается файл

cout<<Rus("Введите данные: ")<<endl;

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

{

  cin>>a;

  file 1<< a << endl;             //запись переменной а в файл

}

file 1. close ();                        //закрытие потока

return 0;

}

Если файл с таким именем уже существует, то он будет перезаписан, если файл не существует, то он создается заново. Следует следить за соответствием типа вводимой переменной. При любой попытке ввода литеры (char) вместо float файл заполняется n нулями и закрывается.

Пример: открытие файла1 для записи в строку пяти вещественных (целых) чисел.

 

#include <iostream>              //библиотека ввода/вывода

#include <windows.h>           //установка команд операционной системы

#include <cstdio>                  // для функции gets()

#include <fstream>               //потоки ввода/вывода в файлы;

using namespace std;

string Rus(string text)           //установка вывода русского языка в строке

{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}

int main()

{

int i, n=5; float a;

fstream file1;            //объявляет имя потока для записи/чтения данных в файл

file1.open("C:\\SOURCE\\qwerty.dot", ios::out); //c оздается файл

cout<<Rus("Введите данные: ")<<endl;

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

{

  cin>>a;

  file1<<a<<" ";       //запись переменной а в файл

}

file1.close();                   //закрытие потока

return 0;

}

 

Пример: открытие файла2 для записи 3-х строк (пробел – начало следующей строки).

 

#include <iostream>              //библиотека ввода/вывода

#include <windows.h>           //установка команд операционной системы

#include <cstdio>                  // для функции gets()

#include <fstream>               //потоки ввода/вывода в файлы;

using namespace std;

string Rus(string text)           //установка вывода русского языка в строке

{ CharToOem ((LPCTSTR) text. c _ str (), (LPSTR) text. c _ str ()); return text; }

int main()

{

int i, n=3; string a;

ofstream file2;                 //объявляет имя потока для записи строки в файл

file2.open("C:\\SOURCE\\qwerty.dot", ios::out);

cout<<Rus("Введите данные: ")<<endl;

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

{

cin>>a;

file2<<a<<endl;       //запись строки а в файл

}

f ile2.close();                   //закрытие потока

return 0;

}

 

Использование указанного файла во многих случаях не совсем удобно, т.к. символы перехода на новую строку, табуляции, пробел в операторе cin интерпретируются компилятором как нуль-символ (конец строки). Например, при вводе строки без пробела

Иванов-36лет

Петров-17лет

Сидоров-50лет

в файл все запишется корректно, как есть.

Но, при вводе

Иванов – 36 лет

Петров – 17 лет

Сидоров – 50 лет

в файл все запишется

Иванов

 –

36

Поэтому более корректно использовать строчные переменные, содержащие как сами данные, так и их наименование. Для выхода из цикла можно использовать любую заданную строку (например, eof), но ни в коем случае не пытаться внести вручную символ операционной системы  “конец файла”, который компилятор создает автоматически при закрытии файла. Попытка эмуляции символа “конец файла” (например, Ctrl ^ Z) обычно приводит к зависанию программы.

Пример: открытие файла3 для записи произвольного числа строк (с пробелами).

 

#include <iostream>                //библиотека ввода/вывода

#include <windows.h>            //установка команд операционной системы

#include <fstream>                  //потоки ввода/вывода в файлы;

using namespace std;

string Rus(string text)              //установка вывода русского языка в строке

{CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str()); return text;}

int main()

{

string str;                                  // объявляется длина строки

fstream file3;                            //объявляется имя потока для записи данных в файл

file3.open("C:\\SOURCE\\qwerty.dot", ios::out);

cout<<Rus("Введите данные: ")<<endl;

while (str!=" eof ")

{

getline(cin,str);

file 3<< str << endl;                //запись пока не введена строка eof

}

file 3.close();                             // закрытие потока

return 0;

}

 


В полученном файле имеем

Иванов – 36 лет

Петров – 17 лет

Сидоров – 50 лет

Eof

Для избавления от внесенной строки eof следует в редакторе Notepad уничтожить эту строку.

 

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

Пример: открытие файла4 для записи символьного масива длиной 80 литер в 3 строки.

y1=3 – первая цифра зачетки

y2=7 – вторая цифра зачетки

# include < iostream >                //библиотека ввода/вывода

# include < windows. h >           //установка команд операционной системы

#include <cstdio>                   //для функции gets()

# include < fstream >                 //потоки ввода/вывода в файлы;

using namespace std;

string Rus (string text)             //установка вывода русского языка в строке

          {

          CharToOem((LPCTSTR)text.c_str(), (LPSTR)text.c_str());

          return text;

          }

int main ()

{

int i, n =3;                                 //объявляется число строк для отображения на экране

char str [80];                           //объявляется длина символьного массива

fstream file 4;                          //объявляется имя потока для записи данных в файл

file4.open("C:\\SOURCE\\qwerty.txt", ios::out);

cout << Rus ("Введите данные: ")<< endl;

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

{

gets (str);                            //считывание одной строки с консоли

file 4<< str << endl;             //запись строки в файл

}

file 4.close();                           //закрытие потока

return 0;

}

При использовании этого способа нужно четко следить за количеством строк и размером символьного массива.

Созданный файл С:\\ SOURCE \\ qwerty. txt можно прочитать любым текстовым редактором с установкой кодировки CP866. При использовании MS Word следует: Open with/Microsoft OfficeàWord/MS-DOS, а при использовании Notepad – Open with/Notepad (Format/Font/Terminal).

 


 

Открытие текстового файла для чтения

Для открытия файла для чтения используются переменная fstream file; оператор <переменная_потока>. open(путь_к_файлу, режим);

Для закрытия файла используется оператор <переменная_потока>.close();

 

Пример: открытие файла1 для чтения из колонки вещественных чисел оператором while.

#include <iostream>

#include <fstream>

using namespace std;

int main ()

{

int n =-1; float a;                  //считывание данных на 1 больше

fstream file 1;                        //открываем файл в режиме чтения

file1.open("C:\\SOURCE\\qwerty.dot");

while (!file1.eof())

  {

  n++;

  file1>>a;

  cout<<a<<endl;

  }

file1.close();

cout<<endl; cout<<"n="<<n<<endl;

return 0;

}

Поскольку символ конец файла находится в 6-ой строке, то при использовании оператора while последнее значение переменной выводится дважды.

Пример: открытие файла1 для чтения из колонки 5 записанных вещественных чисел оператором   for.

 

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

int i; float a;

fstream file1;                        //открываем файл в режиме чтения

file1.open("C:\\SOURCE\\qwerty.dot");

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

{

file1>>a;

cout<<a<<endl;

}

file1.close();

cout<<endl; cout<<"i="<<i<<endl;

return 0;

}


Поскольку в операторе for число считываний равно 10, то последнее значение переменной выводится 5 раз. Получим на экране 1 2 3 4 5 5 5 5 5 5.

Пример: открытие файла3 для чтения произвольного числа строк (с уничтоженной строкой eof).

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

int n=-1; string str;                  //считывание данных на 1 больше

fstream file3;                            //открываем файл в режиме чтения

file3.open("C:\\SOURCE\\qwerty.dot");

while (!file3.eof())

  {

  n++;

  getline(file3,str);

  cout<<str<<endl;

  }

file3.close();

cout<<endl; cout<<"n="<<n<<endl;

return 0;

}

При чтении файла3 имеем

Иванов – 36 лет

Петров – 17 лет

Сидоров – 50 лет

 

Пример: открытие файла4 для чтения символьного массива.

#include <iostream>                //библиотека ввода/вывода

#include <iostream>                //библиотека ввода/вывода

#include <windows.h>            //установка команд операционной системы

#include <cstdio>                    // для функции gets()

#include <fstream>                  //потоки ввода/вывода в файлы;

using namespace std;

int main()

{

char string[80]; fstream file4;

file4.open("C:\\SOURCE\\qwerty.txt", fstream::in);

int size(0);                                //int size=0;

while(!file4.eof())                    // определение длины текста

{

file4.get(string[size]);

cout<<string[size];

size++;

}

file4.close(); cout<<"\r";

char y1=string[3]; cout<<" y1="<<y1<<endl;

char y2=string[31]; cout<<" y2="<<y2<<endl;

return 0;

}

При открытии строчного файла предыдущего примера получим следующее заполнение массива string (рис. 9.1):

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
y 1 = 3   -   п е р в а я   ц и ф р а   з а ч е т к и CR

 

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
y 2 = 7   -   в т о р а я   ц и ф р а   з а ч е т к и CR

Рис. 7.1. Заполнение массива

 

Теперь, чтобы получить численное значение численной переменной y1 следует код цифры перевести в число: int y 1= string [3]; y 1= y 1-48;   

Задание 1. Выполнить лабораторную работу 7 (Операции с файлами).

Задание 2. Выполнить лабораторную работу 7 a (Операции с файлами).

 


Поделиться с друзьями:

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.607 с.