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

Головне меню

Наша кнопка

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

Друзі

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


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

Базовий курс програмування на С++. Урок 18. Структури даних C++
Написав Joker   
Вівторок, 28 червня 2016 12:13
Переглядів: 10090

Набирайтеся мужності, щоб ризикувати в житті. Без цього нікуди.

@Територія твого розвитку

#дій2016

 

Сьогодні ми розглянемо:

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

2. Структури даних

3. Практична частина

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

 

 

 

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

1. Вивести рядок навпаки

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

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


   int len = strlen(str);
   for (int i(len); i>=0; i--)
	cout << str[i];


   _getch();
   return  0;
}



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

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

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

   char c;
   cin >> c;

   int count = 0;

   for (int i=0; i<strlen(str); ++i)
   {
      if (str[i] == c)
         count++;
   }

   cout << count << endl;

   _getch();
   return  0;
}


 

Структури даних

Частково структуру даних тепер замінив excel. Наприклад там можна вести облік працівників, їх зарплати, пропуски та інші досягнення. Аналізуючи дані легко обрати якого працівника найкраще звільнити, якщо у цьому є необхідність. І це зручніше ніж вводити дані у програму щоразу чи робити ввід із текстового файлу.

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

Створюється структура за допомогою ключового слова struct.

Ось так:

struct name
{
};

Крапка з комою після фігурної дужки є обов’язкові, такий синтаксис. Але сама структура нічого не робить, це тільки опис об’єкта. Так само як змінна double вказує на те, що число може бути дробовим.  Структура задає параметри об’єкта.

Спершу спробуємо трішки простішу структуру, де будемо виключати з інституту студентів, які прогуляли більше ніж 10 днів навчання. Структура буде дуже простою. Три поля: ім’я студента, курс, кількість пропусків. І інститут у нас теж маленький – 5 студентів.

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


struct STUDENT
{
   char name[50];
   int course;
   int absent;
};

void  iNput (STUDENT &ex)
{
   cout << "Name --> ";

   cin.getline(ex.name, 49);
   cout << "Courseu --> ";
   cin >> ex.course;
   cout << "Absent --> ";
   cin >> ex.absent;
   cin.get();
}



int main ()
{
   const short int size = 5;
   STUDENT all[size];

   for (int i=0; i<size; ++i)
   {
      cout << "iNput student " << i +1 << endl;
      iNput(all[i]);
      cout << endl;
   }

   cout << all[0].name;

   cout << "exclusion of students: " << endl;
   for (int i=0; i<size; ++i)
   {
      if (all[i].absent > 10){
         cout << i+1 << " " << all[i].name << endl;
      }
   }

   _getch();
   return  0;
}


Тепер глянемо, що робить наша програма. Ввід даних про студентів відбувається із клавіатури, звісно це незручно, якби даних було багато краще реалізувати зчитування із файлу. Але для прикладу такий варіант буде більш зрозумілим. Всіх студентів ми зберігаємо у масиві хоча можна створити для кожного з них окрему змінну.  Крім цього STUDENT описує все, що потрібно для програми. Це якби різновид змінної J, якщо сказати у загальному.  Далі є функція для заповнення. Якщо бажаєте вдосконалити її, то можна зробити тип bool і перевіряти на те, що ввід даних коректний і взагалі відбувся. У цій функції є такий рядок:

cin.getline(ex.name, 49);

ex – це посилання на об’єкт у функції main. Але у функції ми користуємося ним як об’єктом.

name – одне із  полів структури. Кожен об’єкт характеризується полями. Звернення відбувається двома способами. В даному випадку, цей і є головним, за допомогою "." . Це якщо ми використовуємо об’єкт. Наприклад як тут:

struct Family
{
   char name[50];
   int age;
};

int main ()
{
   Family me;
   cin.getline(me.name, 40);
   me.age = 15;

   cout<< "\n" << "name: " << me.name <<endl;
   cout<< "age: " <<me.age<<endl;

   _getch();
   return  0;
}

Звернення відбувається через крапку.

Другий варіант, коли ми працюємо з вказівником. Я думаю зрозуміло чому потрібно використовувати посилання чи вказівники. Це ефективно. По-перше ми вже знаємо, що у функції створиться копія і вона не може змінити об’єкт у головній функції. Якщо призабули ось простий приклад:

