Лабораторная работа: Управляющие структуры языка "Си". Программирование с использованием указателей
Название: Управляющие структуры языка "Си". Программирование с использованием указателей Раздел: Рефераты по информатике, программированию Тип: лабораторная работа |
Херсонский национальный технический университет Лабораторная работа №1, 2по дисциплине «Программирование» Выполнила студентка группы 1зКСС Малахова Т.Н. Проверил Дроздова Е.А. Херсон 2005 Лабораторная работа №1 Управляющие структуры языка «Си» Цель работы : Изучение приемов использования операторов ветвления и операторов циклов в С. Теоретические сведения:Управляющие структуры или операторы управления служат для управления последовательностью вычислений в программе. Операторы ветвления и циклы позволяют переходить к выполнению другой части программы или выполнять какую-то часть программы многократно, пока удовлетворяется одно или более условий. Блоки и составные операторы. Любая последовательность операторов, заключенная в фигурные скобки, является составным оператором (блоком). Составной оператор не должен заканчиваться (;), поскольку ограничителем блока служит сама закрывающаяся скобка. Внутри блока каждый оператор должен ограничиваться (;). Составной оператор может использоваться везде, где синтаксис языка допускает применение обычного оператора. Пустой оператор. Пустой оператор представляется символом (;), перед которым нет выражения. Пустой оператор используют там, где синтаксис языка требует присутствия в данном месте программы оператора, однако по логике программы оператор должен отсутствовать. Необходимость в использовании пустого оператора часто возникает, когда действия, которые могут быть выполнены в теле цикла, целиком помещаются в заголовке цикла. Операторы ветвления. К операторам ветвления относятся if, if e l se, ?, switch и goto . Общий вид операторов ветвления следующий: if (логическое выражение) оператор; if (логическое выражение) оператор_1; else оператор_2; <логическое выражение> ? <выражение_1> : <выражение_2>; Если значение логического выражения истинно, то вычисляется выражение_1, в противном случае вычисляется выражение_2. switch (выражение целого типа) { case значение_1: последовательность_операторов_1; break; case значение_2: последовательность_операторов_2; break ; . . . case значение_ n : последовательность_операторов_n; break; default: последовательность_операторов_n+1; } Ветку default можно не описывать. Она выполняется, если ни одно из вышестоящих выражений не удовлетворено. Оператор цикла. В Турбо Си имеются следующие конструкции, позволяющие программировать циклы: while, do while и for . Их структуру можно описать следующим образом: Цикл с проверкой условия наверху: while ( логическое выражение) оператор; Цикл с проверкой условия внизу: do оператор; while (логическое выражение); Универсальный оператор цикла: for (инициализация; проверка; новое_значение) оператор; Задание:Составить и получить распечатку программы выбора всех четных чисел от 1 до 1000. Составить и получить распечатку программы выбора всех чисел, заканчивающихся на цифру 5, от 1 до 1000. Написать программу с использованием цикла do-while , которая ожидает нажатия клавиши ‘ъ’ и по нажатии её завершает работу. Программа 1: распечатывает все четные числа от 1 до 1000: #include <stdio.h> int vit; int main( void ) { vit = 2; while (vit <= 1000) { vit = vit +2; printf("%d\n", vit); } system("PAUSE"); return 0; } Программа 2: распечатывает все числа от 1 до 1000, которые заканчиваются на цифру 5: #include <iostream.h> #include <stdlib.h> int den; int main() { den = 5; while (den <= 1000) { den = den +10; printf("%d\n", den); } system("PAUSE"); return 0; } Программа 3: Программа ожидает нажатия клавиши «Ъ» и по её нажатии завершает работу:#include <iostream.h> #include <conio.h> #include <stdio.h> //#include <bios.h> int getkey;(void); { int key, lo, hi; key=bioskey(0); lo = key & 0X00FF; hi = (key & 0X0FF00) >> 8; return((lo==0) ? hi +256: lo); } main() { clrscr(); int input; do { input = getkey(); printf("Program is running \n"); } while (input!= ']'); } Лабораторная работа N2 Программирование с использованием указателей Цель работы: Oзнакомиться с понятием указателя, научиться использовать их при программировании на С. Теоретические сведения Указатель - это переменная, которая содержит в памяти адрес данных. Переменная-указатель содержит местоположение значения. То есть, переменная-указатель указывает на значение, так как она содержит его адрес. Указатели предоставляют эффективные средства доступа и изменения данных. Так как указатели содержат адреса данных, то при поиске значений в памяти у компьютера сокращается объем работы. Указатели не привязывают данные к какому-либо определенному имени переменной. Они могут содержать адрес любого не именованного значения. Суть переменных-указателей. Так как указатели являются обычными переменными, для них действительны все правила именования обычных переменных. Как и в случае с обычной переменной, нужно сначала объявить указатель и только потом его использовать. В Си указатели могут быть на все существующие в языке типы данных; можно создать указатель на целое, символьное данное, и так далее. В зависимости от того, в каком месте программы объявлен указатель, он может быть локальным или глобальным (как и для обычных переменных, использовать глобальные без нужды не рекомендуется). Единственная разница между обычными переменными и указателями заключается в их содержимом. Указатели содержат не само значение, а его адрес. В Си имеет два оператора, относящихся к указателям: & - оператор "адрес значения" * - оператор "значение по адресу" Объявление указателей. Если нужно объявить переменную для хранения, например, возраста то можно сделать это следующим образом: int age = 20; Такое объявление переменной age подразумевает несколько моментов. Во-первых, сообщается Си, что нужна переменная с именем age , и Си резервирует для этой переменной место в памяти. Во-вторых, Си узнает, что age будет использоваться для хранения только целых чисел. В-третьих, при объявлении эта переменная инициализируется значением 20. Пусть нужно объявить переменную-указатель, которая не содержит возраст, а указывает на age , переменную, где находятся нужные данные. Для объявления указателя на переменную age нужно сделать следующее: int * p _ age ; В этой строке резервируется место для переменной с именем p_age . Однако это не обычная целочисленная переменная. Так как перед ней стоит *, Си определит, что это переменная-указатель. Присваивание значений указателям. Указатель может содержать адреса значений только соответствующего ему типа. Например, p_age может указывать только на целочисленные переменные. Си не инициализирует указатели при их объявлении. Если age объявлена как показано выше, и нужно, чтобы p_age содержала адрес age , нужно присвоить его переменной p_age : p _ age =& age ; Вместо занесения адреса переменной age в переменную p_age при помощи оператора присваивания можно одновременно объявлять и инициализировать указатели. int age=20; int *p_age=&age; Можно присваивать различные значения переменной age следующим оператором: age=35; Либо можно сделать то же самое другим путем: *p_age=35; Эта строка подразумевает "взять ячейку памяти, на которую указывает p_age и занести туда значение 35". Объявление массивов указателей. Если нужно зарезервировать большое количество указателей для различных данных, можно объявить массив указателей, причем каждый его элемент будет являться указателем одного и того же указанного типа. Следующий пример резервирует массив из 10 указателей на переменную целого типа: int *iptr[10]; Можно присвоить адрес любому элементу из iptr таким же образом, как и любому другому указателю, не входящему в массив: iptr[4]=&age; В следующей строке резервируется массив из 20 указателей на переменные символьного типа: char * cpoint [20]; Задание: Составить программу для определения максимального элемента одномерного массива. Массив первоначально заполняется нулями, затем данные вводятся с клавиатуры. Заменить нулем все элементы, равные максимальному. Массив задать при помощи указателя. Зарезервировать память под массив при помощи функций динамического распределения памяти. Программа: определяет максимальный элемент одномерного массива: #include<stdio.h> #include<conio.h> #include<alloc.h> int* arr; void zero(); void in(); int max(); void out(); void main() { arr=(int*)malloc(10); clrscr(); zero(); out(); getch(); in(); int maxEl=max(); int i; for(i=0;i<10;i++) if(*(arr+i)==maxEl) *(arr+i)=0; else ; clrscr(); out(); getch(); } void zero() { int i; for(i=0;i<10;i++) *(arr+i)=0; } void in() { printf("\nEnter elements of array:"); printf("\n"); int i; for(i=0;i<10;i++) scanf("\n%i",arr+i); } int max() { int mx=*arr; int i=1; for(i;i<10;i++) if(mx<*(arr+i)) mx=*(arr+i); else ; return mx; } void out() { int i; for(i=0;i<10;i++) { printf("%i",*(arr+i)); printf(" "); } system("PAUSE"); return 0; } Результат работы программы: Массив первоначально заполняется нулями, затем данные вводятся с клавиатуры. Заменяются нулем все элементы, равные максимальному. Массив задаётся при помощи указателя. Память под массив зарезервирована при помощи функций динамического распределения памяти. |