Форум программистов, компьютерный форум CyberForum.ru

Распознание кода - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Работа со структурами http://www.cyberforum.ru/cpp-beginners/thread1083512.html
Помогите написать программу подобного рода: Работа со структурами. Программа должна содержать функции, необходимые для выполнения поставленной задачи. Задача:Даны сведения о 16 автомобилях: марка, номер и фамилия владельца. Определить фамилию владельца и марку по номеру. Сведения: Reno AK 6592 KK Мендус Mersedes AK 6593 KK Сизко BMV AK 6594 KK Андреев...
C++ Дано список записей с полями:фамилия ученика и дата рождения. Найти тех которые родились зимой Помогите пожалуйста, задачу надо сдать через пол часа!!! Заранее спасибо http://www.cyberforum.ru/cpp-beginners/thread1083504.html
C++ В матрице найти максимальный и минимальный элемент,переставить строки в которых они находится
Здравствуйте уважаемые форумчане. Я столкнулся с проблемой вот такой: Разработайте программу обработки массивов. Входные данные введите с клавиатуры. Результаты работы программы отобразите на экране. Я только учусь так что еще пока все плохо. Матрица размером N*N Не могу понять как в матрице найти максимальный и минимальный элемент,переставить строки в которых они находится и если они в одной...
Функция stod() выводит только 4 знака после запятой C++
Как сделать так, чтобы функция stod() при преобразовании строки string в число double не ограничивала количество знаков после запятой четырьмя. Например, в этом примере: // stod example #include <iostream> // std::cout #include <string> // std::string, std::stod int main () { std::string orbits ("365.24 29.53"); std::string::size_type sz; // alias of size_t
C++ Как задать условие, что по окончанию файла завершается цикл? http://www.cyberforum.ru/cpp-beginners/thread1083473.html
Файл присоединен таким образом: ifstream in("in.txt");Что написать в скобках оператора while(), чтобы цикл завершался по окончанию файла?
C++ нужно дополнить - исправить код Понимаю, что задач вроде не сложная, но никак не получается переделать код. Я решил задачу , которую выкладывал ниже, про кол-во островов, кто не помнит вот условие. дана карта в виде массива из 0 и 1, она записана в файле input.txt с таким форматом: в первой строке файла записано 2 числа - кол-во строк и кол-во столбцов, в остальных строках сама матрица эта матрица представляет собой карту... подробнее

Показать сообщение отдельно
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
28.01.2014, 14:10     Распознание кода
Именно. Если есть только вот такие подобные прототипы функций, но нет описания это два варианта - или это макросы, или файлы с описанием функций не подключены. Если этот код работает, то скорее всего первое. Кстати подключаются они точно так же, теми же файлами - с расширением .h. Обнаружить макросы в тексте программы тоже достаточно легко - большой кусок непрерывного зеленого текста должен выделяться.

Вот можете глянуть на досуге (взято отсюда):
Кликните здесь для просмотра всего текста
3.3.3. Макрос - это совсем не функция

Ещё одна распространённая ошибка демонстрируется следующим примером

C
1
2
3
4
5
6
#define SQUARE(val) val * val
void func (int x)
{
  int a;
  a = SQUARE (x+1);
}
текст программы выглядит так, как будто бы в переменную a должен записаться квадрат значения "x+1". Однако это не так. По результату работы препроцессора текст будет выглядеть следующим образом:

C
1
2
3
4
5
void func (int x)
{
  int a;
  a = x+1 * x+1;
}
и с учётом того, что приоритет операции умножения выше, чем приоритет операции сложения, то в переменную a запишется значение "x + 1*x + 1" что эквивалентно "2*x + 1", но никак не "(x+1)*(x+1)". Чтобы избежать таких проблем при написании макросов с параметрами во всех местах использования параметров их надо заключать в круглые скобки. Таким образом правильным вариантом будет следующее:

C
1
2
3
4
5
6
#define SQUARE(val) (val) * (val)
void func (int x)
{
  int a;
  a = SQUARE (x+1);
}
что после препроцессирования превратится

C
1
2
3
4
5
void func (int x)
{
  int a;
  a = (x+1) * (x+1);
}
Но это ещё не всё. Если рассмотреть немного изменённый пример

C
1
2
3
4
#define DOUBLE(val) (val) + (val)
...
  x = DOUBLE(y) * DOUBLE(y);
...
то после препроцессирования

C
1
x = (y) + (y) * (y) + (y);
опять получим неверный код. Дабы избежать этого, нужно ещё и всё тело макроса заключить в круглые скобки:


C
1
2
3
4
#define DOUBLE(val) ((val) + (val))
...
  x = DOUBLE(y) * DOUBLE(y);
...

C
1
x = ((y) + (y)) * ((y) + (y));
И если подвести краткий итог, то рекомендация будет следующая: при написании макросов, которые пишутся в качестве быстрых реализаций вместо функции, лучше всего сразу же заключить в круглые скобки все параметры и само тело макроса - меньше проблем будет в будущем

Однако даже такой вариант не сможет отработать корректно в 100% случаев. Макрос, в теле которого параметр используется более одного раза в общем случае работает некорректно (в том смысле, что отработает не так, как от него ожидали). Если в качестве параметра подать конструкцию, значение которой меняется при каждом обращении, то получим некорректный код. Например, глядя на текст

C
1
a = SQUARE (fgetc(fp));
кажется, что мы прочитаем один символ из файла и возведём его значение в квадрат, однако после препроцессирования получим следующее

C
1
a = ((fgetc(fp)) * (fgetc(fp)));
И таким образом за одно обращение к макросу будет прочитано два байта из файла и их значения будут перемножены, что опять-таки не соответствует тому, чего мы ожидали. Точно так же будет проблема, если в качестве параметра подать выражение типа "i++". О таких моментах надо всегда помнить, а потому пользоваться макросами с осторожностью. Применительно к данному примеру в языке C++ более правильным было бы реализовать inline-функцию, но это уже выходит за рамки данной статьи (если дойдут руки, то напишу отдельную)
 
Текущее время: 18:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru