1 Востаннє редагувалося Replace (23.05.2012 08:03:07)

Тема: Цікаві задачі

Пропоную в цій темі викладувати цікаві задачі з програмування.

1. 10 зірочок

#include <stdio.h>
int main(void)
{
    int i, n = 10;
    for (i = 0; i < n; i--) 
        printf("%c", '*');
    getchar();
    return 0;
}

Потрібно змінити лише один символ, так щоб друкувало 10 зірочок, пробіл також символ. Є 3 можливих варіанта рішення.



2. Обмін даними без допоміжної памяті

unsigned char v1 = 250;
unsigned char v2 = 200;

Необхідно переставити місцями значення без використання допоміжної пам'яті (ще однієї змінної).



3. Ініціалізація масиву (відправив Patron, деякі поправки від Leo)

#include <iostream>
#define N 10
#define M 5
#define L 3
using namespace std;
int main () {
    int i,j,k;
    int array[N][M][L];
    
    for (i = 0; i < N; i++) {
        for (j = 0; j < M; j++) {
            for (k = 0; k < L; k++) {
                // тут ваш код
            }
        }
    }
    
    for(i = 0; i < N; i++) {
        for(j = 0; j < M; j++) {
            for(k = 0; k < L; k++) {
                cout << array[a][b][c] << endl;
            }
        }
    }

    return 0;
}

Зробити ініціалізацію усіх 50-ти масивів (10 * 5 = 50), які містять по 3 елементи типу int, числом 10. Не використовувати квадратні дужки!


4. Паровози
Є два програмованих паровоза. Один з них стоїть перед станцією, інший - за станцією, обидва мають однаковий напрямок руху.
Їх мова має такі можливості:

ifstation {} - якщо зараз на станції, то виконати код в фігурних дужках
goto ...; - перейти на мітку ... (як в С)
label1: ... - Мітка label1 (як в С)
forward; - зрушитися на одну довжину паровоза вперед за одиницю часу
back; - зрушитися на одну довжину паровоза назад за одиницю часу

Скласти програму для паровозів (однакову для обох), яка призведе до їх зіткнення.

Подякували: leofun01, Master_Sergius2

2

Re: Цікаві задачі

1.1:

#include <stdio.h>
int main(void)
{
    int i, n = 5;
    for (i = 0; i + n; i--) 
        printf("%c", '*');
    getchar();
    return 0;
}

1.2:

#include <stdio.h>
int main(void)
{
    int i, n = 5;
    for (i = 0; i < n; n--) 
        printf("%c", '*');
    getchar();
    return 0;
}

1.3:

#include <stdio.h>
int main(void)
{
    int i, n = 5;
    for (i = 0; -i < n; i--) 
        printf("%c", '*');
    getchar();
    return 0;
}
Подякували: Arete1

3 Востаннє редагувалося Leo (12.05.2012 20:01:30)

Re: Цікаві задачі

2.

a = a ^ b;
b = a ^ b;
a = a ^ b;

^ - xor в C

Подякували: leofun01, Betterthanyou2

4

Re: Цікаві задачі

Leo, а нічого що в умові задачі можна лише 1 символ поміняти? :D
Один з варіантів: в форі поміняти

for(i=0;i<n; i--)

на

for(i=0;i<n; n--)

5

Re: Цікаві задачі

Другий поміняти:

for(i=0;i<n; i--)

на

for(i=0; i + n; i--)

6 Востаннє редагувалося Leo (22.05.2012 05:01:28)

Re: Цікаві задачі

Дуже захопився задачею)) 5 ~ 10
Пробіл як я зрозумів теж символ.

7

Re: Цікаві задачі

#include <iostream.h>

int main (){
    int a,b,c;
    int array[10][5][3];

    
    for(a = 0; a < 10; a++) {
        for(b = 0; b < 5; b++) {
            for(c = 0; c < 3; c++) {
                // тут ваш код
            }
        }
    }
    
    for(a = 0; a < 10; a++) {
        for(b = 0; b < 5; b++) {
            for(c = 0; c < 3; c++) {
                cout << array[a][b][c] << "\n";
            }
        }
    }

    return 0;
}

Зробити ініціалізацію усіх 50-ти масивів (10 * 5 = 50), які містять по 3 елементи типу int, числом 10. Не використовувати квадратні дужки!

Подякували: Leo, leofun012

8 Востаннє редагувалося Leo (22.05.2012 16:57:45)

Re: Цікаві задачі

Ось такий код повинен бути в циклі:

*(*(*(array + a) + b) + c) = 10;

Оформлення коду

А ось так краще виводити:

cout << "arr[" << a << "][" << b << "]: "
 << array[a][b][0] << " " 
 << array[a][b][1] << " " 
 << array[a][b][2] << endl;

   

Для індексів краще використовувати i, j, k і задавати числа (розмірності) константами:

#define N 10
#define M 5
#define L 3
Подякували: leofun011

9

Re: Цікаві задачі

Leo написав:

Ось такий код повинен бути в циклі:

*(*(*(array + a) + b) + c) = 10;

Оформлення коду

А ось так краще виводити:

cout << "arr[" << a << "][" << b << "]: "
 << array[a][b][0] << " " 
 << array[a][b][1] << " " 
 << array[a][b][2] << endl;

   

Для індексів краще використовувати i, j, k і задавати числа (розмірності) константами:

#define N 10
#define M 5
#define L 3

Правильна відповідь)) i, j, k - чому?

10 Востаннє редагувалося Leo (22.05.2012 22:08:19)

Re: Цікаві задачі

Давним давно так приняли.
c - для символів, i, j, k - для змінних які використовуються в циклах (лічильники)

C++ Programming Style Guidelines
гілка на Хабрі
Code Complete (Совершенный код)

Подякували: leofun011

11

Re: Цікаві задачі

Трохи оновив тему, додав ще одну задачку :)

12

Re: Цікаві задачі

Bartash написав:

Задача: здійснити обмін без використання проміжної змінної.

Халява:

x = x + y
y = x - y
x = x - y
Подякували: signore_massimo, lucas-kane2

13

Re: Цікаві задачі

a = a ^ b;
b = a ^ b;
a = a ^ b;
Подякували: leofun011

14 Востаннє редагувалося Vo_Vik (05.12.2012 22:28:04)

Re: Цікаві задачі

4. Паровози

ifstation {} - якщо зараз на станції, то виконати код в фігурних дужках
goto ...; - перейти на мітку ... (як в С)
label1: ... - Мітка label1 (як в С)
forward; - зрушитися на одну довжину паровоза вперед за одиницю часу
back; - зрушитися на одну довжину паровоза назад за одиницю часу

А вони далеко від станції? Якщо ні, то можна так

ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
forward;
ifstation { goto label1}
//Будем надіятись що один доїхав до станції
label2: back;
ifstation { goto label1}
goto label2
label1: boom!

15 Востаннє редагувалося koala (01.05.2013 21:38:06)

Re: Цікаві задачі

А до чого тут C/C++?

Прихований текст
label1:
  forward;
  forward;
  back;//1 крок за 3 одиниці часу
  ifstation {goto label2;}
goto label1;
label2:
  forward;
goto label2;//1 крок за 1 одиницю часу - тобто утричі швидше

Щойно поїзд досяг станції, він знає, що позаду іншого, і прискорюється утричі... БУМ!

Подякували: Chemist-i, leofun012

16

Re: Цікаві задачі

Імовірно, у найближчому майбутньому варто буде цю тему відчепити з топу, бо вона давно втратила зміст.

17

Re: Цікаві задачі

Чому?

18

Re: Цікаві задачі

Invader написав:

Чому?

Бо такі теми мають жити постійно, а ця померла ще півроку тому.
Крім того, її змістову логіку частково поглинув підрозділ "Порівняння мов програмування".

19

Re: Цікаві задачі

Тоді давайте оживлю тему. Отже, завдання: не використовуючи будь-які розгалуження (ніяких if, switch, while, for, ?: ) перевірити, чи є число простим.

Подякували: 221VOLT1

20 Востаннє редагувалося Chemist-i (02.05.2013 07:39:54)

Re: Цікаві задачі

Pascal

  a := ... //число яке перевіряємо
  b := (a shr 1)
  c := (a mod 3)

  d := not (boolean)( b and c )
  result d;