Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KL_PrJAVU230200.doc
Скачиваний:
23
Добавлен:
17.03.2015
Размер:
702.46 Кб
Скачать

Функции и строки

Любая строка определяется одним данным – адресом начала строки. Чтобы передать строку, надо знать адрес этой строки. Следовательно, для передачи строки в функцию требуется передать адрес начала строки. Следовательно, в качестве параметра у функции следует объявить параметр указатель на символьный тип.

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

Для написания оператора вызова такой функции необходимо уметь определить адрес начала строки.

а) Пусть память под строку выделена статически.

char str [80]; str – адрес- константа начала строки.

б) Если память выделена динамически.

p=new char[80];

то p – адрес начала строки.

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

Написать программу с функцией вычисляющую размер строки

// siz.cpp

int siz(char*p) {

int i, kol=0;

for (i=0; p[i]!=0; i++) { kol++; }

return kol;

}

// siz.h

#ifndef SIZ_H

#define SIZ_H

int siz(char*p);

#endif

// main.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include "siz.h"

int main (void) {

char str[80];

int res;

cout << "\nВведите строку" << endl;

cin.getline(str,80);

res = siz(str);

cout << "\nРазмер строки = " << res << endl;

return 0;

}

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

(Первая строка является исходным данным, вторая строка - результат)

// boyan.cpp

void boyan(char * p1, char * p2) {

int i, j=0;

for (i=0; p1[i]!=0; i++) {

if (p1[i] != ‘ ‘) {

p2[j] = p1[i];

j++;

}

p2[j] = 0;

return;

}

// boyan.h

#ifndef BOYAN_H

#define BOYAN_H

void boyan(char * p1, char * p2);

#endif

// main.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include "boyan.h"

int main (void) {

char str1[80], str2[80];

cout << "\nВведите строку" << endl;

cin.getline(str1,80);

boyan(str1, str2);

cout << "\nПолучилась строка" << endl << str2 << endl;

return 0;

}

Переписать программу следующим образом:

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

Выделение памяти под строку-результат внутри функции пользователя

// boyan.cpp

char * boyan(char * p1) {

char *p2=new char[256];

int i,j=0;

for (i=0; p1[i]!=0; i++) {

if (p1[i] != ‘ ‘) {

p2[j] = p1[i];

j++;

}

p2[j] = 0;

return p2;

}

// boyan.h

#ifndef BOYAN_H

#define BOYAN_H

char * boyan(char * p1);

#endif

// main.cpp

#include<iostream> //подключение системных средств для

using namespace std; //возможности использовать потоки ввода-вывода

#include "boyan.h"

int main (void) {

char str1[80], * str2;

cout << "\nВведите строку" << endl;

cin.getline(str1,80);

str2 = boyan(str1);

cout << "\nПолучилась строка" << endl << str2 << endl;

delete []str2;

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]