Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Оператор цикла for




Оператор цикла for позволяет выполнять оператор или группу операторов заранее заданное количество раз.

Общая форма оператора

for (V1; ЛВ; V2) ОP;

где V1 – выражение, в котором производится присваивание переменной, называемой параметром цикла, начального значения (инициализация); ЛВ – условие, определяющее, следует ли в очередной раз выполнять оператор (тело цикла); V2 – выражение, в котором производится изменение переменной цикла (приращение); ОР – оператор или группа операторов.

Принцип работы:

· вычисляется V1;

· вычисляется ЛВ;

· если ЛВ истинно, выполняется ОР, затем вычисляется V2;

· проверка ЛВ → ОP → V2 и т. д.

Когда ЛВ становится ложным, осуществляется переход к оператору, следующему за ОP. Если ОP – составной оператор, то его надо заключить в{}.

Если ЛВ сразу ложно, то ни ОР, ни V2 не выполняются ни разу.

Отметим две дополнительные возможности оператора for по сравнению с оператором while:

o возможность включения инициализирующего выражения V1, используемого один раз перед тем, как будет произведена оценка условия;

o возможность включения выражения V2, которое будет использоваться после каждой итерации оператора ОР.

  1. Операторы цикла while и do … while

Ключевое слово while позволяет выполнять оператор или группу операторов до тех пор, пока условие не перестанет быть истинным.

Синтаксис: while(ЛВ) ОP;

где ЛВ логическое выражение, ОP – тело цикла (простой или составной оператор).

Итак:

если ЛВ – истинно, выполняется ОР, затем снова проверяется ЛВ и так далее;

если ЛВ – ложно, ОР пропускается, и управление передается на оператор, следующий за телом цикла.

Поскольку проверка ЛВ выполняется перед телом цикла цикл while называют циклом с предусловием.

Если ЛВ изначально ложно, тело цикла while не выполнится ни разу.

В цикле do-while проверка условия проводится после выполнения тела цикла:

do ОP while(ЛВ)

Действие

· выполняется ОР;

· если ЛВ истинно, повторяется выполнение ОР, в противном случае осуществляется переход к оператору, следующему за while.

Если в цикле должно выполняться несколько операторов, они заключаются в {}. Данный цикл носит название цикла с постусловием, т. е. при любом ЛВ тело цикла выполняется хотя бы один раз.

 

7. Форматированный ввод-вывод. Форматированный ввод-вывод позволяет за одно обращение к библиотечной функции обрабатывать несколько объектов данных. Запись оператора обращения к стандартной функции форматного консольного вывода имеет вид

printf ("строка формата", арг1, арг2, …, аргN);

В качестве аргументов функции арг1…аргN используются идентификаторы переменных или выражения. Список аргументов может быть пустым.

Строка формата записывается в двойных кавычках и может содержать:

  • любой текст;
  • спецификаторы форматов (по количеству аргументов), обозначаются символом %, содержат информацию о типе выводимого значения и его модификации;
  • управляющие символы.

 

printf (“<строка формата>” [,<аргументы>]); где:

строка формата - совокупность необязательных символов, задаваемых программистом, и спецификаций формата преобразования данных;

аргументы - имена объектов, перечисленные через запятую.

Каждому объекту из списка, следующего за строкой формата должна соответствовать своя спецификация формата преобразования данных. При выводе данных на ее место подставляется значение объекта. Общий вид записи спецификации формата преобразования

%[<флаг>][<ширина>][.<точность>]<тип преобразования > где:

<флаг> - символ, устанавливающий форму вывода (“-“ - выравнивание влево, “+” – вывод знака числа и т.д.);

<ширина> - число, устанавливающее максимальную ширину поля вывода;

<точность> - число, устанавливающее максимальное количество позиций после десятичной точки, предназначенных для вывода данных;

тип преобразования - символ, указывающий как должны трактоваться данные, хранящие­ся в памяти компьютера при их выводе на экран.

