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

Марафон задач по С++. День 2



Марафон задач по С++. День 2
2012-04-04 15:51 Гайк Айрапетян

Мы продолжаем наш марафон задач по С++. Сегодня второй день с очередной порцией интересных задачек.

Напомню, что победитель получит 50% скидку на участие в предстоящем курсе С++. Управление памятью. Самые активные участники будут также отмечены.

Свои ответы отправляйте на c.davydov.prog@gmail.com. В комментариях вопросы, пояснения и т.д. Решения принимаются до 21:00 следующего дня. Код присылать в *.cpp файлах.

Рейтинг участников здесь:
https://docs.google.com/spreadsheet/ccc?key=0Aocn4WVzAcc0dHM1UXo1cDBIZVY2dVZWWS1xeVBBVlE#gid=0

ЗАДАЧИ:

1.  Карусель.

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

Циклическая перестановка – это такая, при которой циклическим сдвигом можно получить исходное слово. На вход подаются две строки. Выход YES/NO.

Пример:

Вход:
ablet
table
Выход:
YES

2. Дело об исчезающем прямоугольнике.

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

#include 
 
class Rectangle
{
public:
    Rectangle (const int width, const int height)
        : width_(width)
        , height_(height)
        , area_(width_ * height_)
    {}
 
public:
    const int area_;
    const int width_;
    const int height_;
};
 
int main()
{
    Rectangle sample(10, 5);
    std::cout << "Area of sample is " << sample.area_ << std::endl;
 
    return 0;
}

3. Калькулятор.

Очень простая задача, самая простая во всем марафоне. Серьезно. Надо всего лишь написать последнюю цифру числа е в степени р. е > 1; 1 < р < 10000. Вход – два числа. Выход – последняя цифра.

Вход:
4
2

Выход:
6

P.S. Подпишитесь на новости о С++ и марафоне задач здесь ↓

Ваш e-mail: *
Ваше имя: *
Контактный телефон:


Что необходимо учитывать при загрузке файлов на сервер
2012-04-05 11:26 Дмитрий Лаврик

Если Вы программируете на php, то, наверняка, хотя бы раз в жизни Вам приходилось сталкиваться с организацией загрузки файлов на сервер.

Например, создавать простенький блог, в котором автор может прикреплять к своим статьям изображения. А может быть, огромную социальную сеть, где пользователи будут добавлять аватарки к своим профилям. Или же простейшую галерею фотографий. Объединяет все эти примеры одно – в них будет происходить загрузка пользовательского файла на сервер.

Для того чтобы напомнить Вам, как файл загружается на сервер, рассмотрим простенький скрипт. Нам потребуется html –формочка и её php-обработчик.

Итак, форма:

<form method="post" enctype="multipart/form-data">
   <input type="hidden" value = "1048576"/>
   <input type="file" />
   <input type="submit" value="Загрузить файл!" />
</form>

В ней нет никаких примечательных моментов за исключением указания enctype = «multipart/form-data», которое необходимо, если с формы мы осуществляем загрузку файла.

Теперь напишем самый простой php-обработчик:

<?php
 
if (isset($_FILES['file'])) // если была произведена отправка формы
{
    // копируем файл из временной директории в ту же папку, где лежит обработчик
 
    copy($_FILES['file']['tmp_name'], $_FILES['file']['name']);
 
    echo 'Файл успешно загружен';
}

Объединим это всё в один файл:

<!DOCTYPE html>
 
<html>
 
   <head>
 
      <meta http-equiv="content-type" content="text/html; charset=windows-1251">
 
      <title>Загрузка файла на сервер</title>
 
   </head>
 
   <body>
 
      <form method="post" enctype="multipart/form-data">
 
         <input type="file" />
 
         <input type="submit" value="Загрузить файл!" />
 
      </form>
 
<?php
 
if (isset($_FILES['file'])) // если была произведена отправка формы
 
{
 
   // копируем файл из временной директории в ту же папку, где лежит обработчик
 
   copy($_FILES['file']['tmp_name'], $_FILES['file']['name']);
 
   echo 'Файл успешно загружен';
 
}
 
?>
 
   </body>
 
</html>

А теперь давайте попробуем поискать недостатки у данного скрипта.

Во-первых, пользователь может просто не выбрать файл на форме. В итоге функция copy() попытается скопировать из временной директории файл, которого нет, что приведёт к ошибке.

