- •А.П. Новоселов программирование на языке Си
- •1.1. Порядок создания программы
- •1.2. Ввод и выполнение программы
- •1.3. Модификация программы
- •1.4. Пошаговое выполнение программы
- •1.5. Сообщения компилятора и компоновщика
- •1.6. Действия в случае ошибки выполнения
- •1.7. Ошибки в форматах ввода/вывода
- •1.8. Вычисления с вещественными числами
- •2.1. Лексемы
- •2.2. Идентификаторы
- •2.3. Ключевые слова
- •2.4. Константы
- •3.2. Арифметические операции
- •3.3. Операции отношения и логические операции
- •3.4. Операции присваивания
- •3.5. Поразрядные операции
- •3.6. Библиотека функций
- •1. Вычисление площади и периметра геометрической фигуры
- •2. Вычисления по формулам с вещественными числами
- •3. Арифметические операции для целочисленных данных
- •4. Циклы с заданным числом повторений
- •5. Алгоритмы с разветвлениями
- •6. Циклы с условием окончания
- •7. Последовательная обработка данных
- •8. Поразрядные операции
- •9. Обработка массивов
- •10. Обработка матриц
- •11. Сортировка массивов
- •12. Сортировка матриц
- •1.1. Математическая постановка
- •1.4.2. Содержание результатов работы программы на экране
- •Выполнил: Иванов и.П., гр. Ут – 11, вариант 13(2)
- •1.4.3. Текст программы
- •Выводы по работе
8. Поразрядные операции
Цель работы: изучение поразрядных операций для решения задач обработки целочисленных данных на уровне битов, выработка умений тестирования и отладки программ с поразрядными операциями.
/* Программа 8 демонстрирует использование поразрядных операций для работы с целыми числами на уровне битов: постановка и сброс флагов, работа с 16-ричными числами и кодами символов. */
#include <stdio.h>
#include <conio.h>
void long_bits (unsigned long L ); // Выводит на экран 2-ый код 16-го числа
void main( void )
{ unsigned long L;
clrscr();
< Вывод шапки программы, см. программу 1 или 2 >
// Установка флага в k-ый разряд числа, k=0..31
L = 0;
long k = 3;
L = L | ( 1L<< k ); // L = 8 для флага в позиции 3
printf( "\n Установка флага в %d разряд числа L = 0: L = %lX", k, L);
// Сброс флага из k-го разряда числа, k=0..31
L = 0xFFFFFFFF;
L = L & ~( 1L<< k );
printf("\nСброс флага в %d разряде числа L=0xFFFFFFFF: L=%lX", k, L);
getch();
// Образуем символ из старшей и младшей 16-ых цифр числа L
L=0x42345678; // код ch=0x48
printf("\n Cимвол из старшей и младшей 16-х цифр числа L=%lX", L);
char ch;
ch=((L & 0xF0000000) >> 24); // ch = 0x40
ch=ch | (L & 0xF); // ch=0x48
printf("\nL=%lX, 16-ый код ch=%X, символ ch=%c ", L, ch, ch);
getch();
printf("\n\n Введите long-число в 16-м коде для перевода в 2-ый код: " );
scanf("%lx", &L);
long_bits( L );
getch();
// Пример использования операции XOR для кодирования и декодирования // int-числа d символом ch:
ch='a';
int d=12345;
printf("\n\n Число d=%d закодировано символом \'%c\' операцией XOR: ",
d, ch);
d=(d & 0xFF) ^ ch | (d & 0xFF00) ^ (int(ch) << 8);
printf("\n\t код d=%d", d);
d=(d & 0xFF) ^ ch | (d & 0xFF00) ^ (int(ch) << 8);
printf("\n Декодируем аналогичными действиями: d=%d", d);
getch();
}
void long_bits( long L )
{ unsigned long m=1;
printf(" Число %lX в 16-м коде имеет 2-е представление:\n\t", L);
for(int k=31; k>=0; k--)
{ if( (m << k) & L ) printf("1");
else printf( "0" );
if( k%4 == 0 ) printf( " " ); // группы битов 16-х цифр разделяем пробелом
}
}
Вопросы и упражнения:
Перечислите и поясните на примерах поразрядные операции, укажите их приоритет.
Вычислите значение выражения с поразрядными операциями: ~0xB ^ 6 | 0xD & 7
Составьте функцию для определения, встречается ли в числе L код заданного символа ch.
Напишите функцию кодирования long-числа L заданной 16-ой цифрой Z путём выполнения операции Z XOR xi, i=1, 2, …, 8, xi – группы из 4-х битов числа L.
9. Обработка массивов
Цель работы: изучение приёмов обработки одномерных массивов данных, выработка умений алгоритмизации и программирования задач с массивами, отладки и тестирования программ с массивами.
/*Программа 9. Программа демонстрирует типовые процедуры обработки массивов: ввод, вывод, анализ и обработка данных массива.*/
#include <stdio.h>
#include <math.h>
void in_arr( float *arr, int n ); // ввод с клавиатуры n элементов массива
void out_arr( float *arr, int n ); // вывод на экран n элементов массива
int array_processing(double *arr, int n, double *psum, double *pprod);
/* Определение суммы s, произведения p и количества k "+"-ых элементов массива, расположенных после первого “–“-го элемента. Размер массива n <= 50.
ТЕСТ: x = { 1, 2, -1, 2, -2, 3, -3 }, n=7. Результаты: s=5, p=6, k=2.
psum, pprod, – переменные-указатели. C указателями связаны две специальные операции: & и *. Оператор &x означает "взять адрес" переменной x, оператор *px – "значение, расположенное по адресу px".
*/
float max2(float *arr, int n); // поиск в массиве максимальной по модулю // разности двух чисел. ТЕСТ: x = { 1, 5, 3, 0, -1, 2, 4}, n = 7, результат: = 6 .
int max_eqw(float *arr, int n); // определение максимального числа равных // соседних чисел. ТЕСТ: x = { 3, 1, 3, 0, 1, 1, 1, 1, 2}, n = 9, результат: 4 .
main()
{ float x[50], p, s;
int i, k, n;
printf("\n Введите размер массива n: ");
scanf("%d", &n);
in_arr( x, n );
printf(" \n Исходный массив размером %d: \n", n);
out_arr( x, n ) ;
k = array_processing( x, n, &s, &p);
printf("\n В массиве после первого \”-\“-го числа %d чисел x[i]>0, \
их сумма = %.3f, произведение = %.3f ", k, s, p);
printf("\n Макс-я по модулю разность двух чисел = %.3f ", max2(x, n));
printf("\n Макс-е число равных соседних чисел = %.3f ", max_eqw (x, n));
} // Конец main()
/* В комментариях функций in_arr() и out_arr() записаны операторы с элементами массива, обращение к которым выполняется по указателю без операции индексации arr [ i ] */.
void in_arr( float *arr, int n )
{ printf("\n Введите %d элементов массива: ", n);
for ( int i = 0; i < n; i++)
scanf( "%e", &arr[i] ); // scanf( "%e", arr++ );
}
void out_arr( float *arr, int n )
{ for ( int i = 0; i < n; i++)
{ printf( " %.3f ", x[i] ); // printf( " %.3f ", *x++ );
if ( (i+1) % 8 == 0 ) // вывод массива по 8 чисел в строке:
printf("\n");
}
}
int array_processing(double *arr, int n, double *psum, double *pprod)
{ int i;
*psum = 0; *pprod = 1; k = 0, m = -1; // инициализация
for ( m = 0; m < n; m++ )
if (arr[m] < 0) break;
for ( i = m+1; i < n; i++ )
if (arr[i] > 0)
{ *psum += arr[i];
*pprod *= arr[i];
k += 1;
}
return k;
}
float max2( float *arr, int n )
{ float k; int k, m = 0;
for(int i = 0; i < n-1; i++)
for( k = i+1; k < n; k++)
if( fabs( x[i]-x[k] ) > m) m = fabs( x[i] - x[k] );
return m;
}
int max_eqw( float *arr, int n )
{ int i, k=0, m=0;
for(i=0; i<n-1; i++)
if( x[i] == x[i+1] ) m++;
else if( m > k ) k = m, m = 0;
return k+1;
}
Вопросы и упражнения
Как организован одномерный массив в программе: тип элементов массива, их расположение в памяти компьютера?
Как объявить массив в программе?
Какое значение имеет объект программы имя массива? Можно ли изменить это значение?
Как обратиться по указателю к элементу arr[i] массива?
Есть ли ошибка в списке инициализации массива: int х[3] = {1, 2, 3, 4}; ?
Напишите операторы вывода элементов одномерного массива по заданному условию: а) каждого k-го элемента, б) m последних элементов, в) только отрицательных или только положительных элементов.
Напишите функции: а) поиск минимального (максимального) элемента массива, б) поиск двух наибольших (наименьших) чисел в массиве.
Выполните упражнение 6 c выбором элементов массива по указателямю.
Определите значение m как результат операторов:
int m = 0, n = 10; // x[10] = { 1, 2, 2, 3, 4, 4, 5, 6, 6, 7 }
for( int i = 0; i < n - i; i++)
if( x[i] != x[i+1] ) m++; else m - -;