Лабораторная работа № 1-13 1. ЦЕЛЬ РАБОТЫ

advertisement
-1Информатика
Лабораторная работа 1-13
Лабораторная работа № 1-13
Работа с массивами в С. Форматный ввод в C
1. ЦЕЛЬ РАБОТЫ
Целью работы является разработка, отладка и выполнение программы на языке C с
использованием массивов и функции форматного ввода scanf().
2. СОСТАВ РАБОЧЕГО МЕСТА
2. СОСТАВ РАБОЧЕГО МЕСТА
2.1. Оборудование: IBM-совместимый персональный компьютер (ПК).
2.2. Программное обеспечение: операционная система Windows, интегрированная
оболочка BorlandC++.
3. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
3.1. Операция sizeof
Операция sizeof возвращает размер ее операнда в байтах. Эта унарная операция
имеет следующий синтаксис:
sizeof операнд
Операндом может быть как имя переменной, так и имя типа. Если в качестве
операнда задано имя типа, оно должно быть заключено в скобки.
3.2. Указатели
Память компьютера представляет собой (в упрощенном виде) массив
последовательно пронумерованных и адресованных ячеек, содержащих машинные
команды и данные, с которыми можно работать по отдельности или связными кусками.
Один байт может хранить значения типа char, два байта – типа short или int, четыре
байта – типа long или float, восемь байт – типа double и десять байт – типа long
double.
В C существует специальный тип переменных, называемый указателем,
предназначенный для хранения адреса объекта некоторого типа. Объявление указателя
имеет следующий формат:
тип *описатель;
где
 тип – это тип объекта, на который может указывать данная переменная.
 описатель – это идентификатор указателя, который может быть простой
переменной, массивом, функцией или указателем. Описатель может также содержать
перед идентификатором квалификаторы const или volatile.
Размер памяти для указателя и формат представления адреса зависят от
используемой компьютерной платформы и операционной среды.
Для инициализации указателей можно использовать константу с именем NULL,
определенную в файле stdio.h стандартной библиотеки. Эта константа определяет
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-2Информатика
Лабораторная работа 1-13
нулевое значение указателя, при котором он не ссылается ни на один программный
объект.
3.3. Массивы
Группу переменных в программе, имеющих один и тот же тип и квалификаторы,
можно представить в виде одной переменной – массива. Отдельные переменные в
массиве называются элементами. Каждый элемент массива имеет свой номер (индекс),
по которому можно обратиться к значению элемента. Индекс должен быть числом или
арифметическим выражением целого типа. Число индексов, определяющих элемент
массива, называется размерностью массива, а количество элементов в массиве –
размером массива.
Массив в C определяется следующим образом:
тип описатель [конст-выраж-1] [конст-выраж-2] ... [конст-выраж-n];
где
 тип – один из базовых типов, перечислимый тип (enum), структура (struct)
или объединение (union).
 описатель – это идентификатор массива, который может быть простой
переменной, либо описанием переменной перечислимого типа, структуры, объединения,
функции или указателя.
 конст-выраж-1, конст-выраж-2, конст-выраж-n – количество элементов для iго измерения массива.
Количество пар квадратных скобок равно размерности массива.
Компилятор C выделяет для массивов место в памяти в соответствии с
количеством элементов массива и длиной элемента массива. Значения элементов в момент
выделения памяти не определены (точнее элементы массива получают те значения,
которые остались в этих байтах оперативной памяти после выполнения предыдущих
программ).
Количество памяти, выделенное под массив, можно определить с помощью
операции sizeof. Количество элементов в массиве можно определить с помощью
следующего выражения:
sizeof имя-массива / sizeof (тип-массива)
Элементы массива могут быть инициализированы. Для этого надо после описания
массива задать символ "=" и задать в фигурных скобках список значений элементов
массива. Элементы списка отделяются друг от друга запятыми. Список не должен
содержать пустых элементов, однако могут быть заданы не все элементы массива.
Компилятор C выдает сообщение об ошибке, если количество значений элементов
в списке инициализации превышает объявленную размерность массива.
Для многомерных массивов заполнение значений производится по строкам, т.е.
сначала заполняются элементы по самому последнему индексу, затем по предпоследнему
индексу и т.д. Значения для каждого индекса могут образовывать свой, внутренний
список, заключенный в свои фигурные скобки.
Константное выражение в квадратных скобках может быть опущено, если в
объявлении массива его элементы перечисляются и инициализируются.
Размер массива можно также опустить либо когда массив объявляется как
формальный параметр функции, либо данное объявление является ссылкой на объявление
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-3Информатика
Лабораторная работа 1-13
массива в другом месте программы. Однако для многомерного размера может быть
опущена только первая размерность.
Индексация элементов массива в C начинается с нуля и, таким образом, последний
элемент массива имеет индекс, на 1 меньший, чем число элементов массива по данному
индексу.
При обращении к элементу массива указывается имя массива и
индекс или
индексы элемента. Каждый индекс заключается в квадратные скобки.
Переменная типа массив участвует в выражениях как константа-указатель на
значение заданного именем-типа типа.
Символьные строки представляются в C с помощью массивов типа char.
3.4. Операции над указателями
Для указателей допустимы следующие операции:
 присваивание значения указателя другому указателю того же типа;
 присваивание указателю значения NULL;
 операция адресации;
 операция раскрытия ссылки (косвенной адресации);
 сложение и вычитание указателя и целого выражения;
 сложение, вычитание и сравнение двух указателей, ссылающихся на элементы
