//* присвоить адрес целой переменной указателю vp *//
vp=&a;
//* Привести указатель vp к типу int и разадресовать его *//
printf («a=%d\n» s* ((int*)vp));
vp=&d;
printf («d='!..lf\n», * ((double* ) vp ));}
}
Указатель vp объявлен как указатель, который может указывать на объект любого типа;
Следующие операции недопустимы с указателями:
-сложение двух указателей;
-вычитание двух указателей на различные объекты:
-сложение указателей с числом с плавающей точкой;
-вычитание из указателей числа с плавающей точкой;
-умножение указателей ;
-деление указателей ;
Поразрядные операции и операции сдвига указателей;
Преобразование указателей выполняется применением указателей приведения типа указателя: (тип*) указатель;
Например:
{ int i, *ptr ;
i = 0x&e4l;
ptr - &i;
printf («%d\n». *ptr); //* Печатается- 291 19*//
printf («%d\n», *((char) ptr)); // * Печатается 65 *//
// Программа преобразующий строку символов в целый тип с.
// применением указателей, т.е. вычисляет длину строки символов.
#include<stdio.h>
#include<string.h>
int main(void)
{char *string=« ПОВТАС»:
printf («Дли на заданной строки-%d \n», strlen (string));
return 0:
}
Результат: Длина заданной строки = 6
/*Программа, преобразующий строчные строки символов (например: «povtas-1-92») на прописные («POVTAS-1-92»), */
#include<string.h>
#include<stdio.h>
#inchide<ctype.h>
int mam(void)
{int length,!;
char *string=«povtas-l-92»;
length=strlen(string);
for(i=0;i<length;i++)
{ string|il=toupper(stringli|);}
printf(«После преобразования-> %s\n»,string);
return 0; }
Результат: После преобразования-> POVTAS-l-92
Варианты задач
1: В компьютер вводятся фамилии и рост студентов группы ПОВТАС-1-97. Вывести на экран фамилии тех студентов, рост которых больше 170 см (для определения кандидатов в баскетбольную команду).
2: При продаже грампластинок ведется учет количества проданных пластинок с классической музыкой, эстрадной и детских. Составить программу, ведущую этот учет за рабочий день.
3: Заданна последовательность натуральных чисел N, Найти в этой последовательности взаимно простые числа.
Примечание: Числа а, в, с,.... d называются взаимно простыми
числами, если наибольший обший их делитель (НОД) равен 1, Числа 5, , 10, 7,3-взаимно простые, т.к. НОД (5;10;7;3)=1
4: Написать программу нахождения наибольшего общего делителя двух целых чисел, используя алгоритм Евклида.
5: Найти НОД заданных трех натуральных чисел.
6: Найти наименьшее общее кратное (НОК) нескольких (3,4, ....) заданных натуральных чисел.
7: Дано натуральное число N. Выбросить из записи числа цифры 3 и 7, оставив прежним порядок остальных цифр.
8: Написать программу сложения двух простых дробей. (Числители и знаменатели вводятся в переменные М, N, P и Q с клавиатуры). Результат сложения вывести на экран также в виде простой дроби.
9: Дано натуральное число N. Заменить в нем все «двойки» на «пятерки».
10: Даны два числа. Написать программу, в результате выполнения которой выводится первое число, если оно больше второго, и оба числа, если это не так.
11: Даны два числа. Написать программу, в результате выполнения которой первое число заменяется нулем, если оно больше второго.
12: Даны три числа а,. b, с. Написать программу, в результате выполнения которой числа удвоятся, если а > b > с, и числа будут замены на их абсолютные величины в прочих случаях:
13: Написать программу, в результате выполнения которой выясняется, входит ли цифра 2 в запись данного целого числа n.
14: Составить программу, по которой для любого введенного целого а определяется его четность. Выводится число 1, если а нечетное, и число 2, если а четное.
15: Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением самого себя. Число 6 является совершенным, так как 6=1 +2+3, число 8 не является совершенным, так как 8
1+2+4. Написать программу вывода всех совершенных чисел, меньших заданного числа N.Лабораторная работа № 7
Тема: Функции.
Мощность языка Си во многом объясняется легкостью и гибкостью в определении и использовании функций в Си-программах. В отличие от других языков программирования высокого уровня в языке Си нет деления на процедуры, подпрограммы и функции.
В языке Си программа строится только из функций.
Функция - это независимая совокупность объявлений и операторов, обычно предназначенная для выполнения определенной задачи. Каждая функция должна иметь имя, которое используется для вызова функции. Имя одной из функций, main , которая должна присутствовать, в каждой Си программе зарезервировано. В программе могут содержатся и другие функции, причем функция main необязательна должна быть первой, хотя с нее всегда начинается выполнение Си-программы.
При вызове функции ей могут быть переданы данные посредством аргументов функции. Функция может возвращать значение. Это возвращаемое значение и есть основной результат выполнения функции, который при выполнении программы подставляется на место вызова функции, где бы этот вызов ни встретился в программе. Однако могут быть определены функции, которые не имеют никаких параметров и не возвращают никакого значения. Тем не менее действие таких функций может состоять в изменении внешних или статических переменных или выполнении каких-либо других действий, не связанных с данными.
С использованием функций в языке Си связаны три понятия:
-определение функции;
-объявление функции;
-вызов функции;
Определение функции.
Определение функции имеет следующий формат:
[спеццфикатор-класса-памяти\ [спецификатор-типа]
описатель( [спис --формальпых-параметров] )
тело функции
Определение функции задает имя, формальные параметры (типы и число ее формальных параметров), объявления и операторы, которые определяют действие функции. Последовательность объявлений и операторов называется телом функции. В определении функции также может быть задан тип значения, возвращаемого функцией (тип возврата) и класс памяти.
Функция возвращает значение, если ее выполнение заканчивается выполнением оператора return в теле функции следующего формата:
return выражение;
Выражение вычисляется, преобразуется, если необходимо, к типу возвращаемого значения в определении (объявлении) функции, и управление возвращается в точку вызова.
Если оператор return не задан или не содержит выражения, функция не возвращает никакого значения. В этом случае спецификатор типа возвращаемого значения должен быть задан ключевым словом void, означающим отсутствие возвращаемого значения.
Тело функции -это составной оператор, содержащий операторы, определяющие действия функции. Он также может содержать объявления переменных, используемых в этих операторах.
Все переменные, объявленные в теле функции, имеют класс памяти auto, если они не объявлены иначе, и являются локальными. Когда вызывается функция, то для локальных переменных отводится память в стеке и производится их инициализация (если она задана).
Параметры функции передаются по значению и могут рассматриваться как локальные переменные, место для которых распределяется при вызове функции, они инициализируются значениями переданных аргументов и теряются при выходе из функции. Поэтому в теле функции нельзя изменять значение параметра, так как функция работает с копиями аргументов.
Объявление функции (прототип)
Если нужно вызвать функцию до ее определения в этом файле или определение функции находится в другом исходном файле, вызов функции следует предварить объявлением функции, т.е.. задать прототип функции, который позволит компилятору выполнить проверку аргументов и возвращаемого значения. Прототип функции имеет следующий формат:
[спецификатор - класса-памяти][спецификатор- типа]
описатель ( [список- формальных -параметров])
[, список - описателей]',
В отличие от формата определения функции в формате прототипа за заголовком функции следует точка с запятой (т.е. прототип функции не имеет тела), и заголовок функции может заканчиваться списком - описателей.
Правила использования остальных элементов формата прототипа те же, что и в определении функции.
Прототип - это явное объявление функции, которое предшествует определению функцию. Тип возврата, заданный в прототипе, должен согласовываться с типом возврата, заданным в определении.
Вызов функций.
Вызов функции имеет следующий формат:
выражение ( [список - выражении]);
Выражение вычисляется как адрес функции. Список - выражений представляет собой список фактических аргументов, передаваемых в функцию. Он может быть пустым.
Фактический аргумент может быть любой величиной основного типа, структурой, перечислением, смесью или указателем.
Выполнение вызова функции происходит следующим образом:
-1. Вычисляются выражения в списке выражений и производятся обычные арифметические преобразования. Затем, если известен прототип функции, тип результирующего аргумента сравнивается с типом соответствующего формального параметра. Если они не совпадаю то либо производится преобразование типов, либо выдается диагностическое сообщение. Число выражений в списке выражений должно совпадать с числом формальных параметров.
Если в прототипе функции вместо спецификатора - формальных - параметров задано ключевое слово void, это значит, что в функцию не передается никаких аргументов и в определении функции не должно быть формальных параметров. Если это не так, то выдается диагностическое сообщение.
-2. Происходит замена формальных параметров на фактические. Первое выражение в списке всегда соответствует первому формальному параметру, второе - второму и т.д. .