Задачки для разминки. (Простенькие такие...)

Модератор: Модераторы разделов

Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Задачки для разминки.

Сообщение Uncle_Theodore »

1. После выполнения следующего кода на C, что находится в переменных x и y?

Код: Выделить всё

int x, y;
x = 1;
y = 2;

x = x^y;
y = x^y;
x = x^y;


2. Сколько новых процессов порождает следующий код на С?

Код: Выделить всё

for(i=0;i<5;i++)
     fork();


3. Что возвращает функция

Код: Выделить всё

execve()
в случае удачного завершения?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Задачки для разминки.

Сообщение v04bvs »

4.

1.

Код: Выделить всё

% cat test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("Hello world");
    fork();
    return 0;
}
% gcc test.c
% ./a.out
Hello worldHello world

2.

Код: Выделить всё

% cat test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("Hello world\n");
    fork();
    return 0;
}
% gcc test.c
% ./a.out
Hello world

Объяснить происходящее.
Спасибо сказали:
Аватара пользователя
dey
Сообщения: 335
ОС: OpenSuse 11.1

Re: Задачки для разминки.

Сообщение dey »

v04bvs писал(а):
02.05.2007 23:37
4.

1.

Код: Выделить всё

% cat test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("Hello world");
    fork();
    return 0;
}
% gcc test.c
% ./a.out
Hello worldHello world

2.

Код: Выделить всё

% cat test.c
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    printf("Hello world\n");
    fork();
    return 0;
}
% gcc test.c
% ./a.out
Hello world

Объяснить происходящее.



При вызове функции fork() создается новый процесс , который является копией родительского . Во втором случае родительский процесс завершается переводом строки .Я прав ?
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Задачки для разминки.

Сообщение elide »

v04bvs, чортов сотонист....
только задачки такие, собственно, к программированию отношения не имеют.
можно вполне себе неплохо программировать, так за всю жизнь и не узнав конкретно этой особенности реализации I/O.
а вообще, надо юзать fflush (:
слава роботам!
Спасибо сказали:
Аватара пользователя
agbr
Сообщения: 486
ОС: openSUSE 10.2

Re: Задачки для разминки.

Сообщение agbr »

5. от себя лично каков будет результат?

Код: Выделить всё

#include <stdlib.h>
#include <stdio.h>

int move( int a, int b ){
    return a << b;
}

int main(){
    int i=0;
    printf("%d\n",move(i++,i++));
    return 0;
}
jabber: agbr@jabber.ru

против проприетарного ПО в GNU/Linux
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Задачки для разминки.

Сообщение serzh-z »

1
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Задачки для разминки.

Сообщение elide »

agbr, это называется undefined behavior.
некорректная задача, которая не имеет правильного ответа.
слава роботам!
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: Задачки для разминки.

Сообщение Skladnoy »

Не уверен про С, но в С++ порядок вычисления аргументов функций определяется реализацией.

3. Что возвращает функция execve()
в случае удачного завершения?

Это тест на знание команды man?
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Задачки для разминки.

Сообщение nerezus »

Код: Выделить всё

// Каков результат работы программы?
#include <stdio.h>
int main() {
    int a = 1;
    printf("%c\n", a["abc"]);
    return 0;
}


Код: Выделить всё

#include <iostream>
int main() {
    //Что будет выведено в stdout??/
    for( int i = 0; i < 10; ++i )
        std::cout << "a";
    return 0;
}
ICQ 547097
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

Skladnoy писал(а):
09.05.2007 22:54
Не уверен про С, но в С++ порядок вычисления аргументов функций определяется реализацией.
Это тест на знание команды man?

Ты на вопрос ответь сначала... :D
Спасибо сказали:
Аватара пользователя
messer
Сообщения: 98
ОС: линугз

Re: Задачки для разминки.

Сообщение messer »

execve() в случае удачного выполнения ничего не возвращает:)
Gentoo 2006.0
"Когда я вижу что-либо смешное , я весь просто трясусь от смеха. Поэтому всегда хожу небритый.")))
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

messer писал(а):
10.05.2007 00:08
execve() в случае удачного выполнения ничего не возвращает:)

А почему она ничего не возвращает? ;)
Спасибо сказали:
Аватара пользователя
dey
Сообщения: 335
ОС: OpenSuse 11.1

Re: Задачки для разминки.

Сообщение dey »

Uncle_Theodore писал(а):
10.05.2007 00:10
А почему она ничего не возвращает? ;)

Потому что образ процесса который содержал обращение к этой функции уже перезаписан
В сознательных действиях должен присутствовать существенный неалгоритмический компонент.
Roger Penrose,The Emperor's New Mind
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

dey писал(а):
10.05.2007 00:26
Потому что образ процесса который содержал обращение к этой функции уже перезаписан

Правильно! :)
Вот видите, дебильный с виду вопрос, а сколько интересного открывает правильный на него ответ... :)
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: Задачки для разминки.

Сообщение Skladnoy »

И все это написано в мане.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

Skladnoy писал(а):
10.05.2007 00:55
И все это написано в мане.

И что? Ты хочешь сказать, например, что как решать дифференциальные уравнения в частных производных не написано в учебниках? :)
Это простенькие задачки, для разминки. Я что, обещал глобальную проблему что ли?.. ;)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Задачки для разминки.

Сообщение elide »

Skladnoy
в С++ порядок вычисления аргументов функций определяется реализацией
там вне зависимости от порядка вычисления аргументов есть две модификации переменной без прохождения точки следования. а если ещё и про аргументы вспомнить, то это дважды некорректный код (:

nerezus
не учи людей плохому.
за указание индексов в стиле index[array] надо отрубать руки. а за использование триграфов в коде - выдавать 10 МСД.

Uncle_Theodore
задача подразумевает решение.
знание одного конкретного факта - не есть решение.
слава роботам!
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

elide писал(а):
10.05.2007 01:13
Uncle_Theodore
задача подразумевает решение.
знание одного конкретного факта - не есть решение.

Мммм... не столько решение, сколько понимание.
Ну ладно, ладно, допустим не настолько это интересно для вас. Боже мой, какая трагедия! :D
Спасибо сказали:
Аватара пользователя
wi:
Сообщения: 535
Статус: wi love linux
ОС: Open SuSE 11.0

Re: Задачки для разминки.

Сообщение wi: »

elide писал(а):
10.05.2007 01:13
задача подразумевает решение.
знание одного конкретного факта - не есть решение.

Решение знанием -- есть путь решения.

BTW, есть ли существенная разница межу void main() и int main() ? К чему возвращать что-то в главной функции?
%s
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Задачки для разминки.

Сообщение nerezus »

BTW, есть ли существенная разница межу void main() и int main() ?
Конечно есть: void main() - это синтаксическая ошибка, в то время как int main() использовать можно.

P.S. ISO 9899 пункт 5.1.2.2.1
ICQ 547097
Спасибо сказали:
sbar
Сообщения: 354
ОС: Gentoo

Re: Задачки для разминки.

Сообщение sbar »

если не ошибаюсь, то через int main() можно (и даже нужно) возратить exitcode программы, а через void естесственно нельзя, и если не путаю его запретили использовать. хотя древние компиляторы могут собирать с void.

nerezus писал(а):
09.05.2007 22:55
//Что будет выведено в stdout??/
вроде как старый прикол, но нужно было что ли добавить что с -trigraphs собирать нужно, а то он так просто предупреждение показывает при сборке и 10 раз выводит (:
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Задачки для разминки.

Сообщение nerezus »

Старая задачка, обычно на школьных районных олимпиадах ее дают:
Имеется матрица (n*m) заполненная 1 и 0. Единицы - это острова море, а нули - море. Если единицы находятся рядом по горизонтали или вертикали - то они образуют один остров. Найти количество островов.
P.S. Естественно могут быть "гнутые" и "дырявые" острова.
P.P.S. Как не странно, но решают ее редко, хотя она легкая.
ICQ 547097
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

nerezus писал(а):
13.05.2007 09:55
Старая задачка, обычно на школьных районных олимпиадах ее дают:
Имеется матрица (n*m) заполненная 1 и 0. Единицы - это типа море, а нули - острова. Если единицы находятся рядом по горизонтали или вертикали - то они образуют один остров. Найти количество островов.
P.S. Естественно могут быть "гнутые" и "дырявые" острова.
P.P.S. Как не странно, но решают ее редко, хотя она легкая.

Вариант решения от измученного нарзаном Дяди Федора (честно, сам придумал!):

Код: Выделить всё

1. Считаем общее количество единичек (они -- острова), пусть будет N.
2. Заводим переменную hit = 0;
3. Обходим массив.
  если (i,j)-й элемент есть 1, то
           если (i+1,j) элемент есть 1, то hit = hit+1;
           если (i,j+1) элемент есть 1, то hit = hit +1;
4. Количество островов равно N - hit;

Правильно?
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Задачки для разминки.

Сообщение nerezus »

Правильно?
Ого! Так быстро написал решение! Фигасе!

Но не правильно =)

Код: Выделить всё

    "1100111110",
    "0011100010",
    "0010000110",
    "0010110010",
    "0010000010",
    "0011111110"
Тут 3 острова: слева вверху из 2 единичек, потом кольцевой остров и мелкий островок внутри кольца.
Это типа пример.
ICQ 547097
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Задачки для разминки.

Сообщение Liksys »

"1100111110",
"0011100010",
"0010000110",
"0010110010",
"0010000010",
"0011111110"
Ага, 3, если не считать диагональные связи. С диагональными вершний левый будет частью кольцевого.
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Задачки для разминки.

Сообщение nerezus »

Диагональные считать не будем.
Хотя алгоритм от этого не изменится ;)
ICQ 547097
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Задачки для разминки.

Сообщение diesel »

nerezus писал(а):
13.05.2007 12:31
Диагональные считать не будем.
Хотя алгоритм от этого не изменится ;)

тупой вариант в голову приходит - надо просто пронумеровать острова. т.е. идем по строке, встречам единицу, осматриваемся - вверх и назад, (i-1,j) (i,j-1) если там есть не-ноль, то меняем эту текущую единицу этим не-нулем. если нет прибавляем к счетчику островов 1 и пишем значение счетчика вместо текущей единицы. в итоге счетчик островов будет содержать количество островов. вроде :)
Спасибо сказали:
Аватара пользователя
nerezus
Сообщения: 525
Статус: Вселенский отказник
ОС: windoze

Re: Задачки для разминки.

Сообщение nerezus »

Вот быстренько закодил самый очевидный вариант: http://dpaste.com/10197/
ICQ 547097
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: Задачки для разминки.

Сообщение eduard_pustobaev »

Либо создавать массивчики с индексами единичек когда появится единичка, не связанная с элементами массива через ( j==mas_j, mas_i == i+1 или mas_i==i, mas_j == j+1. И какой-нибудь counter этих массивов. Хотя это и мега тупой алгоритм, особенно в плане памяти, но работать должен, хотя писать лениво.

nerezus писал(а):
13.05.2007 13:42
Вот быстренько закодил самый очевидный вариант: http://dpaste.com/10197/

За сайтец спасибо, классная вещь. К форуму бы такое прикрепить...
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Задачки для разминки.

Сообщение Uncle_Theodore »

nerezus писал(а):
13.05.2007 12:07
Ого! Так быстро написал решение! Фигасе!

Но не правильно =)

Да я вижу уже, что неправильно... :)
Это я вчера перед тем как спать ложиться...
Спасибо сказали: