идеи задач на C для начинающих

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 24 окт 2014, 00:47

Olej писал(а):Предложение: у кого есть - сформулируйте красивые идеи учебных задач для реализации на C под Linux (в GCC)?
Для начинающих практическое применение студентов.
Сижу, готовлю для одного такого студента (точнее выпускника), но у которого не было курса IT, объяснения по теме (примерно по программе) "битовые операции"...
Но как объяснить битовые операции тому, кто не знает двоичное представление целочисленное?
И получается так, что задача преобразований в двоичную форму является составной частью любых рассмотрений битовых операций.
А чтоб не скучно, решил я задать нашему учащемуся домашнее задание: написать как можно больше разных способов преобразования числа в двоичное представление ... тривиально, а любопытно ;-) .

Вот что у меня пока получается:

1. традиционное преобразование (файл b21.c):

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

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

int main() {
   char buf[ 80 ], *p;
   while( 1 ) {
      printf( "введите целое положительное число: ");
      fgets( buf, sizeof( buf ) - 1, stdin );
      if( index( buf, '\n' ) != NULL )
         *index( buf, '\n' ) = '\0';
      unsigned long inp = atol( buf ), j = inp;
      *( p = buf + sizeof( buf ) - 1 ) = '\0';
      do *--p = ( j & 1 ? '1' : '0' );
      while( ( j >>= 1 ) > 0 );
      printf( "число: %lu => %s\n", inp, p );
   }
   return 0;
}
2. преобразование через 8-ми-ричные остатки (b22.c):

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

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

int main() {
   const char* oct[] = { "000", "001", "010", "011", "100", "101", "110", "111" };
   const int shf = strlen( oct[ 0 ] ); // =3
   while( 1 ) {
      char buf[ 80 ], *p;
      unsigned long inp, j;
      printf( "введите целое положительное число: ");
      fgets( buf, sizeof( buf ) - 1, stdin );
      if( index( buf, '\n' ) != NULL )
         *index( buf, '\n' ) = '\0';
      j = inp = atol( buf );
      *( p = buf + sizeof( buf ) - 1 ) = '\0';
      do strncpy( ( p -= shf), oct[ j % 8 ], shf );
      while( ( j /= 8 ) > 0 );
      printf( "число: %ld => %s\n", inp, p );
   }
   return 0;
}
3. похоже, но через 16-ти-ричные остатки, ... и лень явно выписывать строчние представления 16-ричных цифр (b23.c):

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

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

#define BASE 16

int main() {
   char* hex[ BASE ];                  // образы двоичных 0 1 2 3 4 5 6 7 8 9 A B C D E F
   unsigned long inp, j;
   for( j = 0; j < BASE; j++ ) {
      char buf[] = "....";
      int i, k = j;
      for( i = 0; i < strlen( buf ); i++, k >>= 1 )
         buf[ strlen( buf ) - i - 1 ] = ( k & 1 ? '1' : '0' );
      hex[ j ] = strdup( buf );        // копия!
   }
   const int shf = strlen( hex[ 0 ] ); // =4
   while( 1 ) {
      char buf[ 80 ], *p;
      printf( "введите целое положительное число: ");
      fgets( buf, sizeof( buf ) - 1, stdin );
      if( index( buf, '\n' ) != NULL )
         *index( buf, '\n' ) = '\0';
      j = inp = atol( buf );
      *( p = buf + sizeof( buf ) - 1 ) = '\0';
      do strncpy( ( p -= shf), hex[ j % BASE ], shf );
      while( ( j /= BASE ) > 0 );
      printf( "число: %ld => %s\n", inp, p );
   }
   return 0;
}
Написано специально с некоторыми фокусами, формальными ... но должен же мой подопечный потрудиться хотя бы расшифровывая этот код? :lol:

Итого:

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

[Olej@modules 4]$ ./b23
введите целое положительное число: 12345
число: 12345 => 0011000000111001
введите целое положительное число: ^C
[Olej@modules 4]$ ./b22
введите целое положительное число: 12345
число: 12345 => 011000000111001
введите целое положительное число: ^C
[Olej@modules 4]$ ./b21
введите целое положительное число: 12345
число: 12345 => 11000000111001
введите целое положительное число: ^C
Какие ещё есть варианты?
Вложения
b2x.tgz
(1.28 КБ) 328 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 24 окт 2014, 01:03