Во-вторых, пользователь может выбрать фотографию, которая весит, допустим, мегабайт 20 (а если он злоумышленник или шутник – видеофайл весом в 20 Гб). Стоит задуматься, нужны ли нам файлы такого размера у себя на сайте!?

Обработаем в скрипте обе эти ситуации (изменения показываются в обработчике):

<?php
 
if (isset($_FILES['file'])) // если была произведена отправка формы
 
{
 
   if($_FILES['file']['name'] == '') //если имя файла пустое
 
      echo ('Файл не выбран!');
 
      elseif($_FILES['file']['size'] > 1048576) //если размер файла превышает 1 Мб
 
      echo ('Размер файла превышает 1 Мб!');
 
   else{
 
      // копируем файл из временной директории в ту же папку, где лежит обработчик
 
      copy($_FILES['file']['tmp_name'], $_FILES['file']['name']);
 
      echo 'Файл успешно загружен';
 
   }
 
}

Ну что ж, кажется, всё! Осталось лишь где-нибудь добавить проверку на расширение загружаемого файла, и всё будет готово?

Нет! Сейчас нам необходимо вспомнить, из каких частей состоит закачка файла на сервер:

1) файл с компьютера пользователя автоматически загружается на сервер в директорию, где хранятся все временные файлы. На денвере, например, это папка tmp;

2) мы выполняем все проверки и перемещаем файл из временного хранилища в реальное с помощью функции copy().

Т.е. смотрите, что происходит: файл сразу же оказывается на сервере ещё до того, как исполнится первая строчка нашего php-кода. Где же тогда ставить защиту от загрузки злоумышленниками и шутниками файлов огромных размеров?

Может быть, с помощью скрытого поля на html-форме? Например:

<form method="post" enctype="multipart/form-data">
 
   <input name="MAX_FILE_SIZE" value = "1048576"/>'
 
   <input name="file" />
 
   <input type="submit" value="Загрузить файл!" />
 
</form>

Как бы бредово не выглядела данная запись, но она реально работает. С помощью дополнительного скрытого поля ввода:

<input type="hidden" name="MAX_FILE_SIZE" value = "1048576"/>'

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

Поэтому, единственным нормальным способом ограничивать размер файлов, загружаемых на сервер, являются настройки в конфигурационном файле php на сервере. Рассмотрим необходимые настройки на примере файла php.ini на денвере. Находится он по адресу /usr/local/php5/php.ini. Советую Вам сейчас его открыть (если Вы конечно используете денвер).

Итак, здесь нас интересует 552-ая строчка:

upload_max_filesize = 2M

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

Всё, теперь мы можем грамотно управлять размером загружаемых на сервер файлов. Осталось только разобраться с их количеством. Согласитесь, что если пользователь подделает отправку формы и наплодит на ней 1000 полей ввода, в которые поместит по двухмегабайтному файлу, результат для нас также будет очень печальным.

Установить максимальное количество загружаемых на сервер файлов мы можем с помощью специальной функции ini_set(). В самое начало нашего скрипта допишем:

ini_set(‘max_file_uploads’, ‘5′);

Ура! Теперь за один раз никто не сможет загрузить к нам на сервер более 5 файлов.

Подводя итоги, хочу ещё раз перечислить все пункты, про которые Вы должны помнить, если организуете загрузку файлов на сервер:

1) у html формы обязательно указывайте enctype = «multipart/form-data»

2) делайте проверку, не является ли имя файла пустым (т.е. выбрал ли вообще пользователь файл)

3) делайте проверку на размер и тип  загружаемого файла в скрипте

4) устанавливайте максимальный размер загружаемого файла в конфигурационном файле на сервере

5) с помощью функции ini_set() устанавливайте максимальное количество загружаемых файлов



Конкурс «Твоя история успеха со Школой Программирования». Победителям – бесплатное обучение!
2012-04-05 14:52 Александр Никитин

обучение программированиюДрузья! Мы запускаем конкурс «Твоя история успеха с ШП»!

Мы очень любим общаться с нашими студентами и выпускниками. Именно поэтому каждую среду в 18.00 мы проводим дни открытых дверей, куда зовем абсолютно всех, кому небезразлично программированием. К примеру, на вчерашней встрече наш хороший друг и бывший ученик Юра Аванасьев делился опытом по получению сертификата Zend по PHP. Это было очень ценно и интересно.

Но, к сожалению с некоторыми своими учениками мы потеряли связь. А мы уверены, Вам есть что рассказать о своем обучении в ШП и о своих профессиональных успехах. Так появилась идея проведения конкурса.

