Херсонскийнациональный технический университетЛабораторная работа №1, 2
подисциплине
«Программирование»
Выполнила
студентка группы 1зКСС
Малахова Т.Н.
Проверил
Дроздова Е.А.
Херсон2005
Лабораторная работа №1
Управляющие структуры языка «Си»
Цель работы:Изучение приемов использования операторов ветвления иоператоров циклов в С.Теоретические сведения:
Управляющиеструктуры или операторы управления служат для управления последовательностью вычисленийв программе. Операторы ветвления и циклы позволяют переходить к выполнениюдругой части программы или выполнять какую-то часть программы многократно, покаудовлетворяется одно или более условий.
Блоки и составныеоператоры.
Любая последовательностьоператоров, заключенная в фигурные скобки, является составным оператором(блоком). Составной оператор не должен заканчиваться (;), посколькуограничителем блока служит сама закрывающаяся скобка. Внутри блока каждыйоператор должен ограничиваться (;).
Составной оператор можетиспользоваться везде, где синтаксис языка допускает применение обычногооператора.
Пустой оператор.
Пустой операторпредставляется символом (;), перед которым нет выражения. Пустой операториспользуют там, где синтаксис языка требует присутствия в данном местепрограммы оператора, однако по логике программы оператор должен отсутствовать.
Необходимость виспользовании пустого оператора часто возникает, когда действия, которые могутбыть выполнены в теле цикла, целиком помещаются в заголовке цикла.
Операторыветвления.
К операторам ветвленияотносятся if, if else, ?, switch и goto. Общий вид операторов ветвленияследующий:
if (логическоевыражение)
оператор;
if (логическоевыражение)
оператор_1;
else
оператор_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
int vit;
int main( void )
{
vit = 2;
while (vit
{
vit = vit +2;
printf(“%d\n”, vit);
}
system(«PAUSE»);
return0;
}
Программа2: распечатывает все числа от 1 до 1000, которыезаканчиваются на цифру 5:
#include
#include
int den;
int main()
{
den = 5;
while (den
{
den = den +10;
printf(“%d\n”, den);
}
system(«PAUSE»);
return 0;
}Программа 3:Программаожидает нажатия клавиши «Ъ» и по её нажатии завершает работу:
#include
#include
#include
//#include
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знакомитьсяс понятием указателя, научиться использовать их при программировании на С.
Теоретическиесведения
Указатель- это переменная, которая содержит в памяти адрес данных. Переменная-указательсодержит местоположение значения. То есть, переменная-указатель указывает назначение, так как она содержит его адрес.
Указателипредоставляют эффективные средства доступа и изменения данных. Так какуказатели содержат адреса данных, то при поиске значений в памяти у компьютерасокращается объем работы. Указатели не привязывают данные к какому-либоопределенному имени переменной. Они могут содержать адрес любого неименованного значения.
Сутьпеременных-указателей.
Так как указателиявляются обычными переменными, для них действительны все правила именованияобычных переменных. Как и в случае с обычной переменной, нужно сначала объявитьуказатель и только потом его использовать. В Си указатели могут быть на всесуществующие в языке типы данных; можно создать указатель на целое, символьноеданное, и так далее. В зависимости от того, в каком месте программы объявленуказатель, он может быть локальным или глобальным (как и для обычныхпеременных, использовать глобальные без нужды не рекомендуется).
Единственнаяразница между обычными переменными и указателями заключается в их содержимом.Указатели содержат не само значение, а его адрес.
ВСи имеет два оператора, относящихся к указателям:
&- оператор «адрес значения»
*- оператор «значение по адресу»
Объявлениеуказателей.
Еслинужно объявить переменную для хранения, например, возраста то можно сделать этоследующим образом:
intage = 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при помощи оператора присваивания можно одновременно объявлять иинициализировать указатели.
intage=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
#include
#include
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
if(*(arr+i)==maxEl) *(arr+i)=0;
else ;
clrscr();
out();
getch();
}
void zero()
{
int i;
for(i=0;i
*(arr+i)=0;
}
void in()
{
printf(“\nEnter elements of array:”);
printf(“\n”);
int i;
for(i=0;i
scanf(“\n%i”,arr+i);
}
int max()
{
int mx=*arr;
int i=1;
for(i;i
if(mx
else ;
return mx;
}
void out()
{
int i;
for(i=0;i
{
printf(“%i”,*(arr+i));
printf(” “);
}
system(«PAUSE»);
return0;
}
Результатработы программы: Массив первоначально заполняетсянулями, затем данные вводятся с клавиатуры. Заменяются нулем все элементы,равные максимальному. Массив задаётся при помощи указателя. Память под массивзарезервирована при помощи функций динамического распределения памяти.