- •Лабораторные работы. Сборник задач.
- •Оглавление
- •Часть 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 Уровень сложности
Синтаксический анализатор
Цель: закрепление на практике знаний работы с синтаксическим анализатором.
Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания.
Самостоятельная работа не предусмотрена.
Обязательное зачетное задание.
Необходимый уровень знаний:
работа с функциями;
работа с указателем;
механизм рекурсии.
Задача
Построить синтаксический анализатор для понятия «формула».
формула ::= цифра формула знак формула
знак ::= +
цифра ::= 0|1|2|3|4|5|6|7|8|9
#include<stdio.h>
#include <stdlib.h>
// длина вводимой строки
#define L 1024
// состояние анализатора
// стартовое
#define START 0
// встретилась цифра
#define DIGIT 1
// встретился знак
#defineSIGN2
// ввод строки
void inputstring(char* sym)
{ charch;
//до тех пор, пока не встретился знак пробела
do
{
// чтение очередного символа
ch=getchar();
// добавление символа в строку
*sym=ch;
// наращивание
sym++;
}
while (ch != 10);
*sym ='\0';
}
// проверка является ли символ знаком арифметического действия
bool isSign(char ch)
{
char sings[] = {'+', '-', '*'};
for (int i = 0; i < 3; i++)
{
if (sings[i] == ch) return true;
}
return false;
}
// проверка является ли очередной символ цифрой
bool isDigit(char ch)
{
char digits[] = {'0','1','2','3','4','5','6','7','8','9'};
for (int i = 0; i < 10; i++)
{
if (digits[i] == ch) return true;
}
returnfalse;
}
// функция проверки правильности формулы
bool checkFormula(char* formula)
{
// начальное состояние анализатора
int state = START;
// идем по строке пока не символ с кодом 10 (ENTER)
while(*formula != 10)
{
// получение текущего символа
char ch = *formula;
// если пробел - незначащий символ, пропускаем
if (ch == ' ')
{
formula++;
continue;
}
// если встретилась цифра и текущее состояние начальное или 'знак'
else if (isDigit(ch) && (state == START || state == SIGN))
{
state = DIGIT;
}
// если встретился знак и текущее состоянии 'цифра'
else if (isSign(ch) && state == DIGIT)
{
state = SIGN;
}
// любой другой случай ошибочный
else
{
return false;
}
// смещение указателя по строке на следующий символ
formula++;
}
// если последнее состояние цифра - правильно, если знак - неправильно
return (state == DIGIT) ? true : false;
}
int main(int argc, int *argv[])
{
char* formula = (char*) malloc (L * sizeof(char));
printf("Input formula: ");
// ввод строки
inputstring(formula);
// проверка правильности
if (checkFormula(formula))
{
printf("Formula is valid\n");
}
else
{
printf("Formula is not valid\n");
}
return0;
}
Лабораторная работа №11
Текстовый файл
Цель: закрепление на практике функций работы с текстовыми файлами.
Методические рекомендации: лабораторная работа рассчитана на 2 часа и состоит из анализа одного разобранного задания и самостоятельной работы.
Обязательное зачетное задание.
Необходимый уровень знаний:
работа с функциями;
использование функций из библиотеки <string.h>.
Задача
В файле “a.txt” содержится некоторая текстовая информация. Написать три варианта считывания содержимого файла “a.txt” в файл “b.txt”.
Дополнительные условия: использовать различные библиотечные функции.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// первый вариант функции копирования (используются функции fputc();fgetc())
void filecopy1(FILE *source, FILE *target)
{
int c;
// считываем файл посимвольно, пока не достигнут конец файла
while ((c = fgetc(source)) != EOF)
{
// пишем в файл считанный символ
fputc(c, target);
}
}
// второй вариант функции копирования (используются функции fputs();fgets())
void filecopy2(FILE *source, FILE *target)
{
char* str = (char*) malloc (255 * sizeof(char));
// считываем строкeдлинной 255 символов из файла
while ((str = fgets(str, 255, source)) != NULL)
{
// и записываем ее в другой файл
fputs(str, target);
}
}
// третий вариант функции копирования (используются функции fscanf(), fprintf())
void filecopy3(FILE *source, FILE *target)
{
char* str = (char*) malloc (255 * sizeof(char));
// форматированное чтение строки из 255 символов из файла
while (fscanf(source, "%s", str) != EOF)
{
// и запись их в другой
fprintf(target, "%s", str);
}
}
void copy(char* fsource, char* ftarget, int type)
{
// описание переменных для файл чтения и файла записи
FILE* source;
if (fopen(fsource, "r"==NULL)
{
printf("Cannot open file\n"); exit(0);
}
FILE* target = fopen(ftarget, "w");
// копирование
switch(type)
{
case 1:
filecopy1(source, target);
break;
case 2:
filecopy2(source, target);
break;
case 3:
filecopy3(source, target);
break;
}
// вывод результата на экран
printf("File '%s' copied to '%s'. %d bytes has been written\n", fsource, ftarget, ftell(source));
// закрытие файлов
if (fclose(source)!=0)
fprintf(stderr," Cannot close file \n");
if (fclose(target)!=0)
fprintf(stderr," Cannot close file \n");
}
int main ()
{
copy("laba91.dsp", "copy1.txt", 1);
copy("laba91.dsw", "copy2.txt", 2);
copy("laba91.plg", "copy3.txt", 3);
return 0;
}