Написать программу с функцией вычисляющую размер строки
// 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;
}