Olej писал(а):написать как можно больше разных способов преобразования числа в двоичное представление ... тривиально,
Задача хорошо ещё тем, что когда написав требуемые преобразования, и начинаем расширять её условие на преобразование отрицательных чисел, ... то оказывается, что написать такую же программу для отрицательных значений в общем виде - невозможно (в дополнительном коде)! Потому как такой вид двоичного представления отрицательного числа зависит от его разрядности (8, 16, 32, 64, ... бит).
Но об этом особенно широко в учебниках не пишут ... и для экспериментирующего учащегося это будет замечательным опытом! :lol: (получить такое задание)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 24 окт 2014, 01:44

Olej писал(а):Какие ещё есть варианты?
Все предыдущие варианты: от младших разрядов к старшим.
А вот наоборот: от старших к младшим (b24.c):

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

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

int main() {
   char buf[ 80 ]; 
   while( 1 ) {
      printf( "введите целое положительное число: ");
      fgets( buf, sizeof( buf ) - 1, stdin );
      if( index( buf, '\n' ) != NULL )
         *index( buf, '\n' ) = '\0';
      unsigned long inp = atol( buf ), j = inp,
                    mask = 1;
      while( 1 ) {
         if( mask << 1 > inp ) break;
         mask <<= 1;
      }
      char *p = buf;
      while( mask > 0 ) {
         if( mask <= j ) {
            *p++ = '1';
            j -= mask;
         }
         else 
            *p++ = '0';
         mask >>= 1;
      }
      *p = '\0';      
      printf( "число: %lu => %s\n", inp, buf );
   }
   return 0;
}

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

[Olej@modules b2x]$ ./b21
введите целое положительное число: 12345
число: 12345 => 11000000111001
введите целое положительное число: ^C
[Olej@modules b2x]$ ./b24
введите целое положительное число: 12345
число: 12345 => 11000000111001
введите целое положительное число: ^C
Что ещё придумать?
Вложения
b2x.tgz
(1.47 КБ) 354 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 24 окт 2014, 09:45

Olej писал(а):А чтоб не скучно, решил я задать нашему учащемуся домашнее задание: написать как можно больше разных способов преобразования числа в двоичное представление
Ну, и обратно: двоичное -> десятичное ... а заодно и во все прочие (oct, hex), но так:
- чтобы явно не вычислять численное значение степеней 2;
- опять же ... побольше способов.

Я пока могу придумать / вспомнить:

1. от младшего разряда к старшему, справа-налево (b31.c):

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

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

int main() {
   char buf[ 80 ];
   while( 1 ) {
      printf( "введите двоичное представление числа: ");
      fgets( buf, sizeof( buf ) - 1, stdin );
      if( index( buf, '\n' ) != NULL )
         *index( buf, '\n' ) = '\0';
      int j;
      for( j = 0; j < strlen( buf ); j++ )
         if( buf[ j ] != '0' && buf[ j ] != '1' ) {
            printf( "ошибочный ввод\n" );
            break;
         }
      if( j != strlen( buf ) ) continue;
      unsigned long inp = 0, mask = 1;
      for( j = strlen( buf ) - 1; j >= 0; j-- ) {
         if( '1' == buf[ j ] ) inp += mask;
         mask <<= 1;
      }
      printf( "число: %s => %lu : %lo : %lX\n",
              buf, inp, inp, inp );
   }
   return 0;
}
2. от старшего разряда к младшему, справа-налево (b32.c), схема Горнера вычисления полинома:

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

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

int main() {
   char buf[ 80 ];
   while( 1 ) {
      printf( "введите двоичное представление числа: ");
      fgets( buf, sizeof( buf ) - 1, stdin );
      if( index( buf, '\n' ) != NULL )
         *index( buf, '\n' ) = '\0';
      int j;
      for( j = 0; j < strlen( buf ); j++ )
         if( buf[ j ] != '0' && buf[ j ] != '1' ) {
            printf( "ошибочный ввод\n" );
            break;
         }
      if( j != strlen( buf ) ) continue;
      unsigned long inp = 0;
      for( j = 0; j < strlen( buf ); j++, inp <<= 1 ) {
         inp += '1' == buf[ j ]? 1 : 0; 
      }
      inp >>= 1;
      printf( "число: %s => %lu : %lo : %lX\n",
              buf, inp, inp, inp );
   }
   return 0;
}
Хотя преобразования там в обоих случаях - 1-2 строчки, последний цикл... Всё остальное - это ввод и проверка корректности ввода, но вводить с терминал двоичные последовательности до противного тоскливо ;-)

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