одного и того же массива;
 сравнение значения указателя со значением NULL.
Оператор присваивания присваивает значение одного указателя другому
указателю, либо присваивает указателю значение NULL.
Оператор адресации "&" выдает адрес переменной или элемента массива.
Оператор раскрытия ссылки или косвенной адресации "*" выдает объект, на
который ссылается данный указатель.
Операторы "&" и "*" имеют тот же приоритет, что и операторы "++" и "--", т.е.
более высокий приоритет, чем арифметические операторы.
В языке C существует сильная взаимосвязь между указателями и массивами.
Любую операцию, которую можно выполнить с помощью индексов массива, можно
сделать и с помощью указателей, причем вариант с указателями обычно оказывается
более быстрым.
Для указателей определены операции сложения с целой величиной и вычитания
целой величины.
Если указатели указывают на элементы одного и того же массива, то для них
можно использовать операции отношения, а также сложения и вычитания.
Любой указатель можно также сравнить на равенство или неравенство с NULL.
3.5. Оператор форматного ввода
Осуществляющая ввод функция scanf() является аналогом функции
printf() и позволяет проводить в обратном направлении многие из преобразований,
осуществляемых при выводе переменных. В результате ввода с клавиатуры в программу
вводится символьные данные, поскольку и числа и буквы и другие символы клавиатуры
мы вводим именно как символы. Однако введенную последовательность символов,
например, "110", в программе надо представить в программе как числовое данное, а не
как строку символов. Функция scanf() и осуществляет перевод вводимых строк в
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-4Информатика
Лабораторная работа 1-13
различные формы: целые числа, числа с плавающей точкой, символы и строки. Функция
имеет переменное число аргументов и вызывается следующим образом:
scanf(строка-формата [, аргумент-1 [, аргумент-2....]])
где строка-формата – символьная
строка, состоящая из обычных символов,
специальных символов и, если за строкой формата следует один или несколько
аргументов, спецификаций полей формата ввода (по одному для каждого аргумента).
Управляющая строка может содержать:
 пробелы, табуляции или символы новой строки, которые игнорируются;
 обычные символы (не символ "%"), которые предполагаются совпадающими со
следующими отличными от символов пустых промежутков символами входного потока;
 спецификации преобразования, начинающиеся с символа "%".