Напишите нам письмо в котором расскажите о том, как Школа Программирования повлияла на Вас, Вашу карьеру, отношение к программированию. Конечно же мы не оставим Вас без награды, об этом чуть ниже.

Если Вы учились на наших курсах, или же смотрели наши видеокурсы, и это обучение позитивно отразилось на Вашем дальнейшем развитии, напишите нам об этом!

О чем стоит написать

Часто бывает сложно написать какой-то текст. Приводим здесь ряд вопросов, которые облегчат Вам эту творческую задачу:

1. Опишите свой проф. уровень до знакомства с ШП.
- Какие знания уже имелись
- Что было с проф. деятельностью? Работал/не работал?
2. Как Вы познакомились с ШП?
3. Какие курсы у нас проходили, какие впечатления остались от обучения?
4. В чем для Вас основная ценность ШП?
5. Как складывалась проф. деятельность после обучения?
6. Чем занимаетесь на данный момент? Каких проф. успехов добились с момента первого знакомства с ШП.

Это лишь примерный список вопросов, которые призваны направить Ваши мысли в нужном направлении. В целом же можете избрать свою собственную манеру изложения. Желательно оформить отзыв в форме рассказа.

Условия

Ваши истории успеха отправляйте на почту support@prog-school.ru с темой «история успеха».

В конкурсе будут участвовать все письма, отправленные до 22 апреля. Однако чем раньше Вы отправите нам свою историю, тем выше будет ее приоритет для нас. Мы расцениваем это как внимание с Вашей стороны.

Что получат победители

1 место – бесплатное участие в любом очном курсе ШП http://proglive.ru/courses.

2 место – бесплатное участие в любом онлайн-курсе ШП http://proglive.ru/courses.

3 место – любой видеокурс, который есть на данный момент http://proglive.ru/videocourses или появится до конца года.

4 место – авторы всех историй, которые будут искренними и интересными также получат от нас в подарок один из  видеосеминаров, не представленных в продаже. Мы постараемся отблагодарить каждого, кому не безразлична Школа Программирования.

P.S. Не откладывайте на потом. Напишите и отправьте нам свою историю прямо сейчас! Это повысит Ваши шансы на победу.



Марафон задач по С++. День 2
2012-04-04 15:51 Гайк Айрапетян

Мы продолжаем наш марафон задач по С++. Сегодня второй день с очередной порцией интересных задачек.

Напомню, что победитель получит 50% скидку на участие в предстоящем курсе С++. Управление памятью. Самые активные участники будут также отмечены.

Свои ответы отправляйте на c.davydov.prog@gmail.com. В комментариях вопросы, пояснения и т.д. Решения принимаются до 21:00 следующего дня. Код присылать в *.cpp файлах.

Рейтинг участников здесь:
https://docs.google.com/spreadsheet/ccc?key=0Aocn4WVzAcc0dHM1UXo1cDBIZVY2dVZWWS1xeVBBVlE#gid=0

ЗАДАЧИ:

1.  Карусель.

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

Циклическая перестановка – это такая, при которой циклическим сдвигом можно получить исходное слово. На вход подаются две строки. Выход YES/NO.

Пример:

Вход:
ablet
table
Выход:
YES

2. Дело об исчезающем прямоугольнике.

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

#include 
 
class Rectangle
{
public:
    Rectangle (const int width, const int height)
        : width_(width)
        , height_(height)
        , area_(width_ * height_)
    {}
 
public:
    const int area_;
    const int width_;
    const int height_;
};
 
int main()
{
    Rectangle sample(10, 5);
    std::cout &lt;&lt; "Area of sample is " &lt;&lt; sample.area_ &lt;&lt; std::endl;
 
    return 0;
}

3. Калькулятор.

Очень простая задача, самая простая во всем марафоне. Серьезно. Надо всего лишь написать последнюю цифру числа е в степени р. е > 1; 1 < р < 10000. Вход – два числа. Выход – последняя цифра.

Вход:
4
2

Выход:
6

P.S. Подпишитесь на новости о С++ и марафоне задач здесь ↓

Ваш e-mail: *
Ваше имя: *
Контактный телефон:


Что необходимо учитывать при загрузке файлов на сервер
2012-04-05 11:26 Дмитрий Лаврик

Если Вы программируете на php, то, наверняка, хотя бы раз в жизни Вам приходилось сталкиваться с организацией загрузки файлов на сервер.