[Olej@modules b2x]$ ./b21
введите целое положительное число: 54321
число: 54321 => 1101010000110001
введите целое положительное число: ^C
[Olej@modules b2x]$ ./b31
введите двоичное представление числа: 1101010000110001
число: 1101010000110001 => 54321 : 152061 : D431
введите двоичное представление числа: ^C
[Olej@modules b2x]$ ./b32
введите двоичное представление числа: 1101010000110001
число: 1101010000110001 => 54321 : 152061 : D431
введите двоичное представление числа: ^C
Вложения
b2x.tgz
(1.94 КБ) 310 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 24 окт 2014, 15:49

Olej писал(а):Сижу, готовлю ... объяснения по теме (примерно по программе) "битовые операции"...
Возвращаясь к битовым операциям ... с чего всё началось:
- написать программу, показывающую результат побитовых операций над целочисленными аргументами.

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

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

#define LEN 32
char *c10to2( unsigned long n ) {
   static char str[ LEN + 1 ], *p;
   *( p = str + sizeof( str ) - 1 ) = '\0';
   do *--p = ( n & 1 ? '1' : '0' );
   while( ( n >>= 1 ) > 0 );
   return p;
}

#define FMT "%32s"
int main() {
   while( 1 ) {
      printf( "введите два числа: ");
      unsigned int d1, d2, i;
      scanf( "%u%u", &d1, &d2 );
      printf( "   " FMT "\n", c10to2( d1  ) );
      printf( "   " FMT "\n", c10to2( d2  ) );
      printf( "   " );
      for( i = 0; i <= LEN; i++ ) printf( "%c", '-' );
      printf( "\n" );  // разделитель
      printf( "&: " FMT "\n", c10to2( d1 & d2 ) );
      printf( "|: " FMT "\n", c10to2( d1 | d2 ) );
      printf( "^: " FMT "\n", c10to2( d1 ^ d2 ) );
      printf( "   " ); // разделитель
      for( i = 0; i <= LEN; i++ ) printf( "%c", '-' );
      printf( "\n" );
      printf( "~: " FMT "\n", c10to2( ~d1 ) );
      printf( "~: " FMT "\n", c10to2( ~d2 ) );
   }
   return 0;
}

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

[Olej@modules b2x]$ ./b41
введите два числа: 555 5555
                         1000101011
                      1010110110011
   ---------------------------------
&:                           100011
|:                    1011110111011
^:                    1011110011000
   ---------------------------------
~: 11111111111111111111110111010100
~: 11111111111111111110101001001100
введите два числа: 7 333
                                111
                          101001101
   ---------------------------------
&:                              101
|:                        101001111
^:                        101001010
   ---------------------------------
~: 11111111111111111111111111111000
~: 11111111111111111111111010110010
введите два числа: ^C
Вложения
b41.c
(1.05 КБ) 345 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 24 окт 2014, 22:38

Olej писал(а):объяснения по теме (примерно по программе) "битовые операции"...
Я уже тут как-то писал, что в последовательности тем иду вот по этой книжке: С. В. Шапошникова, "Особенности языка С. Учебное пособие. Лаборатория юного линуксоида", май 2012.

Почему по этой?

1.Потому что по какой-то нужно же следовать ... это лучше чем прыгать от темы к теме "по наитию".

2. Потому что мне эта книжка для начинающих (а у нас тема здесь про начинающих ;-) ) мне показалась самой последовательной и системной. В ней даже есть некоторые мелкие ошибки и местами сомнительные утверждения, но вот в последовательности ей не откажешь. Это при том, что большинство других учебников используют какую-либо конструкцию в примере кода на странице 25, а первейшее её упоминание и дальнейшее рассмотрение встречается на странице 250 :-o

3. Потому как книга свеже написана - 2012г. А то я и в нынеших перепечатываемых друг у друга учебниках встречаю временами код в записи синтаксиса K&R образца 1970-го года ... и начинаю мучительно вспоминать что оно там значило и как это переводится на современный язык. А у новичка от такого крышу снесёт, и он и запомнит что "так и надо". :-?

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

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 25 окт 2014, 01:36

Olej писал(а):В общем, несколько предыдущих и часть последующих моих примеров будет в последовательности изложения этой книги:
Дальше там будет "Посимвольный ввод и вывод." и всякие там putchar() и getchar() ...

