- •1 Основні відомості про вказівники
- •2. Вказівники та посилання
- •Void function_a (char*, int, short*);
- •Int *pi; /* вказівник-змінна на дані типу int */
- •3. Ініціалізація вказівника
- •4. Розіменування та присвоєння
- •5. Void-вказівник
- •8. Деактивації дії модифікатора
- •6. Операція пересування вказівника
- •7. Використання вказівників з модифікатором const
- •9. Подвійний вказівник
- •10. Вказівники і масиви
- •11. Доступ до ділянок динамічної пам'яті
- •12. Звільнення пам'яті
- •8. Операції з вказівниками
- •Int I, *pi; /* pi –змінна-вказівник */
- •13. Динамічні масиви
- •11. Посилання
- •Лабораторный практикум
- •Вопросы без ответов
- •3 Основні операції над вказівниками
- •4 Багаторівнева непряма адресація
- •5 Операції над вказівниками
- •Void main ()
- •Void main()
- •6 Проблеми, пов'язані з вказівниками
- •Int *х; /* змінній-покажчику 'х' виділена оп, але 'х' не містить значення адреси оп для змінної */
- •Int *х; /* х - ім'я покажчика, він одержав оп*/
- •Void main ()
- •9 Масиви
- •1.9.1 Основні поняття
- •Int а[5]; /* оголошення зовнішнього масиву */ main ()
- •9.2 Оголошення та звертання в одновимірних масивах
- •9.3 Оголошення та звертання до багатовимірних масивів
- •Int а[3][4]; /* а - вказівник-константа */
- •10 Масиви покажчиків
- •10.1 Робота з великими масивами
- •Void main()
- •Int *p[200], I, j; clrscr() ;
- •10.2 Вільні масиви та покажчики
- •11 Символьні рядки
- •11.1 Основні відомості про представлення рядків
- •11.2 Функції роботи з рядками
- •1. Функції введення рядків.
- •2. Функції виведення рядків.
- •14 Лекція №14
- •14.1 Вказівники Лекція № 2 - Вказівники та посилання
- •1.2.1. Вказівники
- •6. Вказівники і масиви
- •6.1. Вказівники і адреси
- •6.2. Вказівники і аргументи функцій
- •6.3. Вказівники і масиви
- •6.4. Адресна арифметика
- •6.5. Вказівники символів і функції
- •6.6. Вказівники – не цілі значення
- •6.7. Багатовимірні масиви
- •6.8. Масиви вказівників (вказівники на вказівники)
- •6.9. Ініціалізація масивів вказівників
- •6.10. Вказівники і багатовимірні масиви
- •6.11. Командний рядок аргументів
- •6.12. Вказівники на функції
- •Посібник для початківця про вказівники
- •6. Вказівники і структуровані програмні змінні
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •8. Вказівники і динамічні змінні (керування пам'яттю)
- •Void* operator new(size_t t)
- •Void operator delete(void* p)
- •Void main()
Лабораторный практикум
Вариант задания реализовать в виде функции, использующей для работы со строкой только указатели и операции над ним вида *p++, p++, p[i] и т.д.. Если функция возвращает строку или ее фрагмент, то это также необходимо сделать через указатель.
Функция находит минимальный элемент массива и возвращает указатель на него. С использованием этой функции реализовать сортировку выбором.
Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива и сравнения указателей.
Функция находит в строке пары одинаковых фрагментов и возвращает указатель на первый. С помощью функции найти все пары одинаковых фрагментов.
Функция находит в строке пары инвертированных фрагментов (например "123apr" и "rpa321") и возвращает указатель на первый. С помощью функции найти все пары.
Функция производит двоичный поиск места размещения нового элемента в упорядоченном массиве и возвращает указатель на место включения нового элемента. С помощью функции реализовать сортировку вставками.
Функция находит в строке десятичные константы и заменяет их на шестнадцатеричные с тем же значением, например "aaaaa258xxx" на "aaaaa0x102xxx".
Функция находит в строке символьные константы и заменяет их на десятичные коды, например "aaa'6'xxx" на "aaa54xxx".
Функция находит в строке самое длинное слово и возвращает указатель на него. С ее помощью реализовать размещение слов в выходной строке в порядке убывания их длины.
Функция находит в строке самое первое (по алфавиту) слово. С ее помощью реализовать размещение слов в выходной строке в алфавитном порядке.
Функция находит в строке симметричный фрагмент вида "abcdcba" длиной 7 и более символов (не содержащий пробелов) и возвращает указатель на его начало и длину. С использованием функции «вычеркнуть» все симметричные фрагменты из строки.
«Быстрая» сортировка (разделением) с использованием указателей на правую и левую границы массива, текущих указателей на правый и левый элемент и операции сравнения указателей (см. 7.2).
Найти в строке последовательности, состоящие из одного повторяющегося символа и заменить его на число символов и один символ (например "aaaaaa" - "5a").
Функция создает копию строки и "переворачивает" в строке все слова. (Например: "Жили были дед и баба" - "илиЖ илиб дед и абаб").
Вопросы без ответов
Определите, используется ли указатель для доступа к отдельной переменной или к массиву. Напишите вызов функции с соответствующими фактическими параметрами – адресами переменных или именами массивов.
Пример оформления тестового задания.
//------------------------------------------------------52-08.cpp
//-------------------------------------------------------
void F(int *p, int *q, int n){
for (*q = 0; n > 0; n--)
* q = *q + *p++; }
void main(){
int x,A[5]={1,3,7,1,2};
F(A,&x,5); printf("x=%d\n",x); } // Выведет 13
Формальный параметр p используется в контексте *p++, что означает работу с последовательностью переменных, то есть с массивом. Число повторений цикла определяется параметром n, соответствующим размерности массива. Указатель q используется для косвенного обращения через него к отдельной переменной. Поэтому при вызове функции фактическими параметрами являются: имя массива – указатель на начало, адрес переменной – указатель на нее и константа – размерность массива, передаваемая по значению.
//-----------------------------------------------------------52-09
//-----------------------------------------------------------1
int F1(char *c){
for (int nc=0;*c!=0;c++)
if (*c!=' ' && (c[1]==' ' || c[1]==0)) nc++;
return nc;}
//-----------------------------------------------------------2
int F2(char *c){
int nc; char *p;
for (nc=0,p=c; *c!=0;c++)
if (*c!=' ' && (p==c || c[-1]==' ')) nc++;
return nc;}
//-----------------------------------------------------------3
void F3(char *c){
while (*c!=0) c++;
*c++='*'; *c=0; }
//----------------------------------- -----------------------4
void F4(char *c){
for (;*c!=0;c++)
if (*c==' ' && c[1]==' '){
for (char *p=c;*p!=0;p++) *p=p[1];
c--;
}}
//-----------------------------------------------------------5
void F5(char *c, char *out){
for (; *c!=0; c++)
if (*c!=' '){
*out++=*c;
if (c[1]==' ') *out++=' ';
}
*out=' ';}
//-----------------------------------------------------------6
void F6(char *c, char *out){
for (;*c!=0;c++)
if (!(*c==' ' && c[1]==' ')) *out++=*c;
*out=0 ;}
//-----------------------------------------------------------7
int F7(char *c){
for (int nc=0; *c!=0;c++)
if (*c>='0' && *c<='9')
nc=nc+*c-'0';
return nc;}
//-----------------------------------------------------------8
void F8(char *p,int B[]){
int nc; char *c;
for ( nc=0,c=p;*c!=0;c++)
if (*c!=' ' && (c==p || c[-1]==' '))
B[nc++]=c-p; }
//-----------------------------------------------------------9
void F9(char *c, char *out){
for (char *p=c; *c!=0;c++)
if (*c!=' ' && (c[1]==' ' || c[1]==0)){
for (char *q=c; q>=p && *q!=' '; q-- )
*out++=*q;
*out++=' ';
}
*out=0; }
//-----------------------------------------------------------10
int F10(char *c){
for (;*c!=0;c++)
if (*c>='0' && *c<='9 ') break;
for (int s=0;*c>='0' && *c<='9';c++)
s=s*10+*c-'0';
return s; }
//-----------------------------------------------------------11
char *F11(char *c, int &m){
char *b=NULL;
for (m=0;*c!=0;c++)
if (*c==c[1]){
for (int k=2;*c==c[k];k++);
if (k>m) m=k,b=c;
}
return b; }
//----------- ------------------------------------------------12
char *F12(char *c, int &m){
char *b=NULL;
int k=0;
for (;*c!=0;c++)
if (*c!=' ') k++;
else{
if (k!=0 && k>m) m=k,b=c-k;
k=0;
}
return b; }
//------------------------------------------------------------13
char *F13(char *c, int &m){
char *b=NULL;
for (int k=0;*c!=0;c++)
if (*c!=' '){
for (k=1;c[k]!=' ' && c[k]!=0;k++);
if (k>m) m=k,b=c;
c+=k-1;
}
return b;
}
//---------------------- -------------------------------------14
int F14(char *c){
int s;
for (;*c!=0;c++)
if (*c>='0' && *c<='9' || *c>='A' && *c<='F') break;
for (s=0;*c>='0' && *c<='9' || *c>='A' && *c<='F';c++)
if (*c>='0' && *c<='9')
s=s*16+*c-'0';
else
s=s*16+*c-'A'+10;
return s;}
//------------------------------------------------------------15
void F15(char *c){
for (char *p=c; *p !='\0'; p++);
for (p--; p>c; p--,c++)
{ char s; s=*p; *p=*c; *c=s; }
}
//------------------------------------------------- ----------16
int F16(char *c){
for (int old=0, nw=0; *c !='\0'; c++){
if (*c==' ') old = 0;
else { if (old==0) nw++; old=1; }
}
return nw; }
//------------------------------------------------------------17
void F17(int a,char *c){
for (int mm=a; mm !=0; mm /=10 ,c++);
for (mm=a, *c--='\0'; mm!=0; c--,mm=mm/10)
*c= mm % 10 + '0';
}
//------------------------------------------------------ -----18
void F18(int a,char *c){
for (int mm=a; mm !=0; mm /=16 ,c++);
for (mm=a, *c--='\0'; mm!=0; c--,mm=mm /16)
{
int v=mm % 16;
if (v <=9) *c = v + '0';
else *c = v - 10 + 'A';
}}
//------------------------------------------------------------19
int F19(char *p){
char *c; int ns;
for (c=p,ns=0; *c !='\0'; c++) {
for (int k=0; c-k >=p && c[k] !='\0'; k++)
if (c[-k] != c[k]) break;
if (k >=3) ns++;
}
return ns; }
//------------------------------------------------------------20
char *F20(char *c1, char *c2){
for (; *c1 !='\0'; c1++) {
for (int j=0; c1[j]==c2 [j]; j++);
if (c2[j]=='\0') return c1;
}
return NULL;}
//------------------------------------------------------------21
char *F21(char *c, int &s){
int n; char *z,*p;
for (; *c!=0; c++){
for (p=c,n=0; *p !='\0'; p++)
if (*p==*c) n++;
if (n > s) { z=c ; s=n; }
}
return z;
}
//------------------------------------------------------------22
void F22(double x, char *c){
x-=(int)x;
int i;
for (*c++='.', i=1; i< 6; i++) {
x *= 10.; *c++=(int)x + '0'; x -= (int)x;
}
*c='\0';}
//------------------------------------------------------------23
void F23(char *c){
int cm=0;
for (char *p=c; *c !='\0'; c++) {
if (c[0]=='*' && c[1]=='/') { cm--, c++; continue; }
if (c[0]=='/' && c[1]=='*') { cm++, c++; continue; }
if (cm==0) *p++ = *c;
}
*p=0; }
//------------------------------------------------------------24
int *F24(int *p, int *q){ return *p > *q ? p : q; }
//------------------------------------------------------------25
void F25(int *p1, int *p2)
{ int c; c = *p1; *p1 = *p2; *p2 = c; }
//------------------------------------------------------------26
void F26(int *p, int *q, int n){
for (*q = *p; n > 0; n--, p++)
if (*p > *q) *q = *p;
}
//------------------------------------------------------------27
int *F27(int *p, int n)
{ int *q;
for (q = p; n > 0; n--, p++)
if (*p > *q) q = p;
return q; }
Определите, каким образом программа передает параметры (по значению или по ссылке) и как это влияет на результат.
//------------------------------------------------------------28
int inc1( int vv) { vv++; return vv; }
void main1(){ int a,b=5; a=inc1(b); }
//------------------ ---------------------------------------- 29
int inc2( int &vv) { vv++; return vv; }
void main2(){ int a,b=5; a=inc2(b); }
//----------------------------------------------------------- 30
int inc3( int &vv) { vv++; return vv; }
void main3(){ int a,b=5; a=inc3(+ +b); }
//----------------------------------------------------------- 31
int &inc4( int &vv) { vv++; return vv; }
void main4(){ int a,b=5; a=inc4(b); }
//----------------------------------------------------------- 32
int inc5(int &x) { x++; return x+1; }
void main5 ()
{ int x,y,z; x = 5; y = inc5(x); z=inc5(x); z=inc5(z); }
//----------------------------------------------------------- 33
int &inc6(int &x){ x++; return x; }
void main6 ()
{ int x,y,z; x = 5; y = inc6(x); z = inc6(inc6(x)); }
//---------------------------- -------------------------------34
int inc7(int x) { x++; return x+1; }
void main7 () { int x,y,z; x = 5; y=inc7(x);
z = inc7(inc7(x)); }
//------------------------------------------------------------ 35
int &F38(int &n1, int &n2){
return n1 > n2 ? n1 : n2; }
void main8(){ int x=5,y=6,z; z=F38(x,y); F38(x,y)++; }
//------------------------------------------------------------ 36
int &F39(int &n1, int &n2){
return n1 > n2 ? n1 : n2; }
void main10(){ int x=5,y=6,z; F39(x,y)=0; F39(x,y)++; }
