Мои упражнения и задания

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

  1. «Фильмотека»
  2. «Студенты»
  3. «Сотрудники»
  4. «Библиотека»
  5. «Теннисисты»
  6. «Вкладчики банка»
  7. «Владельцы машин»
  8. «Склад»
  9. «Лекарства в таблетках»
  10. «Хиты месяца»
  11. «Музыка на CD»
  12. «Кремы для лица»
  13. «Детская косметика»
  14. «Туалетная вода»
  15. «Лекарства в ампулах»
  16. « Женская обувь»
  17. «Мужские рубашки»
  18. "Декоративная пудра"
  19. "Детские мягкие игрушки "
  20. "Магазин сувениров"
  21. "Магазин ручных часов"
  22. "Магазин детской обуви"
  23. "Магазин тетрадей и блокнотов"
  24. "Магазин ламп"

Чистый C

  1. Потоки.
    Выполнить примеры из лекции: чтение, запись, установка указателя на запись текстового файла с формированием строки для записи в виде текущего времени. Использовать всевозможные функции для чтения-записи (строковые, символьные в том числе)
  2. В дальнейшем все задания выполнять с использованием ввода с клавиатуры и ввода из файла, вывода на экран и вывода в файл.
  3. Стек
    Выполнить пример из лекции: создание стека и его тестирование. Внести изменения в информационную часть компонент стека выдав каждому студенту свои структуры :"студент", "служащий", "книга ", "автомобиль", "альбом песен", "фильм" и т.д. Вывести адреса компонент стека, компонент структуры, используемой в стеке. Объяснить полученные результаты.

От C к С++ (без ООП)

  1. Доступ к локальным переменным, скрытым локальными с тем же именем.
    Выполнить пример из лекции.
    #include <iostream>
    #include <stdlib.h>
    int k=5, m=3;
    int f1()
    {int k=::m; int m=7; printf("k=%d \n m=%d \n",k,m);}
    int main(int argc, char *argv[])
    { f1(); system("PAUSE"); return 0;}

    Каждому студенту использовать свои структуры.
  2. Операторы new, delete
    Выполнить пример из лекции.
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    int main(int argc, char *argv[])
    {int *i_ptr; double *d_ptr; char *string; int str_len=80;
    struct ExpMouse {int kk; int kk1;double ff; char cc;};
    struct ExpMouse *ss;
    i_ptr=new int; d_ptr=new double (3.1415); string=new char [str_len] ;
    ss=new ExpMouse;
    if (!(i_ptr && d_ptr && string))
    { printf("There is not enough memory!"); return 1;}
    string[0]='H'; string[1]='i'; string[2]='!';
    printf("i_ptr=%p *i_ptr=%d\n", i_ptr, *i_ptr); delete i_ptr;
    printf("d_ptr=%p *d_ptr=%f\n", d_ptr, *d_ptr); delete d_ptr;
    printf("string=%p string contents=%s\n", string, string);delete string;//delete[str_len] string;
    printf("ss=%p &ss.kk=%p \n",ss, &ss->kk);
    printf("&ss.kk1=%p &ss.ff=%p &ss.cc=%p \n",&ss->kk1,&ss->ff, &ss->cc);
    delete ss;
    system("PAUSE");
    return 0;
    }

    Каждому студенту использовать свои структуры. Вывести адреса структур и ее компонент. Объяснить результат.
  3. Перегрузка функций
    Выполнить примеры из лекции.
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    using namespace std;
    void print(int i)
    {printf("%d \n", i);}
    void print(double x)
    {printf("%f \n", x);}
    void print(char* s)
    {printf("%s \n", s);}
    struct str1
    { int k;
    char s[20];
    } ;
    void print(struct str1 ss )
    {printf("%d, string= %s ",ss.k, ss.s);}
    int main(int argc, char *argv[])
    { int j=5; double e=2.7183; float pi=3.1415926;
    print(j);
    print(e) ;
    print(pi) ;
    print("Hi, there!");
    struct str1 pp={100,"rtyuio"};
    print(pp);
    system("PAUSE");
    return 0;
    }

    Каждому студенту использовать в примере перегрузки свои структуры (см. Стек)
  4. Шаблоны функций.
    Выполнить примеры из лекции.
    #include <iostream>
    #include <string.h>
    #include <stdio.h>

    template <class T> void swap(T &a, T &b)
    { T c; c=b; b=a; a=c; }
    int main()
    { int i=0, j=1; double x=0.0, y=1.0;
    char *s1="Hi, I am the first string!", *s2="Hi, I am the second string!";
    printf ("Up to an exchange: \n i=%d j=%d\n x=%f y=%f\n s1=%s s2=%s\n",
    i, j, x, y, s1, s2) ;
    swap(i,j); swap(x,y); swap(s1,s2) ;
    printf ("after an exchange: \n i=%d j=%d\n x=%f y=%f \n s1=%s s2=%s \n",
    i, j, x, y, s1, s2) ;
    system("PAUSE");
    return 0;
    }

  5. Перегрузка операторов
    Выполнить примеры из лекции.
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    const int MAX_STR_LEN=80;
    struct String
    { char s [MAX_STR_LEN] ; int str_len; };
    String operator+ (String s1, String s2)
    { String TmpStr;
    if ((TmpStr.str_len=s1.str_len+s2.str_len) >=MAX_STR_LEN)
    { TmpStr.s[0]='\x0' ; TmpStr.str_len=0 ; return TmpStr; }
    strcpy(TmpStr.s, s1.s); strcat(TmpStr.s, s2.s); return TmpStr; }

    int main(int argc, char *argv[])
    {
    String str1, str2, str3 ;
    strcpy(str1.s, "1111111111111111 - "); str1.str_len=strlen(str1.s) ;
    strcpy(str2.s, "2222222222222222!"); str2.str_len=strlen(str2.s) ;
    printf ("str1.str_len=%d, str1.s =%s\n",
    str1.str_len, str1.s);
    printf ("str2.str_len=%d, str2.s =%s\n",
    str2.str_len, str2.s);
    str3=str1+str2;
    printf ("str3.str_len=%d, str3.s=%s\n",
    str3.str_len, str3.s);
    system("PAUSE");
    return 0;
    }

    Произвести перегрузку опреатора сложения для сложения своих структур.

ООП в С++

  1. Выполнить пример из лекции
    class MyClass
    {int i; int j; public:
    int state; int Get_i(); int Get_j(); } ;
    Int MyClass::Get_i () {return i;}
    int MyClass::Get_j () {return j;} int main()
    { int m, n, n1 ;
    MyClass obj, obj 1 ;
    MyClass * obj _ ptr =& obj ;
    m = obj . i ;
    m = obj _ ptr -> i ;
    n = obj . state ;
    m = obj _ ptr - >state ;
    m=obj .Get_i( ); // OK!
    n=obj_ptr -> Get_j(); // OK!
    nl=objl.Get_j(); //OK!
    }
  2. Выполнить пример "Мудрые строки" из лекции
    #include <stdio.h>
    #include <string.h>
    class WiseString
    { const char * s ; int len ;
    Public :
    void Assign ( const char * String )
    { s=String; len =strlen(s); }
    void TellAboutYourself () const ;
    }
    void WiseString::TellAboutYourself() const
    { const char * fmt = " Я - умная строка! Могу рассказать Вам о себе. \ n "
    " Вот сообщение, которое я храню :\ n % s \ n "
    " Длина сообщения равна % d символ ов.\ n ";
    printf ( fmt , s , len );}
    int main ()
    { WiseString str 1, str 2;
    str 1 Assign ("Привет, программисты!");
    str 2 Assign ("Да здравствует ООП!");
    str 1. TellAboutYourself ();
    str2.TellAboutYourself(); return 0;
    }

    Добавьте следующие функции в класс:
  3. Выполнить пример из лекции дружественные функции и классы

    class MyClass 1; // Предварительное объявление класса.

    class MyClass

    { int j ;

    friend void IncJ (MyClass &);

    friend MyClass 1; };

    class MyClass1

    { int j;

    public:

    void MakeJEqual( MyClass &);

    }

    void IncJ ( MyClass & obj )

    { obj . j ++; }

    void MyClass1::MakeJEqual (MyClass &obj )

    {j = obj . j ; }

    int main()

    { MyClass obj;

    MyClass1 obj1;

    IncJ ( obj );

    obj 1. MakeJEqual ( obj );

    }

    Добавьте следующие функции в класс:

  4. Выполнить пример перегрузки операторов для классов из лекции

    class Vector

    { int X, Y;

    friend Vector& operator--(Vector&);

    friend Vector operator-(const Vector&, const Vector&);

    public:

    void Assign(int x, int y) {X=x; Y=y;}

    Vector operator++();

    Vector operator++(int);

    Vector operator+(const Vector&) const;

    void print() const

    {printf ("Coordinates X=%d, Y=%d\n", X, Y) ; } };

    Vector Vector::operator++()

    {X++; Y++; return *this; }

    Vector Vector::operator++(int)

    { Vector vec_tmp=*this ;

    X++; Y++; return vec_tmp ;}

    Vector Vector::operator+(const Vector& vec ) const

    { Vector vec_tmp=*this; // сложить...

    vec_tmp.X+=vec.X; vec_tmp.Y+=vec.Y;

    return vec_tmp; }

    Vector& operator--(Vector& vec)

    {vec.X--; vec.Y --; return vec }

    Vector operator-(const Vector& vecl, const Vector& vec2)

    { Vector vec_tmp=vecl; vec_tmp.X-=vec2.X;

    vec_tmp.Y-=vec2.Y; return vec_tmp; }

    const int NUMBER_OF_VECTORS=5;

    int main( )

    { Vector v_array [NUMBER_OF_VECTORS], v1;

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

    { v_array[i].Assign(i,i+1); printf (" value to a vector =%d\n", i);

    v_array[i].print(); }

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

    { --v_array[i] ; printf (" Have deducted from a vector #%d an individual vector\n", i); v_array [ i ].print() ; }

    v1.Assign(0, 0) ; printf ("The sum of all vectors of a massive:\n");

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

    { v1=v1+v_array[i] ; v1.print () ;

    system("PAUSE"); return 0; }

  5. Выполнить пример перегрузки операторов для классов из лекции
    #include <stdlib.h>
    #include <iostream.h>
    class Point
    { int x, y;
    public:
    Point(int xx = 0, int yy = 0) {x = xx; y = yy; }
    friend istream& operator>>(istream&, Point&);
    friend ostream& operator<<(ostream&, Point&); };
    istream& operator>>(istream &is, Point &p)
    {is >> p.x >> p.y; return is;}
    ostream& operator<<(ostream &os,Point &p)
    {
    os<< '('<< p.x<< ", "<< p.y<<')' ; return os; }
    int main()
    { Point p;
    cout<< "Enter point coordinates: ";cin>> p;
    cout<< "The point values are " << p;
    system("PAUSE"); return 0;}
  6. Выполнить пример форматированного вводв-вывода из лекции
    #include <vcl.h>
    #pragma hdrstop
    #pragma argsused
    #include <stdlib.h>
    #include <iostream.h>
    #include <condefs.h>
    int main()
    { char str [16];
    cout<< "Enter something: ";
    cin.width(16);
    cin>> str;
    cout.width(32);
    cout<< str<< "\n\n";
    int h = 7, m = 9, s = 0;
    cout.fill('0'); cout << "Time is ";
    cout.width (2); cout << h << ' : ' ;
    cout.width (2); cout << m<< ' : ' ;
    cout.width (2) ;cout<< s<< ".\n\n";
    cout.fill (' ');
    double d = 3.14159265358979;
    float f = 27182.81828;
    cout.precision (5);
    cout << f << '\n';
    cout << d << '\n';
    cout .precision (4) ;
    cout << f << '\n';
    cout.setf(ios::fixed);
    cout<< f<<'\n';
    system("PAUSE");
    return 0;
    }
    1. Запишите комментарии к каждой строке программы.
    2. Организуйте этот ввод-вывод в цикле, заменив ввод чисел в программе вводом в режиме диалога.
  7. Выполнить пример форматирования с помощью манипуляторов из лекции
    #include <iostream.h>
    #include <iomanip.h>
    #pragma hdrstop
    #include <condefs.h>
    #include <vcl.h>
    #pragma argsused
    // User manipulator
    ostream& shell(ostream &os)
    {os<< '\a';
    return os; }
    int main()
    {
    cout<<shell; // Test
    long l = 123456;
    cout<< "Hex: "<< hex<< l<< endl
    <<"Oct: "<< oct<< l<< endl
    << "Dec: " << dec << l << endl;
    // Parametrize manipulator
    int h=12, m=5, s=0; //
    cout << "The time is " << setfill('0')
    << setw(2) << h << ':'
    << setw(2) << m << ':'
    << setw(2) << s << setfill('0') << endl;
    system("PAUSE");
    return 0;
    }
    1. Запишите комментарии к каждой строке программы.
    2. Организуйте этот ввод-вывод в цикле, заменив ввод чисел в программе вводом в режиме диалога.
  8. Выполнить пример форматирования с помощью флагов из лекции
    #include <vcl.h>
    #pragma hdrstop
    // Flags.n??: Formattings flags of streams
    #include <iostream.h>
    #include <iomanip.h>
    #include <condefs.h>
    #pragma argsused
    int main()
    { // Demo flag skipws.
    long l; cout<< "Enter an integer: ";
    cin.unsetf(ios::skipws); cin >> l;
    if (cin)//cin == NULL.
    cout<< "You entered "<< l<< endl;
    else { cout << "Incorrect input."<< endl;
    cin.clear (); } cout<<endl;
    // Demo flag hex oct dec
    l = 8191; cout.setf(ios::hex, ios::basefield);
    cout.setf(ios::showbase | ios::showpos);
    cout << "hex: " <<l << oct << " oct: "<< l << dec
    << " dec: " << l << endl; cout << endl;
    // Demo flag for numbers
    double d1 = 1.0e9, d2 = 34567.0;
    cout <<"Default: " << d1 << " "<<d2 << endl;
    // Out Decimal point.
    cout.setf(ios::showpoint);
    cout << "Decimal: " << d1<< " " << d2 << endl;
    // Sbros out +.
    cout.setf(ios::fixed, ios::floatfield | ios::showpos);
    cout << "Fixed: " << d1 << " " << d2 << endl;
    cout<< endl;
    //Out boolen as "true/false".
    bool b = true;
    cout.setf(ios::boolalpha) ;
    cout << "Boolean values: " << b << ' ' << !b << endl;
    system("PAUSE");return 0; }
    1. Запишите комментарии к каждой строке программы.
    2. Организуйте этот ввод-вывод в цикле, заменив ввод переменных в программе вводом в режиме диалога.
    3. Экспериментальным путем установите наибольшее целое для корректного ввода.
  9. Выполнить пример из лекции
    #pragma argsused
    #include <vcl.h>
    #pragma hdrstop
    class Tim
    { int hr, min;
    public:
    Tim(int h, int m): hr(h), min(m) {}
    Tim(const Tim &src) //
    { hr = src.hr; min = src.min; } };
    int main()
    { Tim start (17,45); //
    Tim current = start; //
    system("PAUSE");
    return 0;
    }
    1. Введите в класс свою структуру как закрытые члены-данные.
    2. Добавьте перегруженный конструктор с инициализацией в теле функции.
    3. Перегрузите операторы вводавывода для измененного класса.
    4. Запишите комментарии к каждой строке программы.
  10. Выполнить пример из лекции
    #include <iostream>
    #include <vcl.h>
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #pragma argsused
    class Tim { int hr, min;
    public:
    Tim(int h, int m): hr(h), min (m) {}
    Tim &operator=(const Tim&); //
    };
    Tim &Tim::operator=(const Tim &src)
    { if(&src == this) //
    printf("Self assignment!");
    hr = src.hr;
    min = src.min;
    //}
    return *this;} //
    int main() {
    Tim start (17,45);
    Tim current (18, 0);
    start = current; //
    system("PAUSE");
    return 0;
    }
    1. Введите в класс свою структуру как закрытые члены-данные.
    2. Перегрузите оператор присваивания.
    3. Перегрузите операторы вводавывода для измененного класса.
    4. Запишите комментарии к каждой строке программы.
  11. Выполнить пример из лекции
    #include <cstdlib>
    #include <iostream>
    #pragma hdrstop
    #pragma argsused
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #define trace(msg) printf(#msg "\n");
    #define MaxStr 32
    using namespace std;
    void *operator new[ ](size_t size) //
    { trace(Global new [ ] .); return malloc(size); }
    void operator delete[ ](void *p) //
    { trace(Global delete [ ].); free(p) ; }
    class Hold { char *str; public: Hold(const char*) ; ~Hold() ;
    void *operator new(size_t); //
    void operator delete(void*); //
    void Show(void){ printf("%s\n", str);} };//class Hold
    Hold::Hold(const char *s)//
    { trace (Constructor.) ; str = new char[MaxStr]; //
    strncpy(str, s, MaxStr); str[MaxStr-1] = 0; }
    Hold::~Hold () //
    { trace(Destructor.); delete[] str; //
    }
    void *Hold::operator new(size_t size)
    {trace(Class new.);return malloc (size);}
    void Hold::operator delete(void *p)
    {trace(Class delete.);free(p) ;}
    void Func() //
    {Hold funcObj ("This is a local object in Func.");
    funcObj.Show() ;}

    int main()
    {
    Hold *ptr;
    Hold mainObj ("This is a local object in main.");
    mainObj.Show ();
    trace (*);
    ptr = new Hold("This is a dynamic object.");
    ptr->Show();
    delete ptr;
    trace (*); Func() ; trace (*);system("PAUSE");
    return EXIT_SUCCESS;
    }

    1. Введите в класс Hold свою структуру как закрытые члены-данные.
    2. Перегрузите член-функцию Show.
    3. Измените параметры функции trace.
    4. Запишите комментарии к каждой строке программы.
  12. Выполнить пример из лекции "Простое наследование"
    #include <stdio.h>
    #include <string.h>
    class Time { //
    int hr, min; public:
    Time(int h=12, int m=0): hr(h), min(m) {}
    void SetTime(int h, int m) { hr = h; min = m; }
    void Show() ;
    }; // class Time
    void Time::Show() { printf("%02d:%02d", hr, min); }
    class Alarm: public Time { //
    char *msg; public:
    Alarm(char*);
    ~Alarm() { delete [] msg; }
    void SetMsg(char*);
    void Show(); //
    };
    Alarm::Alarm(char *str)
    { msg = new char[strlen (str) + 1]; strcpy(msg, str); }
    void Alarm::SetMsg(char *str)
    { delete [] msg; msg = new char[strlen (str) + 1];
    strcpy ( msg, str); }
    void Alarm::Show() { Time::Show(); //
    printf(": %s\n", msg); } //class Alarm
    int main () {
    Alarm a = "Test Alarm!!!"; //
    а. Show ();
    a.SetTime(7, 40); //
    а. Show () ; а. SetMsg("It's time!”); //
    a.Show();
    system("PAUSE"); return 0; }
    1. Измените базовый класс, добавив дату.
    2. Измените производный класс, добавив звуковой сигнал
    3. Запишите комментарии к каждой строке программы.
  13. Выполнить пример из лекции "Сложное наследование"
    #include <stdio.h>
    #include <string.h> //
    class Time { protected: int hr, min;
    public:
    Time(int h=12, int m=0): hr(h), min (m):{}
    void Show() ; }; // end class Time
    void Time::Show() { printf("%02d:%02d\n", hr, min); }
    //
    class Message { protected: char *msg; public:
    Message(char*) ;
    ~Message () { delete[]msg; }
    void Show () ; }
    Message::Message(char*msg) { msg = new char[strlen(str)+1]; strcpy(msg, str); }
    void Message::Show() { printf(%s\n", msg); } //
    class Alarm: public Time, public Message { public:
    Alarm(char* str, int h, int m): Time(h, m), Message(str) {}
    void Show (); };
    Alarm::Show() //
    { printf("%02d:%02d: %s\n", hr, min, msg); }
    int main() {
    Alarm a("Test Alarm!!!", 11, 30);
    a.Show() ;
    system("PAUSE"); return 0; }
    1. Измените базовый класс Time, добавив дату.
    2. Измените базовый класс Message, добавив вопрос.
    3. Измените производный класс, добавив звуковое сообщение
    4. Запишите комментарии к каждой строке программы.
  14. (Услышал от Маковецкого А.Ю.) Разработайте сложный класс и его тестирование по следующей схеме:
    1. Абстрактный класс: шахматная фигура.
    2. Два базовых класса: слон и ладья.
    3. Производный класс: ферзь.