А вот тут в дополнение ко всем учебникам (что нигде не затрагивается) дополним, что терминальная система UNIX (а это значит великого множества операционных систем ... исключая Windows) имеет 2 режима ввода: а). канонический и б). неканонический, и что по умолчанию терминал всегда находится в каноническом режиме. В каноническом режиме ввод происходит построчено (буферизированный), даже если вам хочется 1 символ по getchar(), фактический ввод по нажатию Enter. А неканонический режим может быть установлен в режиме: посимвольно, после нажатия каждой клавиши + без эхо-вывода на терминал (так работают все визуальные редакторы текстов, чтоб было понятнее).

Вот и задача: дополнить текст программой, переключающей режимы терминала и демонстрирующей ввод-вывод:

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

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdint.h>
#include <termios.h>

static struct termios saved_attributes;

static void reset_input_mode( void ) {  // восстановление терминала
   tcsetattr( STDIN_FILENO, TCSANOW, &saved_attributes);
}

void set_noncanon_mode( void ) {
   struct termios tattr;
   atexit( reset_input_mode );          // выполнить при завершении!
   tcgetattr( STDIN_FILENO, &tattr );
   tattr.c_lflag &= ~( ICANON | ECHO | ISIG );
   tattr.c_cc[ VMIN ] = 1;
   tattr.c_cc[ VTIME ] = 0;
   tcsetattr( STDIN_FILENO, TCSAFLUSH, &tattr );
}

int main ( int argc, char **argv ) {
   tcgetattr( STDIN_FILENO, &saved_attributes );
   printf( "для завершения: ^D...\n" );
   if( !( argc > 1 && 'c' == *( argv[ 1 ] ) ) )
      set_noncanon_mode();              // неканонический (посимвольный) режим
   while( 1 ) {
      char c = getchar();
      if( isprint( c ) ) putchar( c );
      else printf( "<%02X>", (uint8_t)c );
      putchar( '|' );
      fflush( stdout );
      if( c == '\004' || c == EOF ) {   // EOF : Ctrl+D 
         putchar( '\n' );
         break;
      }

   }
   return 0;
}
Здесь важный элемент - восстановление канонического режима терминала после завершения программы любым способом (^D, ^C, по kill, ...), иначе терминал пропал: вы даже программу не перезапустите по-новой: терминал глухо-немой. Посмотрите как это в коде делается.

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

[Olej@modules cio]$ gcc -Wall c11.c -o c11

[Olej@modules cio]$ ./c11 canon
для завершения: ^D...
123
1|2|3|<0A>|asd
a|s|d|<0A>|фыв
<D1>|<84>|<D1>|<8B>|<D0>|<B2>|<0A>|
<0A>|<FF>|

[Olej@modules cio]$ ./c11
для завершения: ^D...
1|2|3|a|s|d|<D1>|<84>|<D1>|<8B>|<D0>|<B2>|<0A>|<04>|
Это один и тот же набор нажатых клавиш в каноническом и неканоническом режимах.
Вложения
c11.c
(1.22 КБ) 329 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 25 окт 2014, 02:22

Olej писал(а):Дальше там будет "Посимвольный ввод и вывод." и всякие там putchar() и getchar() ...
Следующая глава там "Переменные, адреса и указатели" ... и ничего ни убавить ни добавить.
А вот дальше ... :lol: : "Функции. Передача аргументов по значению и по ссылке.". Вот тут есть где разгуляться! :lol:

Меня удивляет одно обстоятельство:
- известно, что (ещё со времён Algol-68) аргументы в функцию могут передаваться (в разных языках) 3-мя способами: а). по значению (копированием), б). по ссылке (адресом) и в). по имени;
- так вот удивляет то, что почти ни в одном руководстве по C я не видел явным образом выписанную фразу, что во всех языках линии C (C, C++, Go) аргументы в функцию передаются всегда и при любых условиях только по значению, т.е. копированием передаваемого значения;
- так точно, как, например, в FORTRAN они всегда передавались (не знаю что там произошло в Fortran-77 и Fortran-95);
- если бы такая фраза была выписана заглавными буквами перед разделом "Функции", то у всех изучающих проблем уменьшилось бы на порядок!

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

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

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

ulong powl1( ulong base, uint pow ) {
   ulong ret = 1;
   while( pow-- ) ret *= base;
   return ret;
}

ulong powl2( ulong *base, uint pow ) {
   const ulong mult = *base;
   while( --pow ) *base *= mult;
   return *base;
}

ulong powl3( ulong *base, uint *pow ) {
   const ulong mult = *base;
   while( --*pow ) *base *= mult;
   return *base;
}