Используются следующие символы для задания типа преобразования данных при их выводе:

c – вывод одного символа;

d - вывод десятичного целого числа;

f - вывод десятичного вещественного числа в естественной форме представления;

e - вывод десятичного вещественного числа в экспоненциальной форме представления;

s - вывод строки символов.

Три первых элемента записи спецификации формата преобразования в функции printf (флаг, ширина, точность) являются необязательными

 

Запись оператора обращения к стандартной функции форматного консольного ввода имеет вид

Структура (синтаксис) обращения к функции:

scanf("строка формата", список аргументов);

С помощью данной функции производится ввод с клавиатуры значений переменных, перечисленных в списке аргументов в формате, определенном строкой формата (см. 5.2.1). Функция преобразует последовательность вводимых символов в различные формы: целые числа, числа с плавающей точкой, символы и строки C.

Особенности функции:

  • в языке C в строке формата рекомендуется писать только спецификаторы форматов; количество спецификаторов должно быть равно числу аргументов в строке; каждый спецификатор имеет ту же структуру, что и в функции printf();
  • список аргументов может состоять из одного или нескольких аргументов; разделителем в списке аргументов служит [,];
  • в качестве аргументов функции используются только адреса переменных.

Задачей аргумента в данной функции является указание адреса ячейки памяти, куда должно быть помещено вводимое значение. Так, символ&обозначает операцию получения адреса переменной, т. е. конструкция &p обеспечивает ввод значения в ячейку памяти, где размещена переменная p.

При использовании функции scanf() необходимо помнить два правила:

  • при считывании значений для переменных простого типа перед именем переменной ставится символ &;
  • при считывании строки символ & не ставится, так как строковая переменная задается с помощью указателя.

 

scanf (“<строка формата>” [,<адреса аргументов>]); где:

<строка формата> - совокупность спецификаций формата преобразования данных, разделяемых между собой пробельными символами;

<адреса аргументов> -адреса объектов, перечисленные через запятую.

 

  1. Указатели. Типизированные и нетипизированные.

Указатель – это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера. Подобно тому, как переменная типа char имеет в качестве значения символ, а переменная типа int – целочисленное значение, переменная типа указателя имеет в качестве значения адрес ячейки оперативной памяти. Допустимые значения для переменной-указателя – множество адресов оперативной памяти компьютера.

Указатель является одной из наиболее важных концепций языка C.

Правильное понимание и использование указателей особенно необходимо для составления хороших программ по следующим причинам:

· указатели являются средством, при помощи которого функции могут изменять значения передаваемых в нее аргументов;

· при помощи указателей выполняется динамическое распределение памяти;

· указатели позволяют повысить эффективность программирования;

· указатели обеспечивают поддержку динамических структур данных (двоичные деревья, связные списки).

Однако указатель может вызвать и ряд затруднений, например, если указатель содержит неправильное значение, программа может быть неработоспособной. Можно легко ошибиться при использовании указателей; к тому же ошибки, связанные с неправильными значениями указателей, найти очень трудно.

Итак, указатель – это новый тип данных. Для него определены понятия константы, переменной, массива. Как и любую переменную, указатель необходимо объявить. Объявление указателя состоит из имени базового типа, символа * (звездочка) и имени переменной.

Общая форма объявления указателя:

тип *имя;

Тип указателя определяет тип объекта, на который указатель будет ссылаться, например,

int *p1;

Фактически указатель любого типа может ссылаться на любое место в памяти, но выполняемые над указателем операции существенно зависят от его типа. Так, если объявлен указатель типа int *, компилятор предполагает, что любой адрес, на который он ссылается, содержит переменную типа int, хотя это может быть и не так. Следовательно, объявляя указатель, необходимо убедиться в том, что его тип совместим с типом объекта, на который он будет ссылаться.

Типизированные указатели

