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

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

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

2017-11-17 297
Написать программу с функцией вычисляющую размер строки 0.00 из 5.00 0 оценок
Заказать работу

 

// 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;

}

Функции и одномерные числовые массивы

 

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

int *p – для передачи адреса.

int n – для передачи количества элементов массива.

Поскольку каждый элемент массива доступен нам по адресу, то исходный массив и массив-результат предаются одинаково.

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

 

При формировании массива-результата, память может выделяться внутри вызывающей функции в том же количестве, что и исходный массив. Внутри функции он заполняется данными и его размер может уменьшиться, поэтому вновь подсчитанный размер массива результата передается через оператор return, при этом тип функции - int.

 

Память под массив результат может быть выделена и внутри функции пользователя, но только -динамически. Его размер может быть предварительно подсчитан или устанавливается приблизительно. В процессе заполнения размер массива определяется. Вызывающая функция ничего не знает об этом массиве, поэтому его надо передать как результат, то есть: через оператор return передать адрес начала массива, при этом тип функции будет указатель на тип массива, например int *. Количество элементов в массиве передаем как второй результат, через параметр-ссылку (int & n). Не забыть освободить динамическую память (в main), как только массив нам станет не нужным.

 

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

 

---------------------------------------------------------

int mas[5]; | int * p = new int[5];

mas - адрес начала массива | p - адрес начала массива

 

 

Задача 1

 

Демонстрирует работу с массивом как с исходным данным

 

Даны два массива, сравнить их на равенство.

 

1. Функция заполнения массива случайными числами

2. Ф-я вывода массива на экран

3. Ф-я сравнения массива на равенство

 

 

Анализ характеристик функций

 

1/

 

1. InMasRnd

 

2. Исходные данные:

 

а) массив

int *p;

int n;

 

б) int min; - левая граница интервала

int max; - правая граница интервала

 

3. Результат: нет => void

 

2/

 

1. OutMas

 

2. Исходные данные

 

а) массив

int *p;

int n;

 

3. Результат: нет => void

 

3/

 

1. CmpMas

 

2. Исходные данные

 

а) 2 массива - int *p1;

int *p2;

int n;

 

3. Результат: да/нет => bool

 

файл: mas1.h

----------------

 

#ifndef MAS1_H

#define MAS1_H

 

void InMasRnd(int *p, int n, int min, int max);

void OutMas(int *p, int n);

bool CmpMas(int *p1, int *p2, int n);

 

#endif

 

----------------

 

файл: mas1.cpp

----------------

 

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

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

#include <stdlib.h>

#include <time.h>

 

void InMasRnd(int *p, int n, int min, int max)

{

int i;

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

p[i]=rand()%(max-min+1)+min;

return;

}

 

void OutMas(int *p, int n)

{

int i;

cout << endl;

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

cout << p[i] << " | ";

return;

}

 

------------------------------------

первый вариант

------------------------------------

bool CmpMas(int *p1, int *p2, int n)

{

int i;

int kol=0;

for (i=0; i<n; i++) {

if (p1[i] == p2[i])

kol++;

}

if (kol!= n)

return false;

else

return true;

}

 

------------------------------------

второй вариант

------------------------------------

bool CmpMas(int *p1, int *p2, int n)

{

int i;

for (i=0; i<n; i++) {

if (p1[i]!= p2[i])

return false;

}

return true;

}

 

----------------

 

файл: main.cpp

----------------

 

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

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

#include <stdlib.h>

#include <time.h>

#include "mas1.h"

 

int main(void)

{

const int N=5;

int mas1[N], mas2[N];

bool res;

srand((unsigned)time(NULL));

InMasRnd(mas1,N,-5,10);

InMasRnd(mas2,N,-5,10);

cout << "\nПервый массив:";

OutMas(mas1,N);

cout << "\nВторой массив:";

OutMas(mas2,N);

res = CmpMas(mas1,mas2,N);

if (res == true)

cout << "\nМассивы равны";

else

cout << "\nМассивы не равны";

return 0;

}


Поделиться с друзьями:

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.031 с.