int main() {
   ulong base, b, res;
   uint  pow, p;
   while( 1 ) {
      printf( "ввод: база степень > ");
      scanf( "%lu%u", &base, &pow );
      res = powl1( b = base, p = pow );
      printf( "%lu <= (%lu->%lu) ** (%u->%u)\n",
              res, base, b, pow, p );
      b = base;
      res = powl2( &b, p = pow );
      printf( "%lu <= (%lu->%lu) ** (%u->%u)\n",
              res, base, b, pow, p );
      b = base, p = pow;
      res = powl3( &b, &p );
      printf( "%lu <= (%lu->%lu) ** (%u->%u)\n",
              res, base, b, pow, p );
   }
   return 0;
}
И побочные эффекты при этом (в скобках показано было->стало):

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

[Olej@modules farg]$ gcc -Wall f11.c -o f11

[Olej@modules farg]$ ./f11
ввод: база степень > 3 4
81 <= (3->3) ** (4->4)
81 <= (3->81) ** (4->4)
81 <= (3->81) ** (4->0)
ввод: база степень > ^C
Они, в общем, общеизвестны... Но обращаем внимание, как мы свободно можем декрементировать размерности (1-2 варианты) как управляющие переменные циклов (а это повсеместная потребность), не опасаясь их повредить в вызывающей единице.
Вложения
f11.c
(1022 байт) 304 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 25 окт 2014, 02:37

Olej писал(а): аргументы в функцию передаются всегда и при любых условиях только по значению, т.е. копированием передаваемого значения
И ещё пример в подтверждение: передача массива в функцию.
Иногда даже слышно, что массив передаётся аргументом по ссылке - это полная ерунда!
Просто в C для эффективности (во избежание копирования) вместо массива всегда компилятор подставляет адрес начала массива (указатель), и, более того, подставляет не сам переданный адрес, а его копию (передаётся указатель по значению)!
(в Go от этой практики отказались, там массив передаётся копированием, но там есть срезы массива, вместо которых передаётся их адрес начала)

Убеждаемся:

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

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

uint summa( uint *is, uint len ) {
   uint ret = 0;
   while( len-- ) ret += *is++;
   return ret;
}

int main() {
   uint n, i;
   while( 1 ) {
      printf( "ввод: длина последовательности [1..N] > ");
      scanf( "%u", &n );
      uint *seq = (uint*)calloc( n, sizeof( uint ) ), *p = seq;
      for( i = 0; i < n; *p++ = i++ + 1 ); // 1,2,3,4,...2
      printf( "указатель последовательности = %p\n", seq );
      printf( "сумма последовательности = %u\n", summa( seq, n ) );
      printf( "указатель последовательности = %p\n", seq );
      free( seq );
   }
   return 0;
}

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

[Olej@modules farg]$ make f12
gcc -Wall -o f12 f12.c

[Olej@modules farg]$ ./f12
ввод: длина последовательности [1..N] > 1
указатель последовательности = 0x113a010
сумма последовательности = 1
указатель последовательности = 0x113a010
ввод: длина последовательности [1..N] > 3
указатель последовательности = 0x113a010
сумма последовательности = 6
указатель последовательности = 0x113a010
ввод: длина последовательности [1..N] > 10
указатель последовательности = 0x113a030
сумма последовательности = 55
указатель последовательности = 0x113a030
ввод: длина последовательности [1..N] > 10000
указатель последовательности = 0x113a010
сумма последовательности = 50005000
указатель последовательности = 0x113a010
ввод: длина последовательности [1..N] > ^C
Как мы ни крутим указатель динамически размещённого массива внутри функции, в вызывающей единице мы не повредим указатель начала (потому что функция работает с копией указателя). Если это было бы не так, то к моменту free() мы имели бы разрушенный указатель, потерю пути доступа, и аварию по SIGSEGV!

А вот со структурами всё будет не так, что только подтверждает правило: аргумент-структура бдет полностью копироваться ... что и сделаем как-то в следующих примерах.

Вот такие вещи нужно обязательно показывать начинающим!
Вложения
f12.c
(776 байт) 298 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: идеи задач на C для начинающих

Непрочитанное сообщение Olej » 15 окт 2015, 18:00

Olej писал(а):Вот такие вещи нужно обязательно показывать начинающим!
Ещё несколько "красивых" задач показано рядом, в теме, посвящённой C++: C++ для начинающих.
Большая часть из них может быть в 5 минут переписана в классический C.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей