Сегодня большой день! Я все таки решился осветить такой язык программирования как 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; }