Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Легкое решение задач по математике и физике! отличия С от С++



  2005-2006 Учебный физико-математический студенческий центр

Легкое решение задач по математике и физике! #8

      
 

Здравствуйте, уважаемые наши подписчики!

Главная
О нашей работе
Регистрация заказа
Запись на  курсы ЕГЭ
Стоимость работы
Способы оплаты
Обратная связь

 
Подпишитесь на нашу рассылку на Subscribe.Ru
Легкое решение задач по математике и физике!
 

logo 



  Всех с прошедшим днём смеха! С 1-ым апреля!!!
     Хорошего Вас настроения и удачного дня!

В прошлый раз мы разобрали основы языка С++.
Давайте теперь углубимся в изучение языка.


Представляю Вам 8-ой выпуск рассылки.

Итак, чем же отличается С от С++?
Продолжаем разговор об отличиях.


Второе отличие С от С++
   предпочитайте <iostream.h> вместо <stdio.h>

Да <stdio.h> это удобно. Да это эффективно. Да Вы знаете как ими пользоваться. Но! функции  типа scanf, printf... имеют много недостатков. В частности, они не являются типо-безопасными, они не расширяемые, а всё это часть пути под названием С++

эти функции времён середины 50-х и их время давно прошло. Смотрите как легко выглядит код на современном С++:

int i;
Rational r; // r - вещественное

...

cin >> i >> r;  // ввод чисел с клавиатуры
cout << i << r; // вывод их на экран

Чтобы этот код скомпилировать необходимо определить класс Rational рациональных чисел и его операторы: operator>> и operator<<.

class Rational {
public:
  Rational(int numerator = 0, int denominator = 1);

  ...

private:
  int n, d;    // numerator and denominator

friend ostream& operator<<(ostream& s, const Rational& r);
};

ostream& operator<<(ostream& s, const Rational& r)
{
  s << r.n << '/' << r.d;
  return s;
}


Всё!!! Попробуйте такое проделать со
scanf и printf. :)

Таким образом, получается что для функций cin и cout интерфейс выглядит одинакого как для простого типа int так и для пользовательского класса Rational. Это не фантастика, это современный язык! Пусть компилятор заботится о том, как выводить на экран объекты того или иного класса (типа), а так же как их считывать с клавиатуры.


Для завершения рассылки приведём небольшую задачку, типичную для курсовых работ математических факультетов!
Требуется создать класс символьной строки и класс строки hex чисел. Оба класса должны обладать всеми необходимыми методами: считывание, вывод на экран, операторы и т.д. Кроме того класс HexStr  должен уметь выдавать на экран значение в двоичном и десятичном виде.

Код:

// отключаем ненужные предупреждения
#pragma warn -inl
#pragma warn -lvc

// подключаем необходимые системные библиотеки
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

// класс символьная строка
class SymbStr {
 private:
   int ident; // идентификатор
   char *str; // сама строка
   int size;  // её размер
 public:
   // пустой конструктор
   SymbStr() {size = 0; str = NULL; ident = 0;};

   // конструктор по значению
   SymbStr(char* string) {
      size=0;
      for (int i=0; ;i++)
      // вычисляем размер, т.е. если i-ый элемент является терминирующим нулём ('\0'),
      // то значит это последний элемент
         if (string[i]=='\0') {
            size=i;
            break;
         }
      str = NULL;
      set(string, size); // создаём строчку
   };

   // конструктор копирования
   SymbStr(SymbStr& copy) {
      str = NULL;
      *this = copy;
   };

   // деструктор
   ~SymbStr() { if(str) delete[] str; };

   // изменить нашу строку заданной строкой string
   void set(char* string, int _size) {
      size = _size;
      if (str) delete[] str; // удаляем старую строку
      str = new char[size]; // выделяем память под новую
      for (int i=0; i<size; i++) str[i] = string[i]; // копируем строчки
   };

   // на экран
   void print() {
      for (int i=0; i<size; i++) cout << str[i];
   };

   // оператор копирования
   SymbStr& operator= (SymbStr& copy) {
      set(copy.str, copy.size);
      return *this;
   };
};

// класс hex строка
class HexStr {
 private:
   int ident; // идентификатор
   char *str; // сама строка
   int size;  // её размер
 public:
   // пустой конструктор
   HexStr() {size = 0; str = NULL; ident = 0;};

   // конструктор по значению
   HexStr(char* string) {
      size=0;
      for (int i=0; ;i++)
      // здесь к терминирующему нулю добавляется ещё проверка на hex символы
         if (string[i]=='\0' || hex_check(string[i])==-1) {
            size=i;
            break;
         }
      str = NULL;
      set(string, size);
   };

