четверг, 12 апреля 2012 г.

дан текст. определить, является ли он правильной десятичной записью целого числа.

определимся что есть "правильная запись десятичного числа"


  1. "1234" - да
  2. "056" - нет - так принято записывать 8-ричные числа
  3. "abc123" - нет - тут не только цифры
  4. "123.45" - нет - есть запятая, а значит это дробное


думаю, для начала этого достаточно, хотя нужно было бы ещё проверять запись с + и -, а так же научный подход с мантиссой

итак что надо сделать?

1. определить что строка не начинается с "0"
2. определить что в ней только цифры (отсеем дробные и строки с буквами)

этого достаточно чтобы сказать, что это правильная запись десятичного числа

char * s = "тут наша строка";

if (s[0] != '0')
{
     for (int i=0; i < strlen(s); i++)
     {
          bool error = false;
          if (!isdigit(s[i]))
          {
                error = true;
                break;
          }

          if (!error)
          {
                cout << "это правильная запись десятичного числа" << endl;
          }
     }
}

как его увидеть?


Часто при работе с массивами нам нужно видеть их содержимое, поэтому я рекомендую иметь под рукой функцию, которая выводит его содержимое на экран

#define N 100

int a[N];

for (int i = 0; i < N; i++)
{
    cout << "a[" << i << "]=" << a[i] << endl;
}

где взять массив?

Часто решая типовые задачи с массивами, нам нужно постоянно вводить значения элементов. И это конечно напрягает, не говоря о том что мы тратим на это много времени. Поэтому я предлагаю использовать генератор случайных чисел для инициализации нашего массива.

#define N 100 //число элементов в массиве
#define M 10 //число больше которого не будет в нашем массиве

int a[N];

srand(time(0)); //инициализация генератора текущим временем, чтобы не было повторов

for (int i = 0; i < N; i++)
{
    a[i] = rand() % M;
}

найти номера первых двух рядом стоящих одинаковых элементов в массиве

  1. где взять массив?
  2. как его увидеть?
  3. собственно решение
нужно сравнить i-й элемент с i+1-м, если они равны - значит решение найдено

int a[N];

for (int i = 0; i < N-1; i++)
{
    if (a[i] == a[i+1])
    {
        cout << i << "-й и " << (i+1) << "-й элементы равны " << a[i] << endl;
        break;
    }
}


среда, 28 марта 2012 г.

Расчет стоимости полиса ОСГПО

Постоянно меняются правила оформления страховки.
Я уже запарился разбираться сколько чего нужно платить.
Вот удобный и быстрый способ совершить это в пару кликов.

среда, 2 июня 2010 г.

найти родственников

Задано конечное множество имен жителей некоего города,
причем для каждого из жителей перечислены имена его детей.
Жители X и Y называются родственниками ,если

a) либо X - ребенок Y
b) либо Y - ребенок X
c) либо существует некий Z такой, что X - родственник Z, а Z - родственник Y.

Перечислить все пары жителей города,которые являются родственниками.



Задача, как по мне, выше среднего уровня.

Первая проблема которая перед нами стоит - это как задать начальные данные.
Я долго думал на эту тему и пришел к выводу, что пользователю проще работать
с именами, чем с индексами соотв. имени. Поэтому я не пошел стандартным путём
(  а это задание вектора имен, потом задание вектора векоторов + вектор булевых переменных для раскраски... - муть зеленая)

Я использовал наборы из STL, т.е std::set

Для описания связи я использовал std::pair

Задав таким образом пары мы перезходим к следующей проблеме - нужно получить список уникальных имен, т.е. получить набор всех жителей. С этим отлично справился контейнер std::set.

Теперь нам нужно оценить каждого с каждым на предмет родства, это делать удобнее с std:vector - поэтому мы перегоняем данные из set в vector

Ну и самое главное - определение родства. Используем рекурсию для обхода дерева (направленный граф) для получения родственников для заданного человека, а потом ищем в нем того с чем определяем родство....


Полное решение будет стоит 250WMR. Обращайтесь.

понедельник, 17 мая 2010 г.

как поменять элементы массива местами c

как поменять элементы массива местами (Си)

самый простой способ для понимания это представить себе переменную в виде стакана с водой

итого мы имеем 2 стака с жидкостями которые нужно поменять местами (содержимое стакана)

как бы вы сделали это в реальной жизни? так же и в программе! - посредством третьего стакана!


int a = 10;
int b = 20;
int temp; //наш третий стакан - посредник

temp = a; //перелили в третий стакан содержимое первого
a = b; //первый у нас освободился? заполняем его содержимым второго
b = temp; //второй освободился? заполняем его содержимым третьего (а там что?)

вот и поменялись...