Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная_работа_№4_РИ-111-09-05-12.docx
Скачиваний:
1
Добавлен:
10.09.2019
Размер:
1.44 Mб
Скачать

Void main()

{

setlocale(LC_ALL,"russian");

double number1=7.3, number2;

char *ptr;

char s1[100], s2[100]="ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz";

//или

/*char *s1=new char[100];

char *s2=new char[100];

s2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";*/

int i;

//1

double *fPtr;

//2

fPtr=&number1;

//3

cout << "Значение объекта на которое указывает fPtr: " << *fPtr << endl;

//4

number2=*fPtr;

//5

cout << "Значение number2: " << number2 << endl << endl;

//6

cout << "Адрес number1 (1): " << &number1 << endl;

//7

cout << "Адрес number1 (2): " << fPtr << endl;

//8

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

s1[i]=s2[i];

//или strcpy_s(s1,s2);

cout << endl;

//9

cout << "Сравнение строк с помощью цикла: " << endl;

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

if(s1[i]!=s2[i])

{

cout << "Строки не совпадают" << endl;

break;

}

else

{

cout << "Строки совпадают" << endl;

break;

}

cout << endl;

//или

cout << "Сравнение строк strcmp(s1, s2): " << endl;

if (strcmp(s1, s2) == 0)

cout << "Строки совпадают" << endl;

else

cout << "Строки не совпадают" << endl;

cout << endl;

//10

cout << "Добавим 10 символов строки s2 в s1: " << endl;

strncat_s(s1,s2,10);

cout << s1 << endl << endl;

//11

int count=0;

while(s1[i]!='\0')

{

count++;

i++;

}

cout << "Длина строки s1 while: " << count << endl;

//или

cout << "Длина строки s1 strlen(s1): " << strlen(s1) << endl << endl;

//12

char k[2]=",";

ptr=strtok(s2,k);

cout<<"Первая лексема: "<<ptr<<endl;

system("pause");

}

Задание 4

а) exchenge

#include <iostream>

using namespace std;

void exchenge(double *x, double *y);

Void main ()

{

setlocale(LC_ALL, "Russian");

double x=5, y=0, *xPOINT,*yPOINT;

xPOINT=&x;

yPOINT=&y;

exchenge(xPOINT,yPOINT);

system("Pause");

}

void exchenge(double *xPOINT,double *yPOINT)

{

cout<<"Функция работает!"<<endl;

}

б) evaluealuete

#include <iostream>

#include <string>

using namespace std;

int value=5;

int poly (int value);

int (*point)(int)=&poly;

int evaluealuete(int value,int (*point)(int));

Void main ()

{

cout<<evaluealuete(value,point);

cin.get();

}

int poly (int value)

{ value++;

return value;

}

int evaluealuete(int value, int (*point)(int))

{

int z=2*value;

return z+(*point)(value) ;

}

Задание 5

#include <iostream>

#include <conio.h>

using namespace std;

int main()

{

int *zPtr;

//равенство указателя нулю не делает его абсолютно "безопасным"

//В нашем случае присваивание посредством p будет присваиванием по нулевому адресу, что обычно вызывает разрушение программы

int *aPtr= NULL;

int *sPtr = NULL;

int number,i;

int z[5]={1,2,3,4,5};

/*ошибочной есть строка sPtr=z, т.к. в задании сказано что zPtr ссылается на массив z*/

zPtr=z;

/*1) Ошибка заключается в том что zPtr изначально не инициализировання переменная,

т.е. не имеет начального значение, поэтому не может быть увеличена. Исправим ошибку*/

//zPtr++;

/*2) Нельзя делать так: number=zPtr; потому что zPtr указатель и он должен быть присовен как узказатель.

Удалим строку.*/

//number=zPtr;

/*3) Обращение к II элементу массива в виде *zPtr[2] записано не верно, следует это делать так:

number=*(zPtr+2)или так number=zPtr[2]; Исправим ошибку*/

number=zPtr[2];

/*4) Ошибка в том что подсчет элементов массива начинается с НУЛЯ, поэтому последний элемент данного

массива будет иметь индекс 4, а не 5. Исправим ошибку тут for(i=0;i<*=*5;i++)*/

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

cout << zPtr[i] << endl;

/*5) для объекта типа указатель на объект неопределённого типа отсутствует информация о размерах и

внутренней структуре адресуемого участка памяти. Из-за этого не могут быть определены какие-либо

операции для преобразования значений.

Поэтому переменной sPtr невозможно присвоить никаких значений без явного преобразования этих значений

к определённому типу указателя. Исправим ошибку, удалим строку number=*sPtr;*/

//number=*sPtr;

/*6) Т.к. у нас константный массив возникает ошибка в строке ++z; Для исправления ошибки массив следует объявить так:

int *z=new int[10];*/

//++z;

/*7) Копируемое слово меньше чем выделенный массив символов, и последние 5 символов выводятся крякозябрами. Происходит

утечка памяти*/

char s[10];

cout << strncpy(s,"Hello",5) << endl;

/*8) нельзя производить переопределение в одной и той же функции. Удалим строку char s[12]; А так же ошибка в том что

при копировании фраза "Welcome home" не помещается в массив символов т. к. забыт символ конца строки.*/

//char s[12];

//cout << strcpy(s,"Welcome home") << endl;

/*9) В даннной строке ошибка в том что не определены идентификаторы string1 и string2. Удалим строку*/

//if(strcmp(string1,string2))

//cout << "строки равны" << endl;

system("pause");

return 0;

}

Задание 6

#include<iostream>

#include<conio.h>

using namespace std;

void f(const int *);

int main()

{

int y;

f(&y);

getch();

return 0;

}

void f(const int*xPtr)

{

/*невозможно присваивать какие либо значение переменной, которая объявлена как константа*/

//*xPtr=100;

}

Задание 7

/*Результат программы полностью адекватен, т.к. задача функции выводить на экран

конст значение xPtr и адрес этого константного значения xPtr. Вызывая функцию мы

присваеваем ей константное значение y=10*/

#include<iostream>

#include<conio.h>

using namespace std;

void f(const int *);

int main()

{

int y=10;

f(&y);

getch();

return 0;

}

void f(const int*xPtr)

{

cout << *xPtr << endl << endl;

cout << &*xPtr << endl;

}

Контрольные вопросы

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

  2. Инициализировать указатель, то есть при описании присвоить ему начальное значение можно сразу Int *z=10; либо присвоить указателю адрес уже инициализированной переменной так: *j=&i;

  3. Число NULL.

  4. Адресация — осуществление ссылки (обращение) к устройству или элементу данных по его адресу; установление соответствия между множеством однотипных объектов и множеством их адресов; метод идентификации местоположения объекта.

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

Например:

int *pn, n;

*pn = 5;

n = *pn;

  1. Если указатель имеет тип void, то ему можно присвоить любой другой тип указателя.