Сижу, готовлю для одного такого студента (точнее выпускника), но у которого не было курса IT, объяснения по теме (примерно по программе) "битовые операции"...Olej писал(а):Предложение: у кого есть - сформулируйте красивые идеи учебных задач для реализации на C под Linux (в GCC)?
Для начинающих практическое применение студентов.
Но как объяснить битовые операции тому, кто не знает двоичное представление целочисленное?
И получается так, что задача преобразований в двоичную форму является составной частью любых рассмотрений битовых операций.
А чтоб не скучно, решил я задать нашему учащемуся домашнее задание: написать как можно больше разных способов преобразования числа в двоичное представление ... тривиально, а любопытно .
Вот что у меня пока получается:
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;
}
Код: Выделить всё
#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;
}
Код: Выделить всё
#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;
}
Итого:
Код: Выделить всё
[Olej@modules 4]$ ./b23
введите целое положительное число: 12345
число: 12345 => 0011000000111001
введите целое положительное число: ^C
[Olej@modules 4]$ ./b22
введите целое положительное число: 12345
число: 12345 => 011000000111001
введите целое положительное число: ^C
[Olej@modules 4]$ ./b21
введите целое положительное число: 12345
число: 12345 => 11000000111001
введите целое положительное число: ^C