char *c; // указатель на char

int *i, j; // указатель на int

i=&j; // i присвоить адрес j

*i=1; // разыменованный указатель j=1

 

* - операция косвенной адресации

& - операция получения адреса

 

Указатели

void *p; // нетипизированный указатель

float *pf, f; // типизированный указатель

pf=&f; // pf присвоить адрес f

p=pf; // одному указателю присвоить значение другого

pf=(float *) p; // явное указание типа при разыменовании

 

Пример: вычисление суммы квадратов первых 100 натуральных чисел:

int *ptr;

long *sum;

*sum = 0;

for (*ptr = 1; *ptr <= 100; (*ptr)++)

*sum = *sum + (*ptr)*(*ptr);

 

При описании типизированного указателя необходимо сообщить компилятору, адреса переменных какого типа он может хранить(этот пример учить, я думаю не стоит, это паскаль ведь)

var <имя_указателя>: ^<тип_адресуемой_переменой>;

Например:

var p: ^integer;

q: ^real;

s: ^array[1..10] of byte;

Кроме того, существуют универсальные нетипизированные указатели, которые могут хранить адрес переменной любого типа:

var <имя_указателя>: pointer;

  1. Работа с файлами. Файловая переменная, открытие, закрытие файла.

Для обработки файлов используют библиотеку ввода-вывода stdio.h. Файловая переменная описывается с помощью типа данных FILE Пример:FILE*fi;

Необходимо определить способ открытия, задать местонахождение файла и связать с ним файловую переменную. Функция fopen():FILE*fopen(constchar*filename,constchar*mode); Первый параметр–путь к файлу. Второй параметр –способ открытия файла. FILE*fi; fi=fopen("data.txt","rt"); if(fi==0)//обработка ошибки…

Команда закрытия файла: fclose (имя-файловой-переменной)

 

  1. Чтение и запись в файлы. Функция eof()

Простейший способ выполнить чтение из файла или запись в файл – использовать функции getc() или putc().

Функция getc() выбирает из файла очередной символ; ей нужно только знать указатель на файл, например, char Symb=getc(f_in);

Если при обработке достигается конец файла, то функция getc() возвращает значение EOF(end of file).

Функция putc() заносит значение символа Symb в файл, на который указывает f_out. Формат вызова функции: putc(Symb,f_out);

Функция eof определяет достижение конца файла для файла,
ассоциированного с handle.

Возвращаемое значение.

Эта функция возвращает значение 1, если текущая позиция яв-
ляется концом файла; 0 - в противном случае. Возвращаемое значе-
ние -1 свидетельствует об ошибке; errno устанавливается в EBADF,
инициируя при этом неверный handle файла.
Пример:

#include
#include

int fh, count;
char buf[10];

fh = open("data", O_RDONLY);

/* следующий оператор проверяет перед чтением условие конца
файла */

while (!eof(fh))
{ count = read(fh, buf, 10);
.
.
.
}

 

  1. Определение и вызов функций. Фактические и формальные параметры.

Функция - это совокупность объявлений и операторов, обычно предназначенная для решения определенной задачи. Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова. В любой программе на СИ должна быть функция с именем main (главная функция), именно с этой функции, в каком бы месте программы она не находилась, начинается выполнение программы.

При вызове функции ей при помощи аргументов (формальных параметров) могут быть переданы некоторые значения (фактические параметры), используемые во время выполнения функции. Функция может возвращать некоторое (одно!) значение. Это возвращаемое значение и есть результат выполнения функции, который при выполнении программы подставляется в точку вызова функции, где бы этот вызов ни встретился. Допускается также использовать функции не имеющие аргументов и функции не возвращающие никаких значений. Действие таких функций может состоять, например, в изменении значений некоторых переменных, выводе на печать некоторых текстов и т.п..

С использованием функций в языке программирования С связаны три понятия - определение функции (описание действий, выполняемых функцией), объявление функции (задание формы обращения к функции) и вызов функции.

Определение функции задает тип возвращаемого значения, имя функции, типы и число формальных параметров, а также объявления переменных и операторы, называемые телом функции, и определяющие действие функции. В определении функции также может быть задан класс памяти.

Пример:

int rus (unsigned char r)
{ if (r>='А' && c<=' ') return 1; else return 0; }

В данном примере определена функция с именем rus, имеющая один параметр с именем r и типом unsigned char. Функция возвращает целое значение, равное 1, если параметр функции является буквой русского алфавита, или 0 в противном случае.

В языке программирования С нет требования, чтобы определение функции обязательно предшествовало ее вызову. Определения используемых функций могут следовать за определением функции main, перед ним, или находится в другом файле.

Однако для того, чтобы компилятор мог осуществить проверку соответствия типов передаваемых фактических параметров типам формальных параметров до вызова функции нужно поместить объявление (прототип) функции.

Объявление функции имеет такой же вид, что и определение функции, с той лишь разницей, что тело функции отсутствует, и имена формальных параметров тоже могут быть опущены. Для функции, определенной в последнем примере, прототип может иметь вид

int rus (unsigned char r); или rus (unsigned char);

Вызов функции имеет следующий формат:

адресное-выражение ([список-выражений])

Поскольку синтаксически имя функции является адресом начала тела функции, в качестве обращения к функции может быть использовано адресное-выражение (в том числе и имя функции или разадресация указателя на функцию), имеющее значение адреса функции.

Список-выражений представляет собой список фактических параметров, передаваемых в функцию. Этот список может быть и пустым, но наличие круглых скобок обязательно.

Фактический параметр может быть величиной любого основного типа, структурой, объединением, перечислением или указателем на объект любого типа. Массив и функция не могут быть использованы в качестве фактических параметров, но можно использовать указатели на эти объекты.

Выполнение вызова функции происходит следующим образом:

1. Вычисляются выражения в списке выражений и подвергаются обычным арифметическим преобразованиям. Затем, если известен прототип функции, тип полученного фактического аргумента сравнивается с типом соответствующего формального параметра. Если они не совпадают, то либо производится преобразование типов, либо формируется сообщение об ошибке. Число выражений в списке выражений должно совпадать с числом формальных параметров, если только функция не имеет переменного числа параметров. В последнем случае проверке подлежат только обязательные параметры. Если в прототипе функции указано, что ей не требуются параметры, а при вызове они указаны, формируется сообщение об ошибке.

2. Происходит присваивание значений фактических параметров соответствующим формальным параметрам.

3. Управление передается на первый оператор функции.

4. Выполнение оператора return в теле функции возвращает управление и возможно, значение в вызывающую функцию. При отсутствии оператора return управление возвращается после выполнения последнего оператора тела функции, а возвращаемое значение не определено.

Адресное выражение, стоящее перед скобками определяет адрес вызываемой функции. Это значит что функция может быть вызвана через указатель на функцию.

 

Формальные параметры — это идентификаторы входных данных для подпрограммы. Если формальные параметры получают конкретные значения, то они называются фактическими. Формальные параметры могут получить конкретные значения только в той программе, где производится обращение к данному модулю-подпрограмме. Тип и порядок записи фактических параметров должны быть такими же, как и формальных параметров. В противном случае результат работы программы будет непредсказуемым. Из этого следует, что фактические параметры используются при обращении к подпрограмме из основной, а формальные параметры — только в самом модуле.

 

 

  1. Определение и вызов функций. Передача массивов и указателей на функции.

Для того, чтобы передать указатель в качестве аргумента, нужно объявить параметр типа указателя. Void fun(int *t) допустим в мэйн объявлены int a; a=6; int *p; p=&a; fun(p) // передаем в функцию фан указатель и она что-то там делает. А можно передать непосредственно адрес переменной а fun(&a) как-то так работаем с указателем.

 

