Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_ukazanija C_1-8.docx
Скачиваний:
12
Добавлен:
20.04.2015
Размер:
378.52 Кб
Скачать

Варианты заданий

1. В двух предложениях найти и распечатать совпадающие слова.

2. В предложении найти слово, состоящее из наибольшего количества гласных букв.

3. Распечатать слова, из которых состоит предложение, в порядке возрастания длины слова.

4. В предложении найти все однокоренные слова. Корень слова также задан с клавиатуры.

5. Удалить в предложении все повторные вхождения слов и распечатать получившееся предложение.

6. Найти в предложении слово, состоящее из наибольшего количества разных букв.

7. Выделить из предложения слова, содержащие две или более одинаковые буквы.

8. Напечатать слова, входящие в предложение, в алфавитном порядке.

9. Удалить из предложения все предлоги. Список предлогов задан во втором предложении.

10. Все буквы каждого слова в предложении записать в обратном порядке и распечатать получившееся предложение.

11. Во всех словах предложения удалить гласные буквы и распечатать получившееся предложение.

12. Дополнить каждое слово предложения пробелами так, чтобы его длина была равна длине самого длинного слова. Распечатать получившееся предложение.

13. Исходное предложение, состоящее из четырех слов, каждое из которых состоит из четырех букв, например, "Было утро, рано петь." распечатать в виде: Бурп ытае, лрнт оооь. Первое слово состоит из первых букв слов, второе - из вторых, и так далее.

14. С клавиатуры ввести две строки. Одна строка - предложение на русском языке, а вторая (под ней) состоит из пробелов и знаков "минус" или "равно" (будем считать это подчеркиванием). Выделить и распечатать подчеркнутые слова. Например, надо выделить слова «мест» и «слагаемых» в предложении:

От перемены мест слагаемых сумма не меняется.

----- ========

15. Проверьте на совпадение два предложения. Количеством пробелов между словами пренебрегать. Знаки препинания - учитывать.

16. Удалить в предложении все слова, имеющие символы цифр и распечатать получившееся предложение.

17. Предложение состоит из записи символов цифр, например:

123434 53423 2344 6564.

Распечатать слова в порядке возрастания.

Контрольные вопросы к теме № 6

  1. Представление строк в языке Си.

  2. Примеры инициализации строк в теле программы.

  3. Библиотечные функции языка Си для обработки строк.

  4. Библиотечные функции ввода-вывода строк.

Тема №7. Двумерные массивы. Файловый (бинарный) ввод-вывод Задание:

Задание состоит из нескольких пунктов:

  1. Заполнить двумерный массив (каждая строка массива заполняется в соответствии с заданием по теме №5).

  2. Распечатать содержимое массива в виде прямоугольной матрицы.

  3. Сохранить двумерный массив в бинарный файл.

  4. Считать содержимое бинарного файла в другой двумерный массив.

  5. Распечатать содержимое нового массива в виде прямоугольной матрицы.

  6. Выполнить над каждой строкой нового двумерного массива действия, предусмотренные по теме №5.

  7. Распечатать преобразованный двумерный массив.

Краткая теоретическая справка

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

int x[5][7]; // Двумерный массив целых чисел (5 строк по 7 элементов)

Для использования одного элемента двумерного массива необходимо указать оба индекса (индекс строки и индекс столбца), например,

x[2][4] = 5; // Четвертому элементу второй строки присваивается 5

Особенным для языка Си является то, что можно получить указатель на одномерный массив, входящий в состав двумерного массива. Например, адрес начала второго массива будет выглядеть так:

x[2].

Тот же самый адрес второго массива можно представить в виде

(x+2).

Здесь x – адрес начала двумерного, а смещение на 2 относительно этого начала дает увеличение адреса на 14 байтов (размер одномерного массива равен 7, а после умножения на 2 и получаем число 14).

Используя оператор разыменования, по адресу массива можно получить обращение ко второй строке двумерного массива

*(x+2).

Ну а теперь, если вспомнить тему № 5, легко получить другой вариант записи присваивания четвертому элементу второй строки значения 5

*(*(x+2)+4) = 5// Четвертому элементу второй строки присваивается 5.

В этой форме записи присутствуют два оператора разыменования. Поэтому часто в отношении переменной x (двумерного массива) говорят, что это указатель на указатель, хотя это утверждение требует некоторых пояснений, которые будут даны ниже, при рассмотрении примеров обработки двумерных массивов.

Для использования всего того, что сделано в работе по теме №5, можно просто копировать функции из файла решения задачи по теме №5, а можно использовать другой прием. Алгоритм следующий:

  1. Создадим новый проект, например, с именем 7.

  2. Копируем в рабочий каталог проекта 7 файл с решением задачи по теме №5, но с именем 5.h.

  3. Редактируем файл 5.h, оставляя только заголовки функций, например, получится следующее содержимое

// 1. Инициализация генератора случайных чисел

void Randomize();

//2. Генератор случайного числа в диапазоне от 0 до range

int Random(int range);

// 3. Проверка повторения случайного числа

// c - указатель начала массива, n - индекс нового элемента

int Test_Repetition(int *c, int n);

// 4. Добавить новый элемент

// с - указатель начала массива, n - номер нового элемента

// range1, range2 – левая и правая границы диапазона

void New_Item(int *c, int n, int range1, int range2);

// 5. Заполнение одномерного массива

// c - массив, n - количество элементов

void Filling (int *c, int n, int range1, int range2);

// 6. Распечатка одномерного массива

void Print(int *c, int n);

// 7. Поиск минимального значения

// с – указатель на начало одномерного массива,

// n - количество элементов массива,

