ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Int num, sum, factor;printf(“\nСовершенные числа от %d до %d:\n”, MIN, MAX); for (num = MIN; num <= MAX; num += 2) { sum = 1; for (factor = 2; factor < num; factor++) { if (num % factor == 0) sum += factor; } if (sum == num) printf(“\n%d”, num); } Return 0; } Эта программа осуществляет поиск всех совершенных чисел от 6 до 10000. Для досрочного прекращения выполнения цикла и выхода из него используется оператор прерывания break: #include <stdio.h> #include <conio.h> #include <math.h> #define MIN 2 #define MAX 10000 Int main() { for (int n = MIN; n <= MAX; n++) { for (int i = MIN; i < n; i++) { if (n % i == 0) Break; } if (i == n) printf(“\n%d”, n); } Return 0; } Эта программа осуществляет поиск всех простых чисел от 2 до 1000. Во вложенных циклах команда break прекращает выполнение только того цикла, в котором стоит. Для пропуска одной итерации цикла (перехода к следующей итерации) используется команда продолжения continue: #include <stdio.h> #include <conio.h> #include <math.h> #define MIN 3 #define MAX 100 Int main() { for (int number = MIN; number <= MAX; number++) { if (number % 3 == 0) Continue; printf(“\n%d”, number); } Return 0; } Эта программа осуществляет поиск всех чисел, кратныхтрем, от 3 до 100. Примеры 1. Вычислить Sn – сумму n первых натуральных чисел Алгоритм Для i от 1 до n выполнять Sn = Sn + i Программа #include <stdio.h> #include <conio.h> #include <math.h> Int main() { int n, sn=0; printf(“\nДо какого числа суммировать:”); scanf(“%d”, &n); for (int i = 1; i <= n; i++) { sn+=i; } printf(“\nСумма чисел от 1 до %d равна %d ”, n, sn); Return 0; }
СТРУКТУРЫ ДАННЫХ В повседневной практике обработки информации мы часто имеем дело с естественно организованными (объединенными) представлениями информации: текстами, списками, таблицами, анкетами. Такие организованные (структурированные) данные во многом облегчают их восприятие и обработку. Естественная организация данных эффективно отражается в современных языках программирования понятием структур данных. Под структурами данных понимаются специальным образом организованные совокупности данных, облегчающие реализацию алгоритма и их компьютерную обработку. Отличительной особенностью хорошо написанных программ является то, что данные в них организованы в определенные, наиболее подходящие для их хранения и обработки структуры, а сами программы являются лишь средством обработки этих структур независимо от их информационного содержания. Проектирование подходящих структур данных для их эффективной обработки программой столь же важно, и занятие это, возможно, более сложное, чем написание собственно операторов программы в соответствии с выбранным алгоритмом их обработки. Хорошо спроектированные структуры данных облегчают и ускоряют их обработку, улучшают понимание самой программы. К базовым структурамданных в Си относятся: · переменные, · массивы, · строки, · смеси, · структуры, · файлы. Из этих структур можно конструировать более сложные, например файлы структур (базы данных). Понятие переменных было введено раньше – это структура данных, состоящая из отдельных элементов, каждый из которых имеет имя, тип и конкретное значение.
Массивы В программировании часто встречаются задачи, связанные с хранением и обработкой большого количества однотипных данных. Например, требуется ввести оценки по информатике для 25 студентов группы ИС-09 и определить средний балл. Для решения этой задачи опишем 25 переменных: is09_1, is09_2,is09_3, …, is09_25: int is09_1, is09_2, is09_3, …, is09_25; Каждая из них будет соответствовать одному студенту. После этого используем 25 операторов для ввода оценок: printf(“\nОценка первого:”); scanf(“%d”, &is09_1); printf(“\nОценка второго:”); scanf(“%d”, &is09_2); ... printf(“\nОценка двадцать пятого:”); scanf(“%d”, &is09_25); И, наконец, определим средний балл: Float sr_ball; sr_ball=(is09_1+is09_2+is09_3+... +is09_25)/25.0; А что произойдет, если нужно будет решить эту задачу для всего университета? Описывать и вводить несколько тысяч переменных? Для решения таких задач используют массивы. Для структур, используемых Массив состоит из конечного числа элементов (компонент), содержимое которых относится к некоторому общему, базовому типу. При этом сам базовый тип должен быть таким, что принадлежность к нему гарантирует одинаковые размеры памяти для размещения каждой из компонент. Элементы различаются местом их размещения внутри структуры, иначе говоря, номером, или индексом. Обычным является непрерывное представление массива, как логическое, так и физическое, то есть логический (описанный в программе) массив проецируется на непрерывный участок оперативной памяти. Значит, необходимо, чтобы такой участок существовал. Отсюда вытекают ограничения на размер массива, диктуемые организацией оперативной памяти: массив должен поместиться в сегмент данных программы, размеры которого фиксированы. И, конечно, данные в массивах сохраняются только до конца работы программы. Таким образом, массив представляет собой структуру данных, определяемую на основе следующих своих свойств: 1) массив состоит из однотипных элементов, при этом используемый тип называется базовым, 2) число элементов массива строго фиксировано, 3) элементы массива упорядочены в том смысле, что каждому из них соответствует один или несколько индексов, позволяющих однозначно указать его расположение в составе структуры, 4) количество индексов, которое связано с отдельным элементом массива, определяет его размерность (одномерные, двумерные, трехмерные…), 5) число элементов массива совпадает с общим количеством возможных значений его индексов, 6) массив – именованная совокупность данных, причем использование его имени совместно с индексами позволяет определять значения его элементов, 7) доступ к элементам массива является прямым, то есть любой элемент массива полностью определяется своими индексами, и возможности доступа к нему не зависят от других элементов. Массивы можно определить и через понятия математики. В современной математике для описания и решения многих задач используются матрицы и вектора. МатрицейAnm называется таблица чисел, состоящая из n строк и m столбцов. Каждый элемент матрицы aij полностью определяется своими индексами – номерами строки i и столбца j, в которых он расположен. Количество индексов определяет размерность матрицы: одномерная матрица (вектор), двумерная, трехмерная и т. д. Максимальное значение каждого индекса определяет размер матрицы. В качестве аналога матриц в программировании выступают массивы. Массив – это упорядоченный набор фиксированного количества однотипных компонентов, имеющих общее имя – имя массива и различающихся значениями своих индексов. В зависимости от количества индексов компонентов (элементов) массива различают одномерные (вектора), двумерные (матрицы) и т. д. массивы. Элементы векторов хранятся в оперативной памяти компьютера в расположенных друг за другом ячейках в том порядке, в котором они размещены в векторе. Таким образом, структура вектора полностью соответствует структуре оперативной памяти компьютера, поэтому остальные структуры данных размещаются в памяти так, как они размещались бы в одномерных массивах. Двумерный массив состоит из элементов, образующих прямоугольную таблицу, причем первый индекс элемента обозначает номер строки, а второй – номер столбца этой таблицы, на пересечении которых расположен данный элемент: a11 a12 a13 … a21 a22 a23 … a31 a32 a33 … …………………….. Таким образом, двумерный массив полностью соответствует понятию матрицы. В оперативной памяти элементы двумерного массива расположены последовательно, строка за строкой: сначала элементы первой строки, затем второй и так далее: a11, a12, a13,…, a21, a22, a23,…, a31, a32, a33,… Значит, второй индекс (номер столбца) изменяется быстрее, чем первый (номер строки). Многомерные массивы располагаются в памяти компьютера так, что сначала изменяется последний индекс элемента, затем – предпоследний и так далее. Массив как структура данных характеризуется тем, что с помощью индексов обеспечивается прямой (непосредственный) доступ к каждому его элементу: чтение или запись любого элемента массива не зависит от того, прочитаны или записаны предшествующие ему элементы. Тип элементов массива называется его базовым типом. В Си это может быть любой стандартный (целый, вещественный, символьный) или пользовательский (массив структур, файлов, функций) тип данных. Индексы элементов массива могут быть только целыми положительными числами и начинаются с нуля. Перед использованием массива в программе его необходимо описать – назвать его имя, указать его размеры (количество элементов, строк, столбцов…) и базовый тип: int vect[5]; float matr[2][3]; char str[20]; Описаны: - одномерный массив целых чисел (вектор) vect, состоящий из пяти элементов, - двумерный массив (матрица) вещественного типа matr, имеющая две строки и три столбца, - строка символов str из 20 элементов. Как видно, при описании массива в Си каждая его размерность записывается в отдельных скобках, а не перечисляется через запятые, как в Паскале. Размеры массива можно задать именованной константой или указать в директиве #define – это считается хорошим стилем программирования: #define count 5 #define row 2 #define col 3 #define n_str 20 int vect[count]; float matr[row][col]; char str[n_str]; Индексы элементов массивов в Си всегда начинаются с нуля, поэтому, например, описанный вектор vect имеет следующие элементы: vect[0] vect[1] vect[2] vect[3] vect[4] а двумерный массив matr – 6 следующих элементов: matr[0][0] matr[0][1] matr[0][2] matr[1][0] matr[1][1] matr[1][2] Таким образом, первая строка и первый столбец двумерного массива имеют индекс 0. Элементы массива можно использовать во всех выражениях, операторах Начальные значения элементам массива в Си можно задавать при их описании (инициализировать массив), при этом размеры одномерных массивов (векторов) в квадратных скобках можно не указывать – для их хранения будет отведено столько ячеек оперативной памяти, сколько значений указано в фигурных скобках: int vect[] = {-5, 3, -2, 8, 1}; float matr[2][3] = {{0.2, -1.5, 3.14}, {-2.73, 25.54, 0.89}}; Если задано значений меньше, чем описано элементов вектора, то недостающие элементы инициализируются нулями: int vect[5] = {-5, 3, -2}; Последние два элемента вектора vect инициализируются нулями. Еще раз необходимо обратить внимание на то, что в отличие от Паскаля при описании и при работе с многомерными массивами в Си каждый индекс элемента массива заключается в отдельные квадратные скобки: matr[1][2]=0.89; Если использовать запись matr[1,2], то она будет интерпретироваться как matr[2]. Согласно правилам языка Си, значением всего выражения в скобках является результат вычисления последнего выражения, перед которым стоит запятая. В отличие от Паскаля конкретные размеры массива в Си можно задать с клавиатуры до его описания: Int row, col; printf(“\n row=”); scanf(“%d”, &row); printf(“\n col=”); scanf(“%d”, &col); float matr[row][col]; Примеры: 1. Ввести с экрана элементы целочисленного массива matr33, вывести его на экран, транспонировать (заменить строки соответствующими столбцами) и снова вывести на экран: #include <stdio.h> #include <conio.h> #include <math.h> Int main() { const int row=3, col=3; Int temp; int matr[row][col]; printf(“\nВведите 3 элемента нулевой строки через пробелы: ”); scanf(“%d%d%d”, &matr[0][0], &matr[0][1], &matr[0][2]); printf(“\nВведите 3 элемента первой строки через пробелы: ”); scanf(“%d%d%d”, &matr[1][0], &matr[1][1], &matr[1][2]); printf(“\nВведите 3 элемента второй строки через пробелы: ”); scanf(“%d%d%d”, &matr[2][0], &matr[2][1], &matr[2][2]); printf(“\nВведенный массив:”); printf(“\n%5d%5d%5d”, matr[0][0], matr[0][1], matr[0][2]); printf(“\n%5d%5d%5d”, matr[1][0], matr[1][1], matr[1][2]); printf(“\n%5d%5d%5d”, matr[2][0], matr[2][1], matr[2][2]); // транспонируем матрицу temp=matr[0][1]; matr[0][1]=matr[1][0]; matr[1][0]=temp; temp=matr[0][2]; matr[0][2]=matr[2][0]; matr[2][0]=temp; temp=matr[1][2]; matr[1][2]=matr[2][1]; matr[2][1]=temp; // снова выводим ее на экран printf(“\nТранспонированный массив:”); printf(“\n%5d%5d%5d”, matr[0][0], matr[0][1], matr[0][2]); printf(“\n%5d%5d%5d”, matr[1][0], matr[1][1], matr[1][2]); printf(“\n%5d%5d%5d”, matr[2][0], matr[2][1], matr[2][2]); printf(“\n”); Return 0; } 2. Рассортировать элементы заданного случайным образом целочисленного вектора vector[n] методом обменной сортировки (пузырька): #include <stdio.h> #include <conio.h> #include <math.h> #include <time.h> Int main() { Не нашли, что искали? Воспользуйтесь поиском:
|