Єдина Країна!

Головне меню

Наша кнопка

Українські уроки про ІТ

Друзі

Підтримка української армії


Головна Програмування - C++ Базовий курс програмування на С++. Урок 17. Рядки в C++. Робота з рядками.

Базовий курс програмування на С++. Урок 17. Рядки в C++. Робота з рядками.
Написав Joker   
Неділя, 20 березня 2016 15:25
Переглядів: 10747

Цінуйте будь-який досвід. Він робить вас сильнішими.

©Inspired

Сьогодні ми вивчимо

1. Розв’язок попереднього домашнього завдання

2. Рядки та їх створення

3. Функції для роботи з рядками

4. Домашнє завдання

 

 

 

Розв’язок попереднього домашнього завдання

1. Написати калькулятор без використання змінних

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;

int main ()
{
   double *a = new double;
   double *b = new double;
   char *op = new char;

   cin >> *a >> *op >> *b;

   switch(*op)
   {
	case '+':
		cout << "result = " << *a + (*b) << endl;
	break;
	case '-':
		cout << "result = " << *a - (*b) << endl;
	break;
	case '*':
		cout << "result = " << *a * (*b) << endl;
	break;
	case '/':
		if (*b)
			cout << "result = " << *a / (*b) << endl;
		else
			cout << "error" << endl;

	break;
	default:
		cout << "Error" << endl;
   }

   delete a;
   delete b;
   delete op;

   _getch();
   return  0;
}

2. Знайти факторіал числа використовуючи тільки вказівники

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;

int fact (int *x)
{
   if(!(*x))
	return  1;
   else
   {
	*x = *x-1;
	return  ((*x)+1) * fact(x);
   }
}

int main ()
{
   int *p = new int;

   cout << "Enter --> ";
   cin >> *p;

   cout << "Result = " << fact(p) << endl;

   delete p;

   _getch();
   return  0;
}

3. За допомогою посилань на функції знайти суму трьох максимальних значень масиву. Розмір масиву задає користувач. Заповнення випадковими числами.

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;

int &func(int a[], int len, int &Max)
{
   int ix = 0; 

   Max = a[ix];

   for (int i=0; i<len; ++i)
   {
	if (Max < a[i])
	{
		Max = a[i];
		ix=i;
	}
   }

   a[ix] = -36;

   return  Max;
}


int main ()
{
   srand(time(NULL));
   int *size = new int;
   int *res = new int(0);

   cout << "Enter size --> ";
   cin >> *size;

   int *ar = new int [*size];

   for (int i=0; i<(*size); ++i)
  {
	ar[i] = -35 + rand() % 85;
	cout << ar[i] << "\t";
  }
   cout << endl;

   int Max = 0;
   for (int i=0; i<3; ++i)
   {
	*res += func(ar,*size,Max);
 	Max = 0;
   }


   cout << "!!!" << endl;
   for (int i=0; i<*size; ++i)
      cout << ar[i] << "\t";
   cout << endl;

   cout << "\n Result = " << *res << endl;

   delete size;
   delete [] ar;
   _getch();
   return  0;
}


4. Підрахувати суму перших 20 натуральних чисел використовуючи вказівник на вказівник.

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;

int main ()
{
   int *sum = new int(0);
   int *i = new int (1);

   int **p = &sum;

   for (; *i <= 20; (*i)++)
	**p = **p + (*i);

   cout << "res = " << **p << endl;


   delete sum;
   delete i;

   _getch();
   return  0;
}

 

Рядки та їх створення

Найпростіший варіант створювати і використовувати символьні масиви для роботи з рядками, проте такий масив (типу char) не завжди можна вважати рядком. Справа з тому, що рядок повинен містити нульовий байт /0, він символізує кінець.

Наприклад:

1 – це звичайний масив який зберігає символи

2 – рядок

Звісно, звичайні правила при роботі з масивами дійсні, тому теоретично можна ввести рядок приблизно так:

char str[6] = {'H', 'e', 'l', 'l', 'o', '/0'};

Але при роботі з рядками можна робити дещо простіше. Такий запис теж працює:

char str[] = "Hello";

cout<<str<<endl;

По-перше, не потрібно вказувати розмір масиву (тільки при такому способі ініціалізації). При виводі достатньо тільки імені масиву. Варто пам’ятати, коли вказуєте розмір, то він повинен перевищувати кількість символів хоча б на 1 елемент.

Ще один нюанс:

1 – символ.