int func (int b)
{
   b = 7;
   return  b;
}

int main ()
{
   int a = 5;

   cout<< "func = " <<func(a) <<endl;
   cout<< "a = " << a <<endl;

   _getch();
   return  0;
}

Результат буде таким:

Тобто змінна а не змінилася, її значення таке саме як і початкове. Це була перше проблема. По-друге, вказівник займає 4 байти, а об’єкт структури 24. Різниця у 6 разів і це багато.

Тепер спробуємо використовувати вказівники. За логікою можна зробити так:

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

struct Fam
{
   int age;
};

void iNput (Fam *b)
{
   cin>> (*b).age;
}

int main ()
{
   Fam a;

   iNput(&a);

   _getch();
   return  0;
}

 

(*b).age

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

b->age

Якщо все зрозуміло, то можете спокійно замінювати перший варіант на другий.

Я вважаю наступний код тепер теж зрозумілий. Пам’ятаємо про cin.get(), щоб ввід відбувався коректно. Замість змінної структури я створив масив і заповнював кожен його елемент через цикл. Далі знову я за допомогою циклу перевірив кількість пропусків кожного студента і вибрав тих у кого їх більше 10. Це все.

 

Практична частина

Спершу сформулюю завдання. Буде добре, якщо ви напишете програму без мене.

Отже: Нам дано дві різні години. Наше завдання правильно їх додати.

Як на прикладі.

Перші дві вводяться із клавіатури.

Let’s go!

Так, з чого складається ця структура? Години і хвилини. Нічого більше. Зрозуміло,  що знадобиться 3 об’єкти цієї структури, як c = a + b, тільки години. Залишилося написати функцію для вводу перших двох і прописати те, як слід правильно їх додавати.

Цього разу я використав вказівники замість посилань.

Ну і я трішки попрацював з тим як буде виглядати ввід. Щоб ввід виглядав так само як на прикладі я дописав перевірку переходу на новий рядок. Після якого очищення екрану, двокрапка і ввід хвилин. Загалом можете скопіювати і подивитися як це працює. Функція iNput виглядає так:

bool iNput (TIME *ex)
{
   cout<< "Enterhours: ";
   if (cin>>ex->h)
   {
      char c;
      cin.get(c);

      if (c == '\n')
      {
         system("cls");
         cout<<ex->h << " : ";
         cin>>ex->m;
      }
      return true;
   }
   return false;
}

Логічно що максимальне кількість хвилин 59. Для того, щоб правильно додати можна додати маленьку умову.



c.m = a.m + b.m;
c.h = a.h + b.h;

if (c.m> 59)
{
   c.m-=60;
   c.h++;
}

Але тут є один маленький баг. Користувач може випадково ввести неіснуючу годину, наприклад 4:84. В такому випадку програма не буде працювати правильно, це просто виправити і тему уроку полягає не у цьому. Для більшого розуміння коду я його залишив. Якщо вас це не влаштовує, просто додайте ще один if.

Весь код:

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

struct TIME
{
   int h;
   int m;
};

bool iNput (TIME *ex)
{
   cout << "Enter hours: ";
   if (cin >> ex->h)
   {
      char c;
      cin.get(c);

      if (c == '\n')
      {
         system("cls");
         cout << ex->h << " : ";
         cin >> ex->m;
      }
      return  true;
   }
   return  false;
}

int main ()
{
   TIME a;
   TIME b, c;

   if (!(iNput(&a)))
      cout << "invalid input" << endl;
   if (!(iNput(&b)))
      cout << "invalid input" << endl;

   c.m = a.m + b.m;
   c.h = a.h + b.h;

   if (c.m > 59)
   {
      c.m-=60;
      c.h++;
   }

   system ("cls");
   cout << "Sum: " << a.h << ':' << a.m << "\t" << b.h << ':' << b.m << endl;
   cout << c.h << ':' << c.m << endl;

   _getch();
   return  0;
}

 

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

Спробуйте знайти координати двох векторів на площині маючи координати їхніх точок (4 точки. Ввід з клавіатури). Крім цього визначте чи вектори лежать на одній або паралельних прямих.


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

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

Коментарі
Добавити новий
Залишити коментар
Ім`я:
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."

 

Підписка

Хто онлайн?

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

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