logo
Metod_ukazanija C_1-8

Пример выполнения лабораторного задания № 6

Индивидуальное задание: Слова исходного предложения расположить в обратном порядке. Расположение знаков препинания не менять.

Решение предусматривает выполнение нескольких действий:

  1. Вывод информации о назначении программы (заголовок программы).

  2. Ввод исходного предложения.

  3. Выделение из предложения слов.

  4. Выделение из предложения разделительных знаков.

  5. Сборка нового предложения из слов и знаков поочередно.

  6. Распечатка результата.

В соответствии с общим заданием на лабораторную работу каждое из перечисленных действий должна выполнять отдельная функция. Далее дадим краткие пояснения к каждой из функций. Но сначала опишем общую структуру программы. Программа может строиться так же, как и на языке Паскаль, – сначала объявление функций, а потом основная часть программы. Здесь используем другую форму: сначала будет предварительное объявление функций, потом основная функция, и только потом подробное описание предварительно записанных функций.

Напомним, что при объявлении функций записываются формальные параметры. Параметры могут быть переменными и значениями. Если параметр – это указатель, то это – параметр переменная, в противном случае – это значения. Параметр также будет значением, если он записан как константа.

Функция Title() – без параметров, так как только лишь выводит на экран набор строк.

Функция ввода предложения InpPredl(charpredl[]) имеет один параметр – предложение, которое надо заполнить. В записи этого параметра есть сразу два момента, на которые надо обратить внимание: во-первых, в качестве параметра передается одномерный массив символов, то есть указатель (параметр переменная), во-вторых, в записи массива не указана размерность массива, а только открывающие и закрывающие квадратные скобки, так как достаточно передать только адрес начала строки.

Выделение из предложения слов и разделительных знаков реализуется одним алгоритмом, поэтому могут выполняться одной и той же функцией выделения Select(constchar*predl,charm[][N],char*sel,int*n). Функция имеет четыре параметра:

  1. predl– предложение, из которого идет выделение,

  2. m– массив слов результата (под каждое слово предусмотрен размер вNсимволов),

  3. sel– адрес символов, располагаемых между выделяемыми элементами,

  4. указатель на переменную, в которой будет располагаться количество выделенных элементов, этот параметр используется как переменная, так как есть необходимость сохранить изменения.

Функция сборки нового предложения Constructor(charslova[][N],charrazd[][N],intsl,intrz) – это действительно функция, так как возвращает указатель на первый символ полученного предложения. Назначение параметров понятно по названиям: массив слов, массив разделителей, количество слов, количество разделителей.

Вывод предложения функцией OutPredl(char*s1,char*s2) использует два параметра: исходное предложение и результат.

Функция strdupслужит для создания в оперативной памяти дубликата передаваемой в качестве параметра строки. Функцияstrdupзапрашивает у операционной системы оперативную память динамически, то есть в процессе работы программы, получает ее и возвращает указатель на занятую область. По завершении работы программы необходимо память опять отдать операционной системе. Это действие выполняется функциейfree.

Главная функция последовательно использует (вызывает на исполнение) перечисленные функции одну за другой. Даже если функции используются в программе всего один раз, программа становится гораздо проще и понятнее. Перед вызовом некоторых функций делаются подготовительные операции, например, строчные и заглавные буквы объединяются в единый массив.

Теперь можете проанализировать весь текст программы:

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#include <locale.h>

#define N 20

// ПРЕДВАРИТЕЛЬНОЕ ОБЪЯВЛЕНИЕ ФУНКЦИЙ

// Заголовок программы

void Title();

// Ввод предложения

void InpPredl (char predl[]);

// Выделение из предложения

void Select(const char *predl, char m[][N],char *sel, int *n);

// Сборка предложения

char *Constructor(char slova[][N], char razd[][N], int sl, int rz);

// Вывод результата

void OutPredl(char *s1, char *s2);

inline void rus() // Русификация вывода в консольное окно

{

setlocale( LC_CTYPE, ".1251" );

setlocale( LC_MONETARY, ".1251" );

}

// ОСНОВНАЯ ФУНКЦИЯ

int main()

{

// ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ

char predl[80]; // Введенное предложение

char *res; // Результирующее предложение

char slova[N][N]; // Массив слов в предложении

char razd [N][N]; // Массив разделителей в предложении

int sl=-1, rz=-1; // Счетчики слов и разделителей

char buk[80]; // все буквы алфавита

char *bs="йцукенгшщзхъфывапролджэячсмитьбю";// Буквы строчные

char *bz ="ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";/* заглавные */

char *r="`!;:,.?- _"; // Разделительные знаки

//ВЫЗОВ ФУНКЦИЙ НА ИСПОЛНЕНИЕ

rus();

// Заголовок программы

Title ();

// Ввод предложения

InpPredl (predl);

// Выделение из предложения слов

Select (predl, slova, r, &sl);

// Выделение из предложения разделителей

strcpy(buk,"");

strcat (buk, bs);

strcat (buk, bz);

Select (predl, razd, buk, &rz);

// Сборка предложения

res = Constructor(slova, razd, sl, rz);

// Вывод результата

OutPredl (predl, res);

free (res);

return 0;

}

// ОПИСАНИЕ ИСПОЛЬЗУЕМЫХ ФУНКЦИЙ

// Заголовок программы

void Title()

{

puts (" Лабораторное задание по теме № 6\n");

puts (" Во введенном предложении расположите слова");

puts (" в обратной последовательности.");

puts(" Порядок следования знаков препинания не менять.");

puts(" В предложении используются русские буквы и знаки. \n");

}

// Ввод предложения

void InpPredl(char *s)

{

puts("Введите предложение \n");

strcpy (s,"Верите ли вы, что задача решена?");

// gets (s);

}

// Вывод результата

void OutPredl (char *s1, char *s2)

{

puts ("Исходное предложение");

puts (s1);

puts (" Результат ");

puts (s2);

}

// Выделение из предложения

void Select(const char *predl, char m[][N], char *sel, int *n)

{

char *p, *s;

s=strdup (predl); // Сделать копию исходного предложения

// так как передается константа, strtok требует

// внесения изменений при своей работе

p = strtok (s, sel);

while (p)

{

(*n)++;

strcpy (m[*n],p);

p = strtok (NULL, sel);

}

free (s);

}

// Сборка предложения

char *Constructor(char slova[][N], char razd[][N], int sl, int rz)

{

int i, j;

char res[80];

char *s;

*res=0; // Начальное значение результата

i = sl;

j=-1;

while ((i>=0)||(j<=rz))

{

if ((i>=0)) strcat (res, slova[i]); // Добавление слова

i--;

j++;

if ((j<=rz)) strcat (res, razd[j]); // Добавление знаков

}

s = strdup (res);

return s;

}