2 – рядок який складається з одного символу.

Крім того  можна користуватися вказівниками.

char *str;

str = "Hello";

cout<<str<<endl;

 

Але давайте подивимося, як відреагує програма на просту задачку ввести рядок з клавіатури. Таке часто буває дійсно потрібним. Якщо ми будем вводити все за допомогою циклу, то все буде ок, але це зайва робота. Треба спростити. Можна спробувати так:

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;

int main ()
{
   char str[80];
   cin >> str;

   cout << str;

   _getch();
   return  0;
}


На перший погляд все працює. Якщо ввести для прикладу hello, то результат буде hello, що вірно. Але це рядок і він може містити пробіли. Тепер ми виявили проблему, якщо ввести два слово через пробіл то введення закінчиться після пробілу, а результатом буде тільки перше слово. Згадайте, що відбувалося коли ми заповнювали елементи масиву через пробіл.

Тому, вирішення називається cin.getline(). Приймає:

- ім’я рядка

- кількість символів для введення

Давайте виправимо нашу програму.

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;

int main ()
{
   char str[80];
   cin.getline(str, 50);

   cout << str;

   _getch();
   return  0;
}

Тепер ввівши Hello world, отримаємо те саме, повністю.

 

Функції для роботи з рядками

Ще трохи інформації про рядки.

1. Нам може знадобитися визначити довжину рядка без нульового символу. Наприклад, ви знаєте, що поставили обмеження на кількість символів 100, але рядок може складатися тільки з 1. Наша програма буде працювати швидше якщо буде знати кількість використаних символів. Це робиться за допомогою ф-ції strlen(), приймає ім’я рядка.

2. strcat(s2,s1), якщо потрібно об’єднати два рядки. Зберігається у s2

3. strcmp(s1,s2) – порівнює два рядки. Повертає ціле число. Якщо s2<s1, то отримуємо число <0, якщо s2>s1 -> >0, якщо s1 = s2 -> 0

4. Функція strcpy(s,s1) копіює рядки.

5. strrev() – інверсія символів крім 0 байту.

6. strstr(s1,s2) – шукає рядок s2 у рядку s1, якщо пошук не дав результатів повертає 0, інакше адресу першого елемента знайденого рядка.

 

Список функцій набагато більший ніж я подав вище. Їх багато і вони будуть плутатися у вас у голові. Ви запам’ятаєте їх тільки тоді коли будете регулярно використовувати, в іншому випадку доведеться створювати власні. Думаю, буде краще якщо ви витратите трохи більше часу, щоб загуглити потрібне, але тоді вже точно запам’ятаєте.

1. isalpha (). Першим ділом потрібно додати бібліотеку #include <cctype>. У параметрі вказуємо, що саме перевіряти. Функція перевіряє чи є даний символ літерою англійського алфавіту.

2. Заміна регістрів:

2.1. а -> A

strcpy(str_small, strup(str_big));

str_small – рядок з маленькими літерами,

str_big – рядок з великими літерами.

2.2. A -> a

strcpy(str_big, strlvr(str_small));

3. Інколи cin.getline() працює некоректно. Це відбувається, тому що зчитується зайвий Enter. Таке можна спостерігати у приблизно такому коді.

cin>> x;

cin.get();

cin.getline(str);

Цей фрагмент вже виправлений, але без 2 рядка у вас могли б виникнути проблеми. Без ф-ції cin.get(), cin.getline() може працювати некоректно.

 

Домашнє завдання

1. Вивести рядок навпаки.
2. У першому рядку задано певну строку. У наступного ви вводити один символ. Результат програми повинен показати скільки разів цей символ зустрічається у рядку.
3. Відсортувати 3 слова розділені пробілами за англійським алфавітом.


( 16 Проголосувало )

Схожі статті:
Новіші матеріали:
Старіші матеріали:

Коментарі
Добавити новий
Mars_ua  - ООП   |2016-03-20 20:42:42
Чи будуть виходити уроки по
об’єктно-орієнтованому програмуванню
Misha   |2016-04-03 14:29:18
Цілком можливо. Але я не можу поки що нічого
гарантувати.
Залишити коментар
Ім`я:
e-mail:
 
Тема:
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Введіть цей настирливий код
Русская редакция: www.freedom-ru.net & www.joobb.ru

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 

Підписка

Хто онлайн?

Немає
На даний момент 21 гостей на сайті

Український рейтинг
TOP.TOPUA.NET