Например, создавать простенький блог, в котором автор может прикреплять к своим статьям изображения. А может быть, огромную социальную сеть, где пользователи будут добавлять аватарки к своим профилям. Или же простейшую галерею фотографий. Объединяет все эти примеры одно – в них будет происходить загрузка пользовательского файла на сервер.

Для того чтобы напомнить Вам, как файл загружается на сервер, рассмотрим простенький скрипт. Нам потребуется html –формочка и её php-обработчик.

Итак, форма:

<form method="post" enctype="multipart/form-data">
   <input type="hidden" value = "1048576"/>
   <input type="file" />
   <input type="submit" value="Загрузить файл!" />
</form>

В ней нет никаких примечательных моментов за исключением указания enctype = «multipart/form-data», которое необходимо, если с формы мы осуществляем загрузку файла.

Теперь напишем самый простой php-обработчик:

<?php
 
if (isset($_FILES['file'])) // если была произведена отправка формы
{
    // копируем файл из временной директории в ту же папку, где лежит обработчик
 
    copy($_FILES['file']['tmp_name'], $_FILES['file']['name']);
 
    echo 'Файл успешно загружен';
}

Объединим это всё в один файл:

<!DOCTYPE html>
 
<html>
 
   <head>
 
      <meta http-equiv="content-type" content="text/html; charset=windows-1251">
 
      <title>Загрузка файла на сервер</title>
 
   </head>
 
   <body>
 
      <form method="post" enctype="multipart/form-data">
 
         <input type="file" />
 
         <input type="submit" value="Загрузить файл!" />
 
      </form>
 
<?php
 
if (isset($_FILES['file'])) // если была произведена отправка формы
 
{
 
   // копируем файл из временной директории в ту же папку, где лежит обработчик
 
   copy($_FILES['file']['tmp_name'], $_FILES['file']['name']);
 
   echo 'Файл успешно загружен';
 
}
 
?>
 
   </body>
 
</html>

А теперь давайте попробуем поискать недостатки у данного скрипта.

Во-первых, пользователь может просто не выбрать файл на форме. В итоге функция copy() попытается скопировать из временной директории файл, которого нет, что приведёт к ошибке.

Во-вторых, пользователь может выбрать фотографию, которая весит, допустим, мегабайт 20 (а если он злоумышленник или шутник – видеофайл весом в 20 Гб). Стоит задуматься, нужны ли нам файлы такого размера у себя на сайте!?

Обработаем в скрипте обе эти ситуации (изменения показываются в обработчике):

<?php
 
if (isset($_FILES['file'])) // если была произведена отправка формы
 
{
 
   if($_FILES['file']['name'] == '') //если имя файла пустое
 
      echo ('Файл не выбран!');
 
      elseif($_FILES['file']['size'] > 1048576) //если размер файла превышает 1 Мб
 
      echo ('Размер файла превышает 1 Мб!');
 
   else{
 
      // копируем файл из временной директории в ту же папку, где лежит обработчик
 
      copy($_FILES['file']['tmp_name'], $_FILES['file']['name']);
 
      echo 'Файл успешно загружен';
 
   }
 
}

Ну что ж, кажется, всё! Осталось лишь где-нибудь добавить проверку на расширение загружаемого файла, и всё будет готово?

Нет! Сейчас нам необходимо вспомнить, из каких частей состоит закачка файла на сервер:

1) файл с компьютера пользователя автоматически загружается на сервер в директорию, где хранятся все временные файлы. На денвере, например, это папка tmp;

2) мы выполняем все проверки и перемещаем файл из временного хранилища в реальное с помощью функции copy().

Т.е. смотрите, что происходит: файл сразу же оказывается на сервере ещё до того, как исполнится первая строчка нашего php-кода. Где же тогда ставить защиту от загрузки злоумышленниками и шутниками файлов огромных размеров?

Может быть, с помощью скрытого поля на html-форме? Например:

<form method="post" enctype="multipart/form-data">
 
   <input name="MAX_FILE_SIZE" value = "1048576"/>'
 
   <input name="file" />
 
   <input type="submit" value="Загрузить файл!" />
 
</form>

Как бы бредово не выглядела данная запись, но она реально работает. С помощью дополнительного скрытого поля ввода:

<input type="hidden" name="MAX_FILE_SIZE" value = "1048576"/>'

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

