- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 1. Лаборатоные работы
- •Работа со структурами и объединениями …………………………………….91
- •3 Задача
- •4 Задача
- •5 Задача
- •6 Задача
- •Дополнительное условие:использование цикла с предусловием.
- •1 Задача
- •2 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функций.
- •3 Задача
- •Дополнительное условие: программа написана без использования функции.
- •Дополнительное условие: программа написана с использованием функции.
- •4 Задача
- •Дополнительное условие: программа написана без использования функции
- •Дополнительное условие: программа написана с использованием функции.
- •Самостоятельная работа
- •Лабораторная работа №3
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •Лабораторная работа №6
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •4 Задача
- •Синтаксический анализатор
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •3 Задача
- •Работа с каталогами
- •Самостоятельная работа
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •1 Задача Реализовать очередь, состоящую из целых чисел
- •Комментарий:
- •2 Задача
- •1 Задача
- •Идеально-сбалансированные деревья
- •1 Задача
- •2 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •2 Задача
- •3 Задача
- •1 Задача
- •1 Задача
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности.
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •Работа с несколькими массивами
- •Преобразование массива
- •Изменение элементов массива
- •2 Уровень сложности Формирование массива и вывод его элементов
- •Анализ элементов массива
- •Преобразование массива
- •Изменение элементов массива
- •Удаление и вставка элементов
- •Серии целых чисел
- •3 Уровень сложности Множества точек на плоскости
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
- •Not простое_логическое
- •(Простое_логическое знак_операции простое_логическое)
- •Построить синтаксический анализатор для понятия предложение.
- •1 Уровень сложности
- •2 Уровень сложности
- •1 Уровень сложности
- •Примеры:
- •Двусвязные списки
- •1 Уровень сложности
- •2 Уровень сложности
- •3 Уровень сложности
3 Задача
Вычислить среднее арифметическое 10 элементов одномерного массива.
3а
Дополнительное условие: работа с массивом типа int a[N].
#include <stdio.h>
#defineN10
// функция для ввода чисел массива
void Input(int a[N]);
// функция для вычисления среднего арифметического для заданного массива
float Mean(int a[N]);
intmain()
{
// выделение памяти массивом из 10 символов
int a[10];
// ввод массива
Input (a);
// вывод среднего арифметического
printf("Sr %f numbers",Mean(a));
return 0;
}
void Input (int a[N])
{
puts("Input the numbers\n");
for (int i=0;i<N;i++)
{
printf("Input the %d number",i);
scanf("%d",&a[i]);
}
}
float Mean(int a[N])
{
int sum=0;
puts("Input the numbers\n");
// вычисления суммы элементов
for (int i=0; i<N; i++)
sum+=a[i];
// возвращение среднего арифметического элементов массива
return (float)sum/N;
}
3б
Дополнительное условие: работа с динамическим массивом.
#include <stdio.h>
#include <malloc.h>
// ввод элементов массива
void Input (int *a, int n);
// вычисление среднего арифметического для элементов заданного массива
float Mean(int *a, int n);
// вывод на экран элементов массива
void Print (int *a, int n);
intmain()
{
// указатель на значение целого типа
int* a;
int n;
puts("Input the quantity of elements: ");
// ввод количества элементов массива
scanf("%d",&n);
// выделение памяти под n элементов массива целых чисел
a = (int*)malloc(sizeof(int)* n);
// ввод элементов массива
Input(a,n);
printf("Sr %f numbers\n",Mean(a,n));
// вывод на экран элементов массива
Print(a,n);
// освобождение памяти
free(a);
return 0;
}
void Input (int *a, int n)
{
puts("Input the numbers\n");
for (int i=0;i<n;i++)
{
printf("Input the %d number ",i);
// вводi-го элемента
scanf("%d",a+i);
}
}
float Mean(int *a, int n)
{
int sum=0;
puts("Input the numbers ");
for (int i=0;i<n;sum+=a[i],i++);
// возвращение среднего арифметического для заданного массива
return (float)sum/n;
}
void Print (int *a, int n)
{
puts("Array:");
for (int i=0;i<n;i++)
{
printf("%d , ",*(a+i));
}
}
Самостоятельная работа
Добавить функцию нахождения максимального значения в одномерном массиве.
Вычислить количество отрицательных значений в одномерном массиве или распечатать сообщение, если отрицательные значения отсутствуют.
Лабораторная работа №6
Матрицы
Цель: закрепление на практике знаний работы с матрицами. Работа с указателями и двумерными массивами. Связь многомерного массива и указателя. Разбиение проекта на разные файлы, использование заголовочного файла. Работа с русским алфавитом.
Методические рекомендации: лабораторная работа рассчитана на 4 часа и состоит из анализа пяти заданий и выполнения самостоятельной работы.
Обязательное зачетное задание.
Необходимый уровень знаний:
понятие указателя;
работа с адресной арифметикой;
связь между указателями и одномерными массивами.
1 Задача
Дан двумерный массив. Переставить с нем строки следующим образом: первую с последней, вторую - с предпоследней и т.д.
1а
Дополнительное условие: размер матрицы фиксированный.
// заголовочный файл
Matr.h
# include <stdio.h>
// задание количества строк
# defineN3
// задание количества столбцов
# defineM3
// функция печати элементов матрицы
void Print_Matr(int A[N][M]);
// функция ввода элементов матрицы
void Input_Matr(int A[N][M]);
// функция модификации элементов матрицы
void Change(int A[N][M]);
// вспомогательная функция обмена строк
void swap(int A[N][M],int l);
// заголовочный файл
Matr.cpp
# include "matr.h"
int main(void)
{
// объявление матрицы целых чисел размерности mнаn
int A[N][M];
// ввод матрицы целых чисел
Input_Matr(A);
// функция печати элементов матрицы
Print_Matr(A);
// переход на следующую строку
printf("\n");
Change(A);
printf("\n");
Print_Matr(A);
return 0;
}
// заголовочный файл
Matr_fun.cpp
# include <stdio.h>
# include "matr.h"
void Change(int A[N][M])
{
inti;
//цикл работает до тех пор пока не встретит среднюю строку в матрице
for(i=0;i<(int)N/2;i++)
// меняем элементы в матрице А, передавая номер строки
swap(A,i);
}
// вспомогательная функция обмена строк
void swap(int A[N][M],int k)
{
intj;
// одномерный массив целых чисел размерности M
int B[M];
for(j=0;j<M;j++)
// меняем местами элементы матрицы
{
B[j]=A[k][j];
A[k][j]=A[N-1-k][j];
A[N-1-k][j]=B[j];
}
}
// функция ввода статической матрицы размера NнаM
void Input_Matr(int A[N][M])
{
int i,j;
printf("Enter matrix\n");
// цикл по строкам
for(i=0;i<N;i++)
// цикл по столбцам
for(j=0;j<M;j++)
// считываем элементы матрицы
scanf("%d",&A[i][j]);
printf("\n");
}
// функция вывода элементов матрицы на экран
void Print_Matr(int A[N][M])
{
int j,i;
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
// печать элементов матрицыA[i][j]
printf("%d ",A[i][j]);
printf("\n");
}
}
1б
Хранение элементов двумерной матрицы как одномерный массив. В функции ввода, вывода передаются размеры матрицы.
// заголовочный файл
Matr.h
# include <stdio.h>
# include <malloc.h>
void Print_Matr(int *A,int n, int m);
void Input_Matr(int *A,int n, int m);
void Change(int *A,int n,int m);
void swap(int *A,int k,int m,int n);
Matr.cpp
# include "matr.h"
int main(void)
{
int n,m;
int* A;
printf("enter the size of matrix");
// ввод размеров матрицыmиn
scanf("%d%d",&n,&m);
// выделяем память под элементы матрицы
A=(int*)malloc(sizeof(int)*n*m);
Input_Matr(A,n,m);
Print_Matr(A,n,m);
printf("\n");
Change(A,n,m);
Print_Matr(A,n,m);
printf("\n");
// освобождаем память, выделенную под элементы матрицы
free(A);
return 0;
}
Matr_fun.cpp
# include "matr.h"
# include <stdio.h>
void Change(int *A,int n,int m)
{
int i;
for(i=0;i<(int)n/2;i++)
swap(A,i,m,n);
}
void swap(int *A,int k,int m,int n)
{
int j;
int *B;
// выделяем память под вспомогательный массив
B=(int*)malloc(sizeof(int)*m);
for(j=0;j<m;j++)
{
//*(B+j)-это указатель на началоB+элементj
*(B+j)=*(A+j+k*m);
*(A+j+k*m)=*(A+n*m-m+j-k*m);
*(A+n*m-m+j-k*m)=*(B+j);
}
}
void Input_Matr(int* A,int n,int m)
{
int i;
printf("Enter matrix\n");
for(i=0;i<n*m;i++)
scanf("%d",(A+i));
printf("\n");
}
void Print_Matr(int* A,int n,int m)
{
int i,k=0;
for(i=0;i<n*m;i++)
{
printf("%d ",*(A+i));
if (i==m-1+k)
{
printf("\n");
k=k+m;
}
}
}
1в
Вариант аналогичный предыдущему. Отличие заключается в обращении к элементам массива. Поэтому изменены функции ввода, вывода элементов матрицы. В функции ввода, вывода передаются размеры матрицы.
# include <stdio.h>
# include <malloc.h>
void Print_Matr(int *A,int n, int m);
void Input_Matr(int *A,int n, int m);
void Change(int* A,int n,int m);
void swap(int* A,int k,int m,int n);
int main(void)
{
int n,m;
int*A;
printf("enter the size of matrix");
scanf("%d%d",&n,&m);
// считываем размерности матрицыnиm
A=(int*)malloc(sizeof(int)*n*m);
Input_Matr(A,n,m);
Print_Matr(A,n,m);
printf("\n");
Change(A,n,m);
Print_Matr(A,n,m);
free(A);
printf("\n");
return 0;
}
void Change(int* A,int n,int m)
{
int i;
for(i=0;i<(int)n/2;i++)
swap(A,i,m,n);
}
void swap(int *A,int k,int m,int n)
{
int j;
int *B;
B=(int*)malloc(sizeof(int)*m);
for(j=0;j<m;j++)
{
B[j]=A[k][j];
A[k][j]=A[n-1-k][j];
A[n-1-k][j]=B[j];
}
}
void Input_Matr(int* A,int n,int m)
{
int i,j;
printf("Enter matrix\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",(A+j*m+i));
printf("\n");
}
void Print_Matr(int* A,int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",*(A+j*m+i));
printf("\n");
}
}
1г
Известно количество строк, но неизвестно количество элементов в каждой строке. Добавлена функция работы с русским алфавитом. Количество элементов в строке задает пользователь. Выделение и освобождение памяти выделено в отдельные функции. Ограничение – в каждой строке количество элементов одинаково. В функции ввода, вывода передается количество элементов в строке.
#include <stdio.h>
#include <windows.h>
#include <malloc.h>
// задание количества строк
#defineN4
// функция ввода элементов матрицы
void InputArr(int *arr[], int m);
// вывод элементов матрицы на экран
void OutputArr(int *arr[], int m);
// функция модификации матрицы
voidChange(int*arr[],intm);
// вспомогательная функция обмена
void swap(int *arr[],int k,int m);
// функция, для работы с русским алфавитом
char* Rus(const char* text);
// функция освобождения памяти
void Despose (int *arr[], int m);
int main()
{
intm;
printf(Rus("Введите количество элементов в строке :\n"));
scanf("%d",&m);
int *arr[N];
InputArr(arr,m);
OutputArr(arr,m);
printf("\n");
Change(arr,m);
OutputArr(arr,m);
Despose (arr,m);
return 0;
}
void Despose (int *arr[], int m)
{
for(int i=0;i<m;i++)
// освобождаем память под элементы в каждой строке
free(arr[i]);
}
// функция, которая позволяет работать с русским алфавитом
char bufRus[256];
char* Rus(const char* text)
{
// загоняем текст переменной textвbufRusи преобразовываем в символы ЕОМ
CharToOem(text,bufRus);
return bufRus;
}
void InputArr(int *arr[], int m)
{
printf(Rus("Вывод элементов матрицы: \n"));
for(int i=0;i<N;i++)
{
// выделяем память под массив
arr[i]=(int*)malloc(m*sizeof(int));
for(int j=0;j<m;j++)
{
scanf("%d",arr[i]+j);
}
}
}
void OutputArr(int *arr[], int m)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<m;j++)
printf("%d\t",*(arr[i]+j));
printf("\n");
}
}
void Change(int *arr[],int m)
{
int i;
for(i=0;i<(int)N/2;i++)
swap(arr,i,m);
}
void swap(int *arr[],int k,int m)
{
int j;
int *B;
B=(int*)malloc(sizeof(int)*m);
for(j=0;j<m;j++)
{
*(B+j)=*(arr[k]+j);
*(arr[k]+j)=*(arr[N-1-k]+j);
*(arr[N-1-k]+j)=*(B+j);
}
}
1д
Количество строк и количество элементов в каждой строке задает пользователь. Ограничение – в каждой строке количество элементов одинаково. В функции ввода, вывода передаются размеры матрицы.
#include <stdio.h>
#include <windows.h>
#include <malloc.h>
void InputArr(int **arr, int row, int col);
void OutputArr(int **arr, int row, int col);
void swap(int **arr,int k,int row,int col);
void Change(int **arr,int row,int col);
char* Rus(const char* text);
void Dispose(int **arr, int col);
int main()
{ int row, col;
printf("Stroka");
// введитечисло строк
scanf("%d",&row);
printf("Stolbec");
// введите количество элементов в строке
scanf("%d",&col);
// выделение памяти под массив указателей на строки
int **arr=(int**)malloc(row*sizeof(int*));
InputArr(arr,row,col);
OutputArr(arr,row,col);
printf("\n");
Change(arr,row,col);
OutputArr(arr,row,col);
Dispose(arr,col);
free(arr);
return 0;
}
char bufRus[256];
char* Rus(const char* text)
{
CharToOem(text,bufRus);
return bufRus;
}
void InputArr(int **arr, int row, int col)
{
printf(Rus("Введите элементы матрицы: \n"));
for(int i=0;i<row;i++)
{
*(arr+i)=(int*)malloc(col*sizeof(int));
for(int j=0;j<col;j++)
{
scanf("%d",&arr[i][j]);
}
}
}
void OutputArr(int **arr, int row, int col)
{
printf(Rus("Вывод матрицы:\n"));
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
printf("%d\t",*(*(arr+i)+j));
printf("\n");
}
}
void Change(int **arr,int row,int col)
{
int i;
for(i=0;i<(int)row/2;i++)
swap(arr,i,row,col);
}
void swap(int **arr,int k,int row,int col)
{ int j;
int *B;
B=(int*)malloc(sizeof(int)*row);
for(j=0;j<col;j++)
{
*(B+j)=*(arr[k]+j);
*(arr[k]+j)=*(arr[row-1-k]+j);
*(arr[row-1-k]+j)=*(B+j);
}
}
void Dispose(int **arr,int col)
{
for(int j=0;j<col;j++)
free(*(arr+j));
}
Самостоятельная работа
Изменить задания 1г, 1д так, чтобы количество элементов в строках было различно.
Лабораторная работа №7
Строки
Цель: применение на практике знаний работы с массивами символов и строкой. Работа с библиотекой string.h.
Методические рекомендации: лабораторная работа рассчитана на 4 часа и состоит из анализа трех задания и выполнения самостоятельной работы. В заданиях продемонстрирована работа с символом строк и со строкой.
Обязательное зачетное задание.
Необходимый уровень знаний:
работа с массивами;
работа с указателями;
работа с функциями.