Массивы нельзя передавать в функции, можно только передать указатель на первый элемент массива и работать с ним. Существует три варианта:

1.void displ(int num[10])// функция в, которую передаем массив. В майн допустим объявлен массив int t[10]; displ(t);// вызвали и передали. Несмотря на то, что параметр num объявлен как массив из 10 элементов, компилятор с++ как-то преобразует его в указатель на int, в функцию диспл передается указатель на первый элемент

 

2. можно задать параметр в виде массива неопределенной длины void displ(int num[]) (С++ похер выйдешь ты за рамки массива или нет), но и в этом случаи компилятор преобразует параметр в указатель на int.

 

3. 3им способом можно забабахать параметр в виде указателя. Void displ(int *num) и уже в майн вызываем диспл так displ(num).

 

Нужно помнить, что когда массив используется в качестве аргумента функции, в функцию передается его адрес, и когда мы будем как-то работать с ним, то мы будем воздействовать на содержимое массива.

 

  1. Бинарный поиск в упорядоченном массиве.

Пусть есть упорядоченный по возрастанию массив целых чисел. Нужно определить, содержит ли этот массив некоторое число (образец).

Метод (алгоритм) бинарного поиска реализуется следующим образом:

1. Сначала образец сравнивается со средним (по номеру) элементом массива (рис. 5.10, а).

  • Если образец равен среднему элементу, то задача решена.
  • Если образец больше среднего элемента, то это значит, что искомый элемент расположен ниже среднего элемента (между элементами с номерами sred+1 и niz), и за новое значение verb принимается sred+i, а значение niz не меняется (рис. 5.10, б).
  • Если образец меньше среднего элемента, то это значит, что искомый элемент расположен выше среднего элемента (между элементами с номерами verh и sred-1), и за новое значение niz принимается sred-1, а значение verh не меняется (рис. 5.10, в).

а b

c

 

  1. Сортировка массива на примере одного из алгоритмов.

 

Здесь я так понимаю можно рассказать про сортировку по порядку, ну хули ниже код, компилируем и разбираемся что да как.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main()

{

int k; // koli4estvo chifr

int a[100]; //massiv

int i; // indeks massiva

int p;

int min=a[0]; //min zna4

int max=a[0]; //max zna4

int t;

clrscr();

printf("\n vvedite kolichestvo chifr v massive \n");

scanf("%d", &k);

printf("vvedite chisla massiva \n");

for(i=0; i<k; i++)

{

scanf("%d", &a[i]);

}

printf(" massiv: ");

for(i=0;i<k;++i)

{

printf("%d,", a[i]);

}

printf("\nchisla massiva poporyadku: ");

for(i=0;i<k;i++)

for(p=1;p<k;p++)

if(a[p-1]>a[p])

{

t=a[p-1];

a[p-1]=a[p];

a[p]=t;

}

for(t=0;t<k;t++)

{

printf("%d,",a[t]);

}

getch();

}

 

  1. Связанные списки: описание структуры, добавление и удаление элементов в односвязный линейный список.

Связанный список - это линейный набор ссылающихся на себя структур, называемых узлами, и объединенных указателем-связкой. Доступ к связующим узлам производится через связывающий указатель, хранящийся в каждом узле. В отличие от массива, список не имеет фиксированного размера - он может расти или сокращаться по мере необходимости. Эта его особенность становится существенной, если число объектов в списке неизвестно до времени выполнения.

Односвязный список состоит из конкретных узлов, в состав каждого из которых входит значение, хранящееся в узле, например, для списка целых чисел это будет число, а также указатель, содержащий адрес следующего узла списка. В последнем узле списка указатель на следующий узел содержит NULL. Обязательным является указатель на начало списка, хранящий адрес первого узла списка.




Поделиться с друзьями:


Дата добавления: 2015-04-24; Просмотров: 517; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.108 сек.