Поэтому, единственным нормальным способом ограничивать размер файлов, загружаемых на сервер, являются настройки в конфигурационном файле php на сервере. Рассмотрим необходимые настройки на примере файла php.ini на денвере. Находится он по адресу /usr/local/php5/php.ini. Советую Вам сейчас его открыть (если Вы конечно используете денвер).

Итак, здесь нас интересует 552-ая строчка:

upload_max_filesize = 2M

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

Всё, теперь мы можем грамотно управлять размером загружаемых на сервер файлов. Осталось только разобраться с их количеством. Согласитесь, что если пользователь подделает отправку формы и наплодит на ней 1000 полей ввода, в которые поместит по двухмегабайтному файлу, результат для нас также будет очень печальным.

Установить максимальное количество загружаемых на сервер файлов мы можем с помощью специальной функции ini_set(). В самое начало нашего скрипта допишем:

ini_set(‘max_file_uploads’, ‘5′);

Ура! Теперь за один раз никто не сможет загрузить к нам на сервер более 5 файлов.

Подводя итоги, хочу ещё раз перечислить все пункты, про которые Вы должны помнить, если организуете загрузку файлов на сервер:

1) у html формы обязательно указывайте enctype = «multipart/form-data»

2) делайте проверку, не является ли имя файла пустым (т.е. выбрал ли вообще пользователь файл)

3) делайте проверку на размер и тип  загружаемого файла в скрипте

4) устанавливайте максимальный размер загружаемого файла в конфигурационном файле на сервере

5) с помощью функции ini_set() устанавливайте максимальное количество загружаемых файлов



Конкурс «Твоя история успеха со Школой Программирования». Победителям – бесплатное обучение!
2012-04-05 14:52 Александр Никитин

обучение программированиюДрузья! Мы запускаем конкурс «Твоя история успеха с ШП»!

Мы очень любим общаться с нашими студентами и выпускниками. Именно поэтому каждую среду в 18.00 мы проводим дни открытых дверей, куда зовем абсолютно всех, кому небезразлично программированием. К примеру, на вчерашней встрече наш хороший друг и бывший ученик Юра Аванасьев делился опытом по получению сертификата Zend по PHP. Это было очень ценно и интересно.

Но, к сожалению с некоторыми своими учениками мы потеряли связь. А мы уверены, Вам есть что рассказать о своем обучении в ШП и о своих профессиональных успехах. Так появилась идея проведения конкурса.

Напишите нам письмо в котором расскажите о том, как Школа Программирования повлияла на Вас, Вашу карьеру, отношение к программированию. Конечно же мы не оставим Вас без награды, об этом чуть ниже.

Если Вы учились на наших курсах, или же смотрели наши видеокурсы, и это обучение позитивно отразилось на Вашем дальнейшем развитии, напишите нам об этом!

О чем стоит написать

Часто бывает сложно написать какой-то текст. Приводим здесь ряд вопросов, которые облегчат Вам эту творческую задачу:

1. Опишите свой проф. уровень до знакомства с ШП.
- Какие знания уже имелись
- Что было с проф. деятельностью? Работал/не работал?
2. Как Вы познакомились с ШП?
3. Какие курсы у нас проходили, какие впечатления остались от обучения?
4. В чем для Вас основная ценность ШП?
5. Как складывалась проф. деятельность после обучения?
6. Чем занимаетесь на данный момент? Каких проф. успехов добились с момента первого знакомства с ШП.

Это лишь примерный список вопросов, которые призваны направить Ваши мысли в нужном направлении. В целом же можете избрать свою собственную манеру изложения. Желательно оформить отзыв в форме рассказа.

Условия

Ваши истории успеха отправляйте на почту support@prog-school.ru с темой «история успеха».

В конкурсе будут участвовать все письма, отправленные до 22 апреля. Однако чем раньше Вы отправите нам свою историю, тем выше будет ее приоритет для нас. Мы расцениваем это как внимание с Вашей стороны.

Что получат победители

1 место – бесплатное участие в любом очном курсе ШП http://proglive.ru/courses.

2 место – бесплатное участие в любом онлайн-курсе ШП http://proglive.ru/courses.

3 место – любой видеокурс, который есть на данный момент http://proglive.ru/videocourses или появится до конца года.

4 место – авторы всех историй, которые будут искренними и интересными также получат от нас в подарок один из  видеосеминаров, не представленных в продаже. Мы постараемся отблагодарить каждого, кому не безразлична Школа Программирования.

P.S. Не откладывайте на потом. Напишите и отправьте нам свою историю прямо сейчас! Это повысит Ваши шансы на победу.



В избранное