- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 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 Уровень сложности
1 Задача
Цель: работа с массивом символов.
Выделение последнего слова в предложении.
#include <stdio.h>
// подключение библиотеки работы со строками
#include <string.h>
// максимальная длина предложения
#define msg 400
// максимальная длина слова
#define lastw 8
// заданное предложение
char msg = “I love you”;
char lastw;
// функция для выделения слова в предложении
void lastword(void);
int main()
{
lastword();
printf(“Последнее слово % \n”, lastw);
return 0;
}
void lastword(void)
{
int i, beg, end;
// определение позиции символа, который стоит в конце предложения
end = strlen(msg)-1;
// находим последний символ в конце предложения, отличный от пробела while (msg[end] == ’ ’)
end--;
beg = end;
// нахождение позиции символа пробела перед последним словом
while (msg[beg]! == ’ ’)
beg--;
// запись одного слова в массив
for(i =0; i<(end- beg); i++)
lastw[i] = msg[beg+i+1];
for(i =end-beg; i<lastw; i++)
lastw[i] =’ ’;
}
2 Задача
Найти все натуральные числа, не превосходящие заданного числа N и делящиеся на каждую из своих цифр.
#include<stdio.h>
#include<stdlib.h>
// подключение библиотеки для работы со строками
#include<string.h>
#include<malloc.h>
// функция проверки деления числа на каждую из своих цифр
bool divide(int i)
{
int oldValue = i;
// объявление массива из 15 символов
char buf[15];
strcpy(buf, ” ”);
// попытка перевести символы в целое число
itoa(i,buf,20);
// вычисление длины введенных символов для определения количества цифр в числе
int l = strlen(buf);
// объявление указателя
int*array;
array =(int*)malloc(sizeof(int)*l);
// проверка делимости числа на каждую цифру
for(int loop = 0; loop<1; loop++)
{
array[loop]=i%10;
if(array[loop] == 0 || oldValue % array[loop]! = 0)
return false;
I = (int)(i-I %10)/10;
}
// очистка памяти, выделенной под массив
free(array);
return true;
}
int main()
{
int N;
printf(“Input integer number: ”);
// считывание числа, до которого осуществляется проверка
scanf(“%d”, &N);
for(int i= 1; i<=N; i++)
{
// если число делится на каждую из своих цифр,
if(divide(i))
// то выводим его на экран
print(“%d \n”, i);
}
return 0;
}
3 Задача
Цель: работа со строкой.
Дано предложение, которое заканчивается точкой.
1) удалить все лишние пробелы.
2) удалить во всех словах одинаковые символы, стоящие подряд, оставив только один.
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#defineMAXSTR500
// функция чтения символов и запись их в строку
void pointstring(char*);
// удаление лишних пробелов
voiddelspace(char*,char*);
void samesymb(char*);
void main()
{
char str[MAXSTR];
char strn[MAXSTR];
pointstring(str);
// функция копирования 1-ой строки во 2-ю, игнорируя лишние пробелы
delspace(str, strn);
// функция удаления в слове стоящие подряд одинаковые символы
samesymb(strn);
printf ("%s\n",strn);
}
void pointstring(char* sym)
{
char ch;
do
{
// считывание одного символа
ch=getchar();
// заполнение массива символов sym
*sym=ch;
sym++;
}
// считываем символы, пока не встретится точка
while (ch!='.');
// добавление к строке символов \0, таким образом,symявляется строкой
*sym ='\0';
}
// функция копирования 1-ой строки во 2-ю, игнорируя лишние пробелы
void delspace(char* sym, char* tekstrn)
{
charch;
// признак наличия пробела
intprobel=1;
// инициализация переменной
ch=*sym;
do
{
// если символ является пробелом
if(ch==' ')
{
// то пробел приравниваем к 1, количество пробелов увеличили на 1
if (probel==1) sym++;
else
{
*tekstrn++=*sym++;
probel=1;
}
}
else
{
*tekstrn++=*sym++;
probel=0;
}
ch=*sym;
}
while (*sym!='\0');
*tekstrn='\0';
}
// функция удаления в слове стоящие подряд одинаковые символы
void samesymb(char* word)
{
char* prev;
char* cur;
char* tmpwrd;
tmpwrd=(char*)malloc(strlen(word)+1);
char* curtmp=tmpwrd;
*curtmp=*word;
prev=word;
cur=word+1;
while(*cur!='\0')
{
if(*cur==*prev) cur++;
else
{
*(++curtmp)=*cur;
prev=cur++;
}
}
*(++curtmp)='\0';
strcpy(word, tmpwrd);
free(tmpwrd);
}
Самостоятельная работа
Изменить задание 3 так, чтобы количество элементов в строке задавалось пользователем.
Изменить задание 1 так, чтобы:
ввод символов осуществлялся пользователем;
память под строку выделялась в динамической области.
Добавить в задании 3 функцию условие: удалить во всех словах одинаковые символы, стоящие подряд, оставив только один.
Лабораторная работа №8
Указатели на функции
Цель: закрепление на практике знаний работы с указателями на функцию.
Методические рекомендации: лабораторная работа рассчитана на 1,5 часа и состоит из анализа одного задания и выполнения самостоятельной работы.
Обязательное зачетное задание.
Необходимый уровень знаний:
работа с функциями;
работа с указателями.