Управляющие структуры языка "Си". Программирование с использованием указателей
Херсонский
национальный технический университет
Лабораторная работа №1, 2
по
дисциплине
«Программирование»
Выполнила
студентка группы 1зКСС
Малахова Т.Н.
Проверил
Дроздова Е.А.
Херсон
2005
Лабораторная работа №1
Управляющие структуры языка «Си»
Цель работы: Изучение приемов использования операторов ветвления и
операторов циклов в С.
Теоретические сведения:
Управляющие
структуры или операторы управления служат для управления последовательностью
вычислений в программе. Операторы ветвления и циклы позволяют переходить к
выполнению другой части программы или выполнять какую-то часть программы
многократно, пока удовлетворяется одно или более условий.
Блоки и составные
операторы.
Любая последовательность
операторов, заключенная в фигурные скобки, является составным оператором
(блоком). Составной оператор не должен заканчиваться (;), поскольку
ограничителем блока служит сама закрывающаяся скобка. Внутри блока каждый
оператор должен ограничиваться (;).
Составной оператор может
использоваться везде, где синтаксис языка допускает применение обычного
оператора.
Пустой оператор.
Пустой оператор
представляется символом (;), перед которым нет выражения. Пустой оператор
используют там, где синтаксис языка требует присутствия в данном месте
программы оператора, однако по логике программы оператор должен отсутствовать.
Необходимость в
использовании пустого оператора часто возникает, когда действия, которые могут
быть выполнены в теле цикла, целиком помещаются в заголовке цикла.
Операторы
ветвления.
К операторам ветвления
относятся if, if else, ?, 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 следующим
оператором:
Либо
можно сделать то же самое другим путем:
*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));
}
system("PAUSE");
return
0;
}
Результат
работы программы: Массив первоначально заполняется
нулями, затем данные вводятся с клавиатуры. Заменяются нулем все элементы,
равные максимальному. Массив задаётся при помощи указателя. Память под массив
зарезервирована при помощи функций динамического распределения памяти.