   // конструктор копирования
   HexStr(HexStr& copy) {
      str = NULL;
      *this = copy;
   };

   ~HexStr() { if(str) delete[] str; };

   // строка может содержать только символы
   // 0 1 2 3 4 5 6 7 8 9 A B C D E F
   int hex_check(char ch) {
      int ret = -1;
      if (ch=='0') ret=0;
      if (ch=='1') ret=1;
      if (ch=='2') ret=2;
      if (ch=='3') ret=3;
      if (ch=='4') ret=4;
      if (ch=='5') ret=5;
      if (ch=='6') ret=6;
      if (ch=='7') ret=7;
      if (ch=='8') ret=8;
      if (ch=='9') ret=9;
      if (ch=='A') ret=10;
      if (ch=='B') ret=11;
      if (ch=='C') ret=12;
      if (ch=='D') ret=13;
      if (ch=='E') ret=14;
      if (ch=='F') ret=15;
      // ret содержит десятичное значение ch
      // или -1 в случае если ch не является 16-ричным числом
      return ret;
   };

   // изменить нашу строку заданной строкой string
   void set(char* string, int _size) {
      if (!_size) return;
      size = _size;
      if (str) delete[] str; // удаляем старую строку
      str = new char[size]; // выделяем память под новую
      for (int i=0; i<size; i++) str[i] = string[i]; // копируем строчки
   };

   // на экран в 16-ричном виде
   void print() {
      for (int i=0; i<size; i++) cout << str[i];
   };

   // на экран в 10-тичном виде
   void printDEC() {
      // перевод чисел в десятичную систему осуществляется путем составления
      // степенного ряда с основанием той системы,
      // из которой число переводится.
      unsigned int res = 0;
      for (int i=0; i<size; i++)
      {
         int stepen = pow(16,size-i-1);
         int chislo = hex_check(str[i]);
         res += chislo * stepen; // затем подсчитывается значение суммы.
      }
      cout << res;
   };
   // на экран в 2-ичном виде
   void printBIN() {
      char dest[100];
      strcpy(dest,"");
      for (int i=0; i<size; i++) {
       // составляем тетрады
       // затем используя контектенацию строк (объединение)
       // вычисляем двоичное представление числа
       if (str[i] == '0') strcat(dest, "0000");
       if (str[i] == '1') strcat(dest, "0001");
       if (str[i] == '2') strcat(dest, "0010");
       if (str[i] == '3') strcat(dest, "0011");
       if (str[i] == '4') strcat(dest, "0100");
       if (str[i] == '5') strcat(dest, "0101");
       if (str[i] == '6') strcat(dest, "0110");
       if (str[i] == '7') strcat(dest, "0111");
       if (str[i] == '8') strcat(dest, "1000");
       if (str[i] == '9') strcat(dest, "1001");
       if (str[i] == 'A') strcat(dest, "1010");
       if (str[i] == 'B') strcat(dest, "1011");
       if (str[i] == 'C') strcat(dest, "1100");
       if (str[i] == 'D') strcat(dest, "1101");
       if (str[i] == 'E') strcat(dest, "1110");
       if (str[i] == 'F') strcat(dest, "1111");
      };
      printf("%s", dest);
   };

   // оператор копирования
   HexStr& operator= (HexStr& copy) {
      set(copy.str, copy.size);
      return *this;
   };
};


int main()
{
   clrscr();

   cout << "1. символьная строка" << endl;
   cout << "2. hex строка" << endl;
   cout << "3. выход" << endl;
   cout << "введите число: ";
   int menu;
   do {
      cin >> menu;
   } while (menu!=1 && menu!=2 && menu!=3);

   if (menu==1) {
      clrscr();
      char buf[100];
      cout << "введите строку: "; cin >> buf;

      SymbStr stroka1(buf), stroka2;
      stroka2 = stroka1;

      cout << endl << "ваша строка: ";
      stroka2.print();
   }

   if (menu==2) {
      clrscr();
      char buf[100];
      cout << "введите hex строку большими буквами, например FE1A: ";
      cin >> buf;

      HexStr hex(buf);
      cout << endl << "hex:     ";hex.print();
      cout << endl << "decimal: ";hex.printDEC();
      cout << endl << "binary:  ";hex.printBIN();
   }

   if (menu!=3) getche();
   return 0;
}

Работоспособность данной программы проверялась в среде Borland С++ 4.5

Решение подобных задач вы можете заказать на этой страничке.
 
2005-2007 help-studia andy kras




В избранное