// index – указатель на индекс минимума

int Min(int *c, int n, int *index);

// 8. Создание дубликата массива в динамической памяти

int * Copy (int *c, int n);

// 9. Обмен элементов местами в массиве

void Exchange (int *c, int n, int k);

// 10 .Сортировка методом прямого поиска

void SearchSort ( int *c, int n );

  1. Копируем в рабочий каталог проекта 7 файл с решением задачи по теме №5, но с именем 5.c.

  2. Редактируем файл 5.c и получаем

#include <stdio.h>

#include <stdlib.h>

#include <locale.h>

#include <time.h>

// 1. Инициализация генератора случайных чисел

void Randomize()

{

srand(time(0));

}

//2. Генератор случайного числа в диапазоне от 0 до range

int Random(int range)

{

return (rand() % range);

}

// 3. Проверка повторения случайного числа

// c - указатель начала массива, n - индекс нового элемента

int Test_Repetition(int *c, int n)

{ int x, j;

x = 0; // Считаем, что значение новое

// Цикл сравнения со всеми предыдущими

for (j=0; j<n; j++)

if (*(c+n)==*(c+j))

{

x = 1; // Элементы совпали

break;

}

return x;

}

// 4. Добавить новый элемент

// с - указатель начала массива, n - номер нового элемента

// range1, range2 – левая и правая границы диапазона

void New_Item(int *c, int n, int range1, int range2)

{ int x = 0; // Элементы массива разные

do

{

c[n] = Random(range2 - range1) + range1; // Новое значение

x =Test_Repetition(c,n); // Проверка на повторение

}

while (x==1); // Повторять, когда элементы совпали

}

// 5. Заполнение одномерного массива

// c - массив, n - количество элементов

void Filling (int *c, int n, int range1, int range2)

{ int i;

c[0]=Random (range2 - range1) + range1; // Элемент с индексом 0.

// Цикл заполнения массива

for (i=1;i<n; i++) // Цикл заполнения элементов значениями

New_Item(c, i, range1, range2);

}

// 6. Распечатка одномерного массива

void Print(int *c, int n)

{ int i;

for (i=0; i<n; i++)

printf("%4d",c[i]);

puts(""); // Переход на новую строку

}

// 7. Поиск минимального значения

// с – указатель на начало одномерного массива,

// n - количество элементов массива,

// index – указатель на индекс минимума

int Min(int *c, int n, int *index)

{ int i, min;

min = c[0]; // Начальное значение минимума

(*index) = 0; // Начальное значение индекса минимума

for ( i=1; i<n; i++ )

if (c[i]<min)

{

min = c[i];

(*index) = i;

}

return min;

}

// 8. Создание дубликата массива в динамической памяти

int * Copy (int *c, int n)

{ int *m, i;

// Резервирование памяти под дубликат массива

m = (int*)malloc(sizeof(int)*n);

// Копирование массива

for ( i = 0; i<n; i++ ) m[i] = c[i];

// Функция возвращает адрес нового массива

return m;

}

// 9. Обмен элементов местами в массиве

void Exchange (int *c, int n, int k)

{ int tmp; //Переменная для временного хранения данных

tmp = c[n];

c[n] = c[k];

c[k] = tmp;

}

// 10 .Сортировка методом прямого поиска

void SearchSort ( int *c, int n )

{ int i, min, indexMin; int *p;

for ( i=0; i<n-1; i++) // Определить массив с индексами от i до n

{ p = (c+i); // Задать адрес начала массива

min = Min (p, n-i, &indexMin); // Найти минимум в массиве

// Обменять местами минимальный элемент с первым

Exchange ( p, 0, indexMin ); }

}

  1. Включаем файлы 5.h и 5.c в проект.

  2. Копируем в рабочий каталог проекта 7 файл с решением задачи по теме №5, но с именем main.c. Редактируем файл к следующему виду (обратите внимание на стрку #include “5.h”)

#include <stdio.h>

#include <stdlib.h>

#include <locale.h>

#include "5.h"

#define N 15

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

{

setlocale( LC_CTYPE, ".1251" );

}

void Title()

{

puts("Лабораторная работа №5");

puts("Задание:");

puts("1. Заполнить массив неповторяющимися числами");

puts(" в диапазоне от -30 до +70.");

puts("2. Распечатать одномерный массив.");

puts("3. Найти минимальное значение в массиве и его индекс.");

puts("4. Сделать дубликат массива в динамической памяти.");

puts("5. Провести сортировку массива-дубликата методом");

puts(" прямого поиска");

puts("6. Распечатать результат сортировки.");

puts("7. Удалить дубликат из динамической памяти.\n");

}

// Главная функция

int main()

{

int m[N];

int min, IndexMin;

int *Duplicate;

Rus();

Randomize();

Title();

puts("\nЗаполнение массива");

Filling(m,N,-30,70);

puts("\nРаспечатка массива\n");

Print (m,N);

puts("\nМинимальное значение массива\n");

min = Min(m,N,&IndexMin);

printf("min = %d его индекс = %d \n", min, IndexMin);

puts("\nСоздание дубликата массива\n");

Duplicate = Copy(m,N);

puts("\nРаспечатка дубликата массива\n");

Print (Duplicate,N);

puts("\nСортировка дубликата методом прямого поиска");

SearchSort(Duplicate,N);

puts("\nРаспечатка дубликата массива после сортировки\n");

Print (Duplicate,N);

puts("\nУдаление дубликата");

free(Duplicate);

return 0;

}

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

Теперь в любой программе можем использовать функции обработки одномерных массивов, подключив в программу подготовленные файлы 5.h и 5.c, что и сделаем в следующих примерах.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]