Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857 Кб
Скачать
☆

Лабораторный практикум

Вариант задания реализовать в виде функции, использующей для работы со строкой только указатели и операции над ним вида *p++, p++, p[i] и т.д.. Если функция возвращает строку или ее фрагмент, то это также необходимо сделать через указатель.

  1. Функция находит минимальный элемент массива и возвращает указатель на него. С использованием этой функции реализовать сортировку выбором.

  2. Шейкер-сортировка с использованием указателей на правую и левую границы отсортированного массива и сравнения указателей.

  3. Функция находит в строке пары одинаковых фрагментов и возвращает указатель на первый. С помощью функции найти все пары одинаковых фрагментов.

  4. Функция находит в строке пары инвертированных фрагментов (например "123apr" и "rpa321") и возвращает указатель на первый. С помощью функции найти все пары.

  5. Функция производит двоичный поиск места размещения нового элемента в упорядоченном массиве и возвращает указатель на место включения нового элемента. С помощью функции реализовать сортировку вставками.

  6. Функция находит в строке десятичные константы и заменяет их на шестнадцатеричные с тем же значением, например "aaaaa258xxx" на "aaaaa0x102xxx".

  7. Функция находит в строке символьные константы и заменяет их на десятичные коды, например "aaa'6'xxx" на "aaa54xxx".

  8. Функция находит в строке самое длинное слово и возвращает указатель на него. С ее помощью реализовать размещение слов в выходной строке в порядке убывания их длины.

  9. Функция находит в строке самое первое (по алфавиту) слово. С ее помощью реализовать размещение слов в выходной строке в алфавитном порядке.

  10. Функция находит в строке симметричный фрагмент вида "abcdcba" длиной 7 и более символов (не содержащий пробелов) и возвращает указатель на его начало и длину. С использованием функции «вычеркнуть» все симметричные фрагменты из строки.

  11. «Быстрая» сортировка (разделением) с использованием указателей на правую и левую границы массива, текущих указателей на правый и левый элемент и операции сравнения указателей (см. 7.2).

  12. Найти в строке последовательности, состоящие из одного повторяющегося символа и заменить его на число символов и один символ (например "aaaaaa" - "5a").

  13. Функция создает копию строки и "переворачивает" в строке все слова. (Например: "Жили были дед и баба" - "илиЖ илиб дед и абаб").

Вопросы без ответов

Определите, используется ли указатель для доступа к отдельной переменной или к массиву. Напишите вызов функции с соответствующими фактическими параметрами – адресами переменных или именами массивов.

Пример оформления тестового задания.

//------------------------------------------------------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)++; }