C++: Вводный курс или «Дорогу новеньким»!

Сегодня большой день! Я все таки решился осветить такой язык программирования как C++. Сказать честно, после .NET, решать задачи на данном языке программирования немного непривычно и не удобно. Однако во всем есть свои плюсы и каждому свое. Рассматривать данный язык мы будем на примере самых простых задач.

Рассматривать традиционно первую задачу «Hello, world!» мы не будем. Перейдем к более практическим задачам.

Задача №1
Дан математический пример ((x * 2) + (x ^ 3) / 2) — x. Где ‘x’ — задается пользователем. Нужно решить пример, вывести результат на экран. Так же если результат равен нулю, написать слово «Hello!».

Решение №1
Сейчас мы не будем писать оптимальный алгоритм решения данной, задачи. Решим ее немного криво, однако продемонстрируем побольше возможностей языка С++. Сразу сделаю ремарку, что все задачи будут решаться в среде VS2008, консольное приложение.

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
   int x = -1;
   printf("Enter 'x': ");
   scanf("%d", &x);

   int x_3 = 1;
   for (int i = 0; i < 3; ++i)
    x_3 *= x;
	
   float drob = ((float)((x * 2) + x_3)) / 2;
   float result = drob - x;
	
   printf("Result: %.2f\n", result);
   if (result == 0)
     printf("Hello!");
	
    return 0;
}

Теперь несколько комментариев. Сразу хочу дать рекомендацию отказаться от использования cin, cout для ввода и вывода данных, поверьте это удобно лишь при решении простых задач. Используйте printf, scanf.
Как видно из примера синтаксис данных функций такой: Первым аргументом идет строка которую мы выводим с ключевыми символами %d, %f, %c (число, число с плавующей точкой, символ) и т.д. Если таких спец символов нет, то больше параметров функция не имеет, в противном случае, далее идут значения данных ключевых символов. Например %.2f означает что параметр является числом с плавающей точкой, и мы будем выводить два знака после запятой. Пожалуй еще один непонятный момент это строка: float drob = ((float)((x * 2) + x_3)) / 2;.

Зачем это нужно? Смотрите. 'х' - переменная целого типа. Степень числа 'x' так же переменная целого типа. Однако наша операция - деление, а значит число у нас может получиться вещесвенное. Это значит что результат деления является типом float. Теперь еще один момент: в дроби у нас и числитель и знаменатель целочислены, это значит что результат работы оператора '/' будет являтся целой частью от деления числителя на знаменатель (например 3 / 2 = 1). Для такого что бы результат деления был верный (3 / 2 = 1.5) нам нужно заранее явно переопределить тип числителя в вещесвенный, это делается путем приписывания типа float перед значением числителя. Дальнейший код думаю интуитивно понятен.

Задача №2
Дана матрица, записанная в текстовом файле file.txt. В нем первые два числа - количество строк и солбцов матрицы, далее значения элементов матрицы. Элементы матрицы - целые числа. Необходимо поменять все максимальные значения матрицы (если оно не одно) на минимальное значение элемента данной матрицы. Не буду подробно описывать решения. Думаю комментарии дадут достаточно информации.

Решение №2

//file.txt
//3 4
//9 2 3
//1 6 3
//1 2 3
//4 4 4
#include "stdafx.h"

//Функция которая заменит максимум на минимум
void replace(int min, int max, int**mas, int cols, int row)
{
  for (int i = 0; i < row; i++)
  {
   for (int j = 0; j < cols; j++)
   {
    if (max == mas[i][j])
     mas[i][j] = min;
    printf("%d\t", mas[i][j]);
   }
   printf("\n");
  }
}

int _tmain(int argc, _TCHAR* argv[])
{
  //Указатель на файл
  FILE* f = fopen("file.txt","r");
  int cols = 0, row = 0;
 
  //Считаем число столбов и строк
  fscanf(f, "%d", &cols);
  fscanf(f, "%d", &row);

  //Создадим матрицу
  int** mas = new int*[row];
  for (int i = 0; i < row; i++)
    mas[i] = new int[cols];

  //Считываем матрицу
  for (int i = 0; i < row; i++)
    for (int j = 0; j < cols; j++)
      fscanf(f, "%d", &mas[i][j]);
	
  //Освободим наш файл
  fclose(f);

  int min = mas[0][0], max = mas[0][0];

  //Найдем мин. и макс. элементы
  for (int i = 0; i < row; i++)
   for (int j = 0; j < cols; j++)
   {
     if (min > mas[i][j])
       min = mas[i][j];
     if (max < mas[i][j])
       max = mas[i][j];
   }
	
  //Вызовим нашу функцию
  replace(min, max, mas, cols, row);
	
  return 0;
}
Запись опубликована в рубрике C++ с метками , , , . Добавьте в закладки постоянную ссылку.