Простая спецификация формата содержит только символ "%" и символ вводимого
типа. Основные символы типов приведены в следующей таблице:
Символ
ти п а
d
Тип
аргумента
int
i
int
u
o
x
int
int
int
c
char
s
e, f,
g
p
char *
float
указатель
n
указатель
на целое
[...]
char *
[^...]
char *
%
нет
Данные на вводе
Десятичное число.
Целое: восьмеричное (с ведущим нулем) или шестнадцатеричное
(с ведущими 0x или 0X).
Десятичное число без знака.
Восьмеричное целое (с 0 в начале числа или без него).
Шестнадцатеричное целое (с 0x или 0X в начале или без них).
Единичный символ. Пробельные символы здесь рассматриваются
как обычные символы.
Символьная строка.
Десятичное число (возможно со знаком, десятичной точкой и
экспонентой).
Значение указателя.
В целое число, адрес которого указывается в качестве аргумента,
записывается число символов, прочитанных к текущему моменту
для данной функции scanf().
Строка читается до первого символа, который не встречается в
скобках.
Строка читается до первого символа, который встречается в
скобках.
Выводится символ "%".
Если число спецификаций формата больше числа аргументов, излишние
спецификации игнорируются. В обратном случае результат ввода не определен.
В качестве аргументов задаются адреса вводимых переменных.
Выполнение функции scanf() заканчивается либо тогда, когда она исчерпывает
свою управляющую строку, либо когда некоторый элемент ввода не совпадает с
управляющей спецификацией. В качестве своего значения она возвращает число
правильно совпадающих и присвоенных элементов ввода. Это число может быть
использовано для определения количества найденных элементов ввода. При выходе на
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-5Информатика
Лабораторная работа 1-13
конец файла возвращается EOF. При следующем обращении к scanf() поиск
возобновляется непосредственно за последним введенным символом.
4. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Порядок выполнения работы:
1. Составить программу для операций над массивами с элементами типа int при
заданных ограничениях, вводимых и выводимых данных по одному из вариантов,
приведенных в следующей таблице. Вводимые значения и результаты вывести на экран
дисплея.
№
варианта
1.
Описание действий программы
Сформировать одномерный массив c,
элементы которого являются суммой
элементов двух исходных массивов a и b:
c i  a i  bi
Вводимые
величины
Выводимые
величины
(1  i  imax; imax
 10)
imax,
массивы a
иb
массив c
(1  i  imax; imax
 10)
imax, массив
a
массив b
Ограничения
Сформировать массив b, элементы
которого bi  a i - квадраты значений
элементов исходного одномерного массива
a:
2
2.
3.
Определить процент элементов ai с
неотрицательными значениями в исходном
одномерном массиве a.
Определить индексы и значения равных
элементов (если они есть) исходного
одномерного массива ( a i  a j ; i  j )
4.
5.
6.
Сформировать одномерный массив b, в
котором первыми элементами являются
элементы исходного одномерного массива
a с отрицательными значениями (с
сохранением порядка следования), а затем
элементы a с нулевыми и положительными
значениями.
Определить значения двух наибольших и
разных по значению элементов исходного
одномерного массива a и их индексы
(массив может содержать элементы с
равными значениями).
процент
элементов с
неотрицательными
значениями в
массиве a.
индексы и
значения
равных
элементов
или
сообщение о
том, что в
массиве a нет
равных
элементов
(1  i  imax; imax
 10)
imax, массив
a
(1  i,j  imax;
imax  10)
imax, массив
a
(1  i  imax; imax
 10)
imax, массив
a.
массив b
imax, массив
a
значения
двух
наибольших
элементов и
их индексы.
(1  i  imax; imax
 10)
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-6Информатика
Лабораторная работа 1-13
№
варианта
7.
8.
9.
Описание действий программы
Определить значения наибольшего и
наименьшего элементов исходного
одномерного массива a и их индексы
(массив может содержать элементы с
равными значениями).
Сформировать одномерный массив b из
исходного одномерного массива a
следующим образом: если значения какихлибо двух или более элементов массива a
равны друг другу, на их месте в массиве b
выводится 1, в противном случае 0.
Сформировать одномерный массив b из
исходного одномерного массива a путем
циклического сдвига элементов a на k
позиций вправо.
Вводимые
величины
Выводимые
величины
(1  i  imax; imax
 10)
imax, массив
a
все значения
наибольшего
и
наименьшего
элементов и
их индексы
(1  i  imax; imax
 10)
imax, массив
a
массив b
(1  i,k imax;
imax  10)
imax, k и
массив a
массив b
Ограничения
10.
Определить количество элементов
исходного одномерного массива a с
положительными, нулевыми и
отрицательными значениями.
(1  i  imax; imax
 10)
imax, массив
a
11.
Определить, являются ли все элементы
исходного одномерного массива a
отрицательными величинами или они все
положительны или среди элементов a есть
как положительные, так и отрицательные
величины.
(1  i  imax;
imax  10)
imax, массив
a
12.
Определить значения и индексы локальных
минимумов исходного одномерного
массива a (элемент массива называется
локальным минимумом, если он строго
меньше своих соседей).
(1  i  imax; imax
 15)
