Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Программирование циклических вычислительных процессов
С использованием одномерных массивов и строк
Цель работы: Изучить правила работы с одномерными массивами, а также особенности работы со строковыми объектами, как одномерными символьными массивами.
Краткие теретические сведения Массив – конечномерная последовательность данных одного типа. Массив – объект сложного типа. Каждый элемент массива определяется именем массива и индексом (целое число), по которому к элементу массива производится доступ. Рассмотрим одномерные массивы. Индексы у массивов в языке С начинаются с 0. В программе одномерный массив объявляется следующим образом: <Тип> <имя массива>[размер]; где, размер – количество элементов одномерного массива. Размер массива может задаваться константой или константным выражением. Нельзя задавать массив переменного размера, для этого существует отдельный механизм – динамическое выделение памяти. Пример объявления массива целого типа: int a[5]; в массиве а первый элемент а[0], второй – а[1], …, пятый - а[4]. В языке С не проверяется выход индекса за пределы массива. Корректность использования индексов элементов массива должен контролировать программист. Пример работы с одномерным массивом В массиве а целого типа найти индекс и значение максимального элемента и переставить его с первым элементом. Программа также должна подсчитать количество положительных и отрицательных элементов данного мaссива. Текст программы может быть следующим: #include <stdio.h> #include <conio.h> void main(void) { int a[4]={-1,-20,4,100}; // объявление массива с инициализацией // индексы принимают значения от 0 до 3 int i,index,max,kp,ko; clrscr(); puts("\n ИСХОДНЫЙ МАССИВ\n"); for (i=0; i<4; i++) printf("%d ",a[i]); // вывод элементов исходного массива max=a[0]; kp=0; ko=0; for (i=1; i<4; i++) { if (a[i]>max) { max=a[i]; index=i; } } a[index]=zam; a[0]=max; for (i=0;i<4;i++) { if (a[i]<0) ko=ko+1; else kp=kp+1; } puts("\n РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ\n"); for (i=0; i<4; i++) printf("%d ",a[i]); // Вывод элементов массива printf("\n положительных элементов массива: %d \n",kp); printf(" \n отрицательных элементов массива: %d,\ \n\n Press any key...",ko); getch(); } Строки, как одномерные массивы символов В алгоритмическом языке PASCAL существует отдельный тип данных – строка, который объявляется с атрибутом string. В языке С отдельного типа данных «строки символов» нет. Работа со строками реализована путем использования одномерных массивов типа char, т.е. строка символов – это одномерный массив типа char, заканчивающийся нулевым байтом. Нулевой байт – это байт, каждый бит которого равен нулю, при этом для нулевого байта определена символьная константа ´ \0 ´(признак окончания строки или нуль-терминатор). Поэтому, если строка должна содержать k символов, то в описании массива необходимо указать k+1 элемент. Например, описание: char a[7], означает, что строка содержит шесть символов, а последний байт отведен под нулевой. Строковая константа в языке С – это набор символов, заключенных в двойные кавычки. Например: “Лабораторная работа по строкам”. В конце строковой константы явно указывать символ ´ \0 ´ не нужно, так как это сделает компилятор языка С. Строки можно инициализиорвать при декларировании, например: char S1[10]=”123456789”, S2[]=”12345”; в последнем случае размер строки будет установлен по количеству символов. Для ввода строки с клавиатуры дисплея используются две стандартные библиотечные функции, прототипы которых приведены в файле stdio.h. Функция scanf( ) вводит значения для строковых переменных спецификатором ввода %S. Но надо помнить, что функция scanf( ) вводит символы до появления первого символа “пробел”. Библиотечная функция gets( ), обеспечивает ввод строки с пробелами внутри этой строки. При этом ввод строки символов завершается нажатием клавиши ENTER. Обе функции автоматически ставят в конец строки нулевой байт. И, кроме того, так как строка – это символьный массив, а имя массива – это указатель на его начало в памяти, то символ «&» перед именами строковых объектов при использовании этих функций указывать не надо. Вывод строк производится функциями printf( ) или puts( ). Обе функции выводят символьный массив до первого нулевого байта. Функция printf( ) не переводит курсор после вывода на начало новой строки, программист должен предусмотреть такой перевод в строке формата. Функия puts( ) автоматически переводит курсор после вывода строковой информации в начало новой строки. Остальные операции над строками выполняются с использованием стандартных функций. Декларации функций для работы со строками размещены в файле string.h. Вот некоторые из наиболее часто используемых: 1. Функция strcpy(S1, S2) - копирует содержимое строки S2 в строку S1. 2. Функция strcat(S1, S2) - присоединяет строку S2 к строке S1 и помещает ее в массив, где находилась строка S1, при этом строка S2 не изменяется. Нулевой байт, который завершал строку S1, заменяется первым символом строки S2. 3.Функция strcmp(S1, S2) сравнивает строки S1 и S2 и возвращает значение =0, если строки равны, т.е. содержит одно и то же число одинаковых символов; значение <0, если S1<S2;значение >0, если S1>S2. 4. Функция strlen(S) возвращает длину строки, при этом завершающий нулевой байт не учитывается. ЕЩЕ ФУНКЦИИ Пример работы со строковыми данными В программе значение строки вводится с клавиатуры, затем введенная строка распечатывается в обратном порядке. #include <stdio.h> #include <string.h> #include <conio.h>
void main(void) { char s[100]; // объявление символьного массива int i, k; clrscr(); puts(" Введите исходную строку"); gets(s); k=strlen(s); puts(" РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ\n"); for (i=k; i>=0; i--) printf("%c",s[i]); /* вывод элементов массива в обратном порядке */ printf("\n Press any key..."); getch(); } Примеры использования стандартных функций работы со строками #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h>
void main(void) { char s1[]="aaa",s2[]="aaaa",s3[]="aaa "; clrscr(); printf(“\n %d”,strcmp(s1,s2)); // результат сравнения -97 -код символа «а» printf(“\n %d”,strcmp (s1,s3)); // результат -32 -код «пробела» printf(“\n %d”,strcmp (s2,s1)); // 97 printf(“\n %d”,strcmp (s3,s1)); // 32 printf(“\n %d”,atoi("a")); // результаты: 0 printf(“\n %d”,atoi("12a")); // 12 printf(“\n %d”,atoi("5aa")*atoi("2a34")); // 10 getch(); }
Варианты индивидуальных заданий 1. Ввести целое число N. Выделить из этого числа цифры, кратные 3, и записать их в одномерный массив.
2. В заданной двумерной матрице выделить 3 блока по 2 строки и 2 столбца (блоки расположены на главной диагонали матрицы). Упорядочить блоки по величине их диагоналей (по убыванию значений их диагоналей).
3. Для заданного целого числа N определить цифру а, наиболее часто встречающуюся в числе. Сформировать одномерный массив из 5 элементов: a, а2, а3, а4, а5.
4. Элементы заданного массива X циклически сдвинуть на K позиций вправо (влево).
5. Дано число N целого типа. Определить, симметрично ли оно, т.е. одинаковы ли цифры слева и справа (12321). Записать 3 последние цифры в одномерный массив.
6. Упорядочить элементы массива x по возрастанию.
7. Даны координаты n точек на плоскости: x1,y1, x2,y2,…. xn,yn . Найти номера двух точек, расстояние между которыми наибольшее (считать, что такая пара единственная).
8. Заданы два массива по N целых чисел. Найти наименьшее среди чисел первого массива, которое не входит во второй массив (считая, что хотя бы одно такое число есть).
9. Дан массив из N целых чисел. Определить количество инверсий в этом массиве (т.е. таких пар элементов, в которых большее число находится слева от меньшего: xi > xj при i < j).
10. Определить количество шестизначных чисел, в которых сумма первых 3 цифр равна сумме 3 последних цифр, например 105123. 11. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 2, то удаляются все числа, которые делятся на 2. 12. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L четная, то удаляются 2 первых и 2 последних символа. 13. Выяснить, имеются ли среди символов S1...Sn некоторой строки все буквы, входящие в слово DOS. 14. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L нечетная, то удаляется символ, стоящий посередине строки. 15. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов каждого второго символа ! на $. 16. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов всех пробелов на символ $. 22. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L>10, то удаляются все цифры. 23. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 3, то удаляются все числа, делящиеся на 3. 24. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 5, то подсчитывается количество скобок всех видов. 25. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 4, то первая часть строки меняется местами со второй. 26. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L=10, то удаляются все A...Z. 27. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L >15, то удаляются все a…z. 28. В строке символов поменять местами символы на четных и нечетных позициях. 29. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L >6, то выделяется подстрока в { } скобках. 30. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина L >5, то выделяется подстрока до первого пробела.
Контрольные вопросы 1. Укажите типы массивов, применяемых в языке С. 2. Формы (способы) работы с элементами массива. 3. Как описываются строки в языке С? 4. Чем отличаются функции scanf() и gets(), printf() и puts()?
Лабораторная работа №4
|
||
Последнее изменение этой страницы: 2018-05-10; просмотров: 263. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |