Главная страница
Навигация по странице:

  • Лекция

  • Лекция Задача 2 Поиск треугольника с наибольшей площадью

  • Файл out . txt

  • Неформатируемый ввод-вывод данных в двоичном режиме

  • //arb2014_binary_get_put

  • Лекции 1 семестр матанализ. лекции 1 семестр (1). Литература Герберт. Шилдт. С руководство для начинающих


    Скачать 1.38 Mb.
    НазваниеЛитература Герберт. Шилдт. С руководство для начинающих
    АнкорЛекции 1 семестр матанализ
    Дата19.02.2023
    Размер1.38 Mb.
    Формат файлаdoc
    Имя файлалекции 1 семестр (1).doc
    ТипЛитература
    #945406
    страница6 из 9
    1   2   3   4   5   6   7   8   9

    Перечисления
    Дни недели


    //arb2015_enum_day_of_week

    #include "stdafx.h"

    #include

    using namespace std;
    enum days_of_week { Sun, Mon, Tue, Wed, Thu,Fri,Sat };

    int main()

    {

    days_of_week day1,day2;

    day1=Mon;

    day2=Thu;

    int diff=day2-day1;

    cout<<" the difference in days = "<
    if (day1
    system("pause");

    return 0;
    }

    Тип перечисление
    В С++ можно определить список именованных целоцисленных констант. Такой список называется перечислением. Эти константы можно использовать везде , где допустимы целочисленные значения ( например, в целочисленных выражениях).

    Перечисления определяются с помощью ключевого слова enum,

    а формат их определения имеют такой вид

    enum имя_типа { список_перечисления } список_переменных;

    Под элементом список _перечисления понимается список разделенных запятыми имен , которые представляют значения перечисления. Элемент список_переменных необязателен, поскольку переменные можно объявлять позже , используя имя_типа перечисления.
    В следующем примере используется перечисление transport и две переменные типа transport с именами t1и t2.
    enum transport {car, truck, airplane, train, boat };

    transport t1 , t2;

    t1 = airplane;
    Важно понимать , что каждое имя списка перечислениея означает целое число, причем каждое следующее число (представленное именем ) на единицу больше предыдущего. Поэтому при выполнении следующей инструкции

    cout<< car<<’ ‘<
    на экран будут выведены чиса 0 и 3.

    Несмотря на то , что перечислимые константы автоматически преобразуются в целочисленные , обратное преобразование автоматически не выполняется. Например, следующая инструкция некорректна.
    t2=1;// ошибка
    Эта инструкция вызовет во время компиляции ошибку, поскольку автоматического преобразования целочисленных значений в значения типа transport не существует. Откорректировать предыдущую инструкцию можно с помощью операции приведения типов
    t2= (trunsport) 1;

    Теперь переменная t2 будет содержать значение truck, поскольку эта transport-константа связывается со значением 1.

    Используя инициализатор, можно указать значение одной или нескольких перчислимых констант. Это делается так : после соответствующего элемента списка перчисления ставится знак равенства и нужное целое число. При использовании инициализатора следующему ( после инициализированного ) элементу списка присваивается значение , на единицу превышающее предыдущее значение инициализатора.
    enum transport {car, truck, airplane=10, train, boat } ;
    Теперь все имена перечисления transport имеют следующие значения

    сar 0

    truck 1

    airplane 10

    train 11

    boat 12

    //arb2014_type_enum

    #include

    using namespace std;

    #include "stdafx.h"

    #include

    #include
    using namespace std;
    int main()

    {

    ofstream out("out.txt");
    enum transport {car, truck=2,airplane=10, train, boat };

    transport t1,t2;

    out<<"airplane=10 airplane= "<
    out<<"airplane=10 airplane+10” <
    t2=truck;

    t2=(transport)((int)t2 +2);

    out<<" t2=(transport)((int)t2 +2) t2= "<
    out.close();

    }

    enum transport {car, truck=2,airplane=10, train, boat };

    Файл out.txt

    airplane=10 airplane= 10

    airplane=10 airplane+10 = 20

    t2=(transport)((int)t2 +2) t2= 4
    Примечание: именованной константы со значением 4 нет в перечислении.


    Тип union – объединение
    Объединение - это область памяти которую разделяют несколько различных переменных. Объединение создается с помощью ключевого слова union. Его объявление подобно объявлению структуры.

    union utype

    {

    short int i;

    char ch;

    };
    Здесь объявляется объединение , в котором значение типа short int и значение типа char разделяют одну и туже область памяти. Необходимо сразу же прояснить один момент: невозможно сделать так, чтобы объединение хранило и целочисленное значение , и символ одновременно, поскольку переменные i и ch (в памяти ) накладываются друг на друга. Но программа в любой момент времени может обрабатывать информацию

    //arb2014_struct_union2

    #include "stdafx.h"

    #include

    #include

    #include

    using namespace std;

    int main()

    {

    struct strtype

    {

    int x;

    union

    {

    short int age;

    char title[30];

    };

    };

    int n;

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

    cin>>n;

    strtype* a= new strtype[n];

    ifstream in("arb.txt");

    ofstream out("out.txt");

    int i;

    for(i=0;i
    {

    int y;

    in>>y;

    if(y==0) in>>a[i].age; else in>>a[i].title;

    a[i].x=y;

    }

    in.close();

    for(i=0;i
    {

    out<
    if(a[i].x) out<
    out<
    }

    out.close();

    system("pause");

    return 0;
    }
    n=20

    Файл arb.txt
    0 23 1 boss 1 it 0 17 1 office 1 landlord 0 20 1 sportsmen

    0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen

    0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen

    0 23 1 boss 0 17 1 it 1 office 1 landlord 0 20 1 sportsmen
    Файл out.txt

    0 23

    1 boss

    0 17

    1 it

    1 office

    1 landlord

    0 20

    1 sportsmen

    0 23

    1 boss

    0 17

    1 it

    1 office

    1 landlord

    0 20

    1 sportsmen

    0 23

    1 boss

    0 17

    1
    Лекция'>Лекция №13

    Структуры

    Структуры - тип данных, определяемые пользователем
    Задача 1.

    Структура комплексное число
    //arb2014_struct_complex

    #include "stdafx.h"

    #include

    using namespace std;
    struct complex

    {

    double re;

    double im;

    } ;

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

    complex create_complex()

    {

    complex p;

    cout<<"enter re=";

    cin>>p.re;

    cout<<"enter im=";

    cin>>p.im;

    return p;

    }

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

    void show(complex p)

    {

    cout<

    }

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

    complex add(complex p, complex q)

    {

    complex temp;

    temp.re=p.re+q.re;

    temp.im=p.im+q.im;

    return temp;

    }

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

    complex subtr(complex p, complex q)

    {

    complex temp;

    temp.re=p.re-q.re;

    temp.im=p.im-q.im;

    return temp;

    }

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

    complex mult (complex p, complex q)

    {

    complex temp;

    temp.re=p.re*q.re-q.im*p.im;

    temp.im=p.re*q.im+q.re*p.im;

    return temp;

    }

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

    complex div(complex p,complex q)

    {

    double r=q.re*q.re + q.im*q.im;

    complex temp;

    temp.re=(p.re*q.re+p.im*q.im)/r;

    temp.im=(p.im*q.re-p.re*q.im)/r;

    return temp;

    }

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

    int main()

    {

    complex p,q;

    cout<<" enter complex p:"<
    p=create_complex();

    cout<<" enter complex q:"<
    q= create_complex();

    cout<<" complex number p: ";

    show(p);

    cout<<" complex number q: ";

    show(q);

    complex u=add(p,q);

    cout<<" complex number u=p+q u: ";

    show(u);

    u=p;

    cout<<" complex number u=p u: ";

    show(u);

    u=subtr(p,q);

    cout<<" complex number u=p-q u: ";

    show(u);

    u=add(add(p,q),subtr(p,q));

    cout<<" complex number u=(p+q)+(p-q) u: ";

    show(u);

    u=subtr( add(add(p,q),subtr(p,q)),p);

    cout<<" complex number u=((p+q)+(p-q))-p u: ";

    show(u);

    u=mult(p,p);

    cout<<" complex number u=p*p u: ";

    show(u);

    u=div(p,p);

    cout<<" complex number u=p/p u: ";

    show(u);

    u=div(add(p,p),p);

    cout<<" complex number u=(p+p)/p u: ";

    show(u);

    system("pause");

    return 0;

    }
    Лекция

    Задача 2

    Поиск треугольника с наибольшей площадью.
    //arb2013_struct_triangle_max_square_variant2

    #include "stdafx.h"

    #include

    #include

    #include

    #include

    #include

    using namespace std;

    struct dot

    {

    double koor_x,koor_y;

    };
    struct triangle

    {

    dot a;

    dot b;

    dot c;

    };
    const int num_dot=30;

    const int num_tr=10;

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

    void create(ifstream &f, dot &x)

    {

    if (!f)

    {

    cout<<"File not found! ";

    exit(-1);

    }

    f>>x.koor_x>>x.koor_y;

    }

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

    void create(triangle &Tr, dot dx, dot dy, dot dz)

    {

    Tr.a=dx;

    Tr.b=dy;

    Tr.c=dz;

    }

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

    double len_side(dot dx,dot dy)

    {

    return sqrt( ( dx.koor_x - dy.koor_x )*( dx.koor_x - dy.koor_x ) +

    ( dx.koor_y - dy.koor_y)*( dx.koor_y - dy.koor_y ));

    }

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

    bool usl_triangle(dot dx, dot dy, dot dz)

    {

    return

    (dx.koor_x - dz.koor_x)*(dy.koor_y - dz.koor_y)!=

    (dy.koor_x - dz.koor_x)*(dx.koor_y - dz.koor_y);

    }
    /////////////////////////////////

    double square(triangle Tr)

    {

    double s[3];

    s[0]=len_side(Tr.a,Tr.b);

    s[1]=len_side(Tr.a,Tr.c);

    s[2]=len_side(Tr.b,Tr.c);

    double Semi_Per;

    Semi_Per=(s[0]+s[1]+s[2])/2;
    return sqrt(Semi_Per*(Semi_Per-s[0]) *(Semi_Per-s[1])

    *(Semi_Per-s[2]));

    }

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

    void show(ofstream &f, triangle Tr)

    {

    f<
    double s[3];

    s[0]=len_side(Tr.a,Tr.b);

    s[1]=len_side(Tr.a,Tr.c);

    s[2]=len_side(Tr.b,Tr.c);
    cout.precision(4);

    f<<"dot1= " << "(" <
    <
    f<<"dot2= " <<"(" <
    <
    f<<"dot3= " <<"("<
    <
    f<<"side AB= "<
    f<<"side AC= "<
    f<<"side BC= "<
    f<<"square tr ABC= "<
    }

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

    int main()

    {

    dot dt1,dt2,dt3;

    triangle Tr[num_tr];

    int i,num_tr_true;

    ifstream in("arb.txt");

    ofstream out("out.txt");

    num_tr_true=-1;

    for (i=0;i
    {

    create(in,dt1);

    create(in,dt2);

    create(in,dt3);

    if (usl_triangle(dt1,dt2,dt3))

    {

    num_tr_true++;

    create(Tr[num_tr_true],dt1,dt2,dt3);

    }

    }
    double max=0.0;

    int ind=0;

    for(i=0;i
    if (max
    {

    max=square(Tr[i]);

    ind=i;
    }

    out<<"Max Square= "<
    show(out,Tr[ind]);

    out<
    out<<"show all triangles:"<
    for(i=0;i
    show(out,Tr[i]);

    out<
    out<<"num_tr_true= "<
    out.close();

    system("pause");

    return 0;

    }

    Файл arb.txt
    1.0 1.0

    22.0 27.0

    32.0 39.0
    1.11111 1.1

    3.333 3.455

    6.66 4.056
    4.11111 5.1

    7.333 8.455

    6.66 4.056
    11.11111 12.1

    17.333 13.455

    22.66 24.056
    13.11111 14.1

    34.333 36.455

    61.66 64.056
    41.11111 42.1

    43.333 38.455

    26.66 24.056
    0.11111 1.1

    0.333 3.455

    0.66 4.056
    12.91111 11.1

    32.9333 3.455

    6.966 4.9056
    1.911111 5.1

    3.9333 3.455

    6.66 4.056
    17.11111 18.1

    37.333 38.455

    61.66 64.0756
    2.11111 4.1

    3.333 9.455

    16.66 14.056
    10.11111 11.1

    13.333 13.455

    16.66 14.056
    1.0 1.0

    2.0 2.0

    3.0 3.0

    Файл out.txt
    Max Square=
    Triangle=

    dot1= (12.9111, 11.1)

    dot2= (32.9333, 3.455)

    dot3= ( 6.966,4.9056)

    side AB= 21.4321

    side AC= 8.58574

    side BC= 26.0078

    square tr ABC= 84.7379

    show all triangles:
    Triangle=

    dot1= ( 1, 1)

    dot2= ( 22, 27)

    dot3= ( 32, 39)

    side AB= 33.4215

    side AC= 49.0408

    side BC= 15.6205

    square tr ABC= 4
    Triangle=

    dot1= (1.11111, 1.1)

    dot2= ( 3.333, 3.455)

    dot3= ( 6.66, 4.056)

    side AB= 3.23772

    side AC= 6.28714

    side BC= 3.38085

    square tr ABC= 3.24986
    Triangle=

    dot1= (4.11111, 5.1)

    dot2= ( 7.333, 8.455)

    dot3= ( 6.66, 4.056)

    side AB= 4.65152

    side AC= 2.75441

    side BC= 4.45018

    square tr ABC= 5.95759
    Triangle=

    dot1= (11.1111, 12.1)

    dot2= (17.333,13.455)

    dot3= ( 22.66,24.056)

    side AB= 6.36773

    side AC= 16.623

    side BC= 11.8642

    square tr ABC= 29.3701
    Triangle=

    dot1= (13.1111, 14.1)

    dot2= (34.333,36.455)

    dot3= ( 61.66,64.056)

    side AB= 30.8239

    side AC= 69.6606

    side BC= 38.8404

    square tr ABC= 12.5748
    Triangle=

    dot1= (41.1111, 42.1)

    dot2= (43.333,38.455)

    dot3= ( 26.66,24.056)

    side AB= 4.26882

    side AC= 23.1175

    side BC= 22.03

    square tr ABC= 46.383
    Triangle=

    dot1= (0.11111, 1.1)

    dot2= ( 0.333, 3.455)

    dot3= ( 0.66, 4.056)

    side AB= 2.36543

    side AC= 3.00653

    side BC= 0.6842

    square tr ABC= 0.318365
    Triangle=

    dot1= (12.9111, 11.1)

    dot2= (32.9333, 3.455)

    dot3= ( 6.966,4.9056)

    side AB= 21.4321

    side AC= 8.58574

    side BC= 26.0078

    square tr ABC= 84.7379
    Triangle=

    dot1= (1.91111, 5.1)

    dot2= (3.9333, 3.455)

    dot3= ( 6.66, 4.056)

    side AB= 2.60677

    side AC= 4.86229

    side BC= 2.79215

    square tr ABC= 2.85038
    num_tr_true= 10


    Неформатируемый ввод-вывод

    данных в двоичном режиме
    Несмотря на простоту чтения ( и записи) форматироанных текстовых файлов , они не являются эффективным способом обработки файлов. Иногда просто необходимо сохранять неформатированные двоичные данные , а не текст. Поэтому С++ поддерживает ряд функций файлового ввода-вывода в двоичном режиме , которые могут выполнять операции безформатированных данных.
    Для выполнения двоичных операций файлового ввода-вывода необходимо открыть фйл с использованием спецификатора режима ios::binary.
    В общем случае существует два способа записи неформатированных двоичных данных в файл и считывания их из файла. Первый состоит в использовании функции-члена put() (для записи байта в файл) и функции-члена get() (для считывания байта из файла). Второй способ предполагает применение «блочных» С++ функций ввода-вывода read() и write().
    //arb2014_binary_get_put

    #include "stdafx.h"

    #include

    #include

    using namespace std;
    int main()

    {

    ifstream in("arb.txt");

    ofstream out("out.bin", ios::binary);

    if(!in)

    {

    cout<<"can't open file arb!"<
    system("pause");

    exit(1);
    }

    char ch;

    while(in>>ch)

    out.put(ch);

    in.close();

    out.close();

    ifstream in1("out.bin",ios::binary);

    ofstream out1("out1.txt");

    if(!in1)

    {

    cout<<"can't open file out.bin"<
    system("pause");

    exit(1);
    }

    while(in1.get(ch))

    out1<
    out<
    in1.close();

    out1.close();

    system("pause");

    return 0;

    }
    Файл arb.txt

    abc def Kazan State University
    Файл out1.txt

    abcdefKazanStateUniversity
    т.к. cin пробелы пропускает, то в бинарных файлах

    нет пробелов.

    В этом случае необходимо текст записывать блоками.

    #include "stdafx.h"

    #include

    #include

    #include

    using namespace std;

    int main()

    {

    const int n=80;

    ifstream in("arb.txt");

    ofstream out("out.bin", ios::binary);

    if(!in)

    {

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

    system("pause");

    exit(1);

    }

    char mch[n];

    in.getline(mch,80);

    //cout<<"mch="<
    int k=strlen(mch);

    //cout<<"k= "<
    in.close();
    out.write((char*) mch, k*sizeof(char));

    out.close();
    ifstream in1("out.bin",ios::binary);

    ofstream out1("out1.txt");
    if(!in1)

    {

    cout<<"can't open file!"<
    system("pause");

    exit(1);

    }

    char ch;

    while(in1.get(ch))

    out1<
    out1<
    in1.close();

    out1.close();

    system("pause");

    return 0;
    }
    1   2   3   4   5   6   7   8   9


    написать администратору сайта