imax, массив
a
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
количество
положительных,
нулевых и
отрицательных
элементов
массива a
1, если все
элементы a
положительны, -1, если
отрицательны и 0, если
есть как положительные, так и
отрицательные
элементы.
значения и
индексы
локальных
минимумов
массива a или
сообщение о
том, что
локальных
минимумов
нет.
Автор: Шонин В.А.
-7Информатика
Лабораторная работа 1-13
№
варианта
13.
Описание действий программы
Определить количество равных элементов
( ai  bi ) и их индексы для двух исходных
одномерных массивов a и b.
14.
Определить проценты совпадения
элементов двух исходных одномерных
массивов a и b (одинаковой размерности).
Ограничения
Вводимые
величины
ние замены
kc и
массив a
количество
равных
элементов и
их индексы
или
сообщение о
том, что
равных
элементов
нет.
процент
совпадающих
элементов в
массиве a и
процент
совпадающих
элементов в
массиве b
новый массив
a или
сообщение о
том, что
значение
замены не
найдено
imax, массив
a
массив
сигнатур b
(1  i  imax; imax
 10)
imax,
массивы a
иb
(1  i  imax; imax
 10)
imax,
массивы a
иb
15.
Найти и заменить в исходном одномерном
массиве a все значения a i  k f на k c .
(1  i  imax; imax
 10)
16.
Сформировать массив сигнатур b
исходного одномерного массива a
(сигнатура числа равна 1, если число
положительно, -1, если число отрицательно
и 0, если значение числа равно 0).
(1  i  imax; imax
 10)
Выводимые
величины
imax, значение поиска
k f , значе-
17.
Определить абсолютное значение разности
между наибольшим и наименьшим
значениями элементов исходного
одномерного массива a.
(1  i  imax; imax
 10)
imax, массив
a
абсолютное
значение
разности
между
наибольшим
и
наименьшим
элемента-ми
массива a.
18.
Сформировать массив b из
отсортированных по возрастанию значений
элементов исходного одномерного
массива a.
(1  i  imax; imax
 10)
imax, массив
a
массив b
imax, массив
a
наименьшее
значение
элемента в
массиве a и
количество
элементов,
имеющих
наименьшее
значение.
19.
Определить наименьшее значение
элемента в исходном одномерном массиве
a и количество элементов, имеющих
наименьшее значение.
(1  i  imax; imax
 10)
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-8Информатика
Лабораторная работа 1-13
№
варианта
Описание действий программы
Ограничения
Вводимые
величины
Выводимые
величины
абсолютное
значение
наименьшей
разности
между
двумя
любыми
значениями
элементов в
массиве a.
количество
элементов с
четными
значениями в
массиве a
количество
элементов,
превышающих значение
amax в
массиве a.
количество
элементов в
массиве a,
значения
которых
лежат между
amin и amax .
20.
Определить абсолютное значение
наименьшей разности между двумя
любыми значениями элементов исходного
одномерного массива a.
(1  i  imax; imax
 10)
imax, массив
a
21.
Определить количество в исходном
одномерном массиве a (для определения
количества четных элементов используйте
оператор взятия модуля "%").
(1  i  imax; imax
 10)
imax, массив
a
22.
Определить количество элементов,
превышающих значение заданной
величины amax в исходном одномерном
массиве a.
(1  i  imax; imax
 10)
imax, amax и
массив a
23.
Определить количество элементов
исходного одномерного массива a,
значения которых лежат между задаваемой
нижней amin и верхней amax границами.
(1  i  imax; imax
 10)
imax, amin ,
amax и
массив a
24.
Сформировать массив b, элементами
которого являются значения индексов
элементов исходного одномерного массива
a в порядке убывания значений элементов.
(1  i  imax; imax
 10)
imax, массив
a
массив b
25.
Определить абсолютные значения
наибольшей и наименьшей разности между
средним значением и значениями
элементов исходного одномерного массива
a.
(1  i  imax; imax
 10)
imax, массив
a
Абсолютные
значения
наибольшей и
наименьшей
разности
между
средним
значением и
значениями
элементов
массива a
26.
Сформировать массив b, элементами
которого являются элементы исходного
одномерного массива a, расположенные в
обратном порядке.
(1  i  imax;
imax  10)
imax, массив
a
массив b
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
-9Информатика
Лабораторная работа 1-13
№
варианта
Описание действий программы
Ограничения
Вводимые
величины
Выводимые
величины
27.
Сформировать массив b из исходного
одномерного массива a по следующему
алгоритму: сначала идут элементы массива
a с четными значениями в порядке их
возрастания, затем элементы с нечетными
значениями в порядке их убывания. Для
определения количества четных элементов
используйте оператор взятия модуля "%".
(1  i  imax; imax
 10)
imax, массив
a
массив b
28.
Сформировать массив b из исходного
одномерного массива a по следующему
алгоритму: bi равняется количеству
элементов со значением, равным ai , в
массиве a.
(1  i  imax; imax
 10)
imax, массив
a
массив b
29.
Определить индексы и значения
элементов исходного одномерного массива
a, величины которых лежат вне задаваемой
нижней amin и верхней amax границ (ai < amin
или ai > amax).
(1  i  imax; imax
 10)
imax, amin ,
amax и
массив a
индексы и
значения
элементов в
массиве a,
значения
которых
лежат вне
границ amin и
amax
30.
Сформировать массив b из исходного
одномерного массива a следующим
образом: если amin < ai < amax, то bi = ai; если
ai  amin, то bi=amin; если ai  amax, то bi=amax
(1  i  imax; imax
 10)
imax, amin ,
amax и
массив a
массив b
imax и
массив a
признак
упорядоченности,
равный 1,
если значения
элементов
массива a
упорядочены
по возрастанию, -1, если
значения
элементов
массива a
упорядочены
по убыванию
и 0, если
элементы
массива не
упорядочены
31.
Определить, образуют ли значения
элементов исходного одномерного массива
a: строго возрастающую
последовательность (ai < ai+1), строго
убывающую последовательность (ai > ai+1)
или элементы массива не упорядочены.
(1  i  imax; imax
 10)
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
- 10 Информатика
Лабораторная работа 1-13
№
варианта
32.
33.
34.
35.
Описание действий программы
Определить, образуют ли значения
элементов исходного одномерного массива
a арифметическую прогрессию, т.е. ai = ai-1
+ n, где n - разность прогрессии.
Сформировать массив b из массива a
следующим образом: сначала в b идут
четные элементы массива a в порядке
возрастания, а затем нечетные элементы в
порядке убывания.
Сформировать массив b из массива a
следующим образом: из массива b удалены
все одинаковые элементы массива a, за
исключением одного.
Сформировать массив b из массива a
следующим образом: массива состоит из
тех элементов массива a, которые имеют
одинаковые значения (по одному значению
для одинаковых элементов).
Ограничения
Вводимые
величины
Выводимые
величины
признак
прогрессии,
равный 1,
если значения
элементов
массива a
образуют
арифметическую
прогрессию и
0-в
противном
случае. Если
признак
прогрессии
равен 1,
вывести
значение n
(1  i  imax; imax
 10)
(1  i  imax; imax
 10)
imax и
массив a
массив b
(1  i  imax; imax
 10)
imax и
массив a
массив b
(1  i  imax; imax
 10)
imax и
массив a
массив b
2. Введите программу с клавиатуры в среде BorlandC++.
3. Выполните отладку программы и запустите ее на выполнение. Протестируйте
программу для ошибочных и правильных значений исходных данных.
4. Покажите преподавателю программу и результаты ее работы (при ошибочных
и правильных значениях исходных данных) и скопируйте текст программы и результаты
работы программы в окно текстового редактора Блокнот с заголовками "Текст
программы имя-программы" и "Результат работы программы имя-программы".
5. Скопируйте полученный в окне текстового редактора Блокнот документ на
свою дискету или флэш-карту.
5. СОДЕРЖАНИЕ ОТЧЕТА
В отчете должно быть представлено содержимое созданного вами документа.
6. ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ
1. Каково назначение операции sizeof в языке C?
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
- 11 Информатика
Лабораторная работа 1-13
2.
3.
языке C?
4.
5.
6.
7.
8.
Каково отличие массива от простой переменной?
Как определяется массив и как записывается обращение к элементу массива в
Как можно задать начальные значения элементам массива?
Что такое указатель в языке C и как связаны указатели и массивы?
Какие операции определены над указателями в языке C?
Как задаются спецификации формата и значения аргументов в операторе scanf?
Какие спецификации форматов ввода и вывода можно использовать в C?
Файл: 308829037 Создан: 17.10.1998 Модифицирован: 26.01.2016
Автор: Шонин В.А.
Download