1 Востаннє редагувалося Дмитро-Чебурашка (06.01.2016 02:56:42)

Тема: Я майже не розумію cin.get

// sayings1.cpp -- using expanded String class
// compile with string1.cpp
#include <iostream>
#include <limits>
#include "string1.h" 
const int ArSize = 10;
const int MaxLen =81;
int main()
{
    /*
        char a[256];
        char b[256];
 
        std::cout << "Enter string a: ";
        std::cin.get(a,256);            // / Прочитав рядок "Hello world"
        std::cout << "\na: " << a << "\n";  // Вивів рядок "Hello world" (більш у буфері ні чого немає, можна читати далі)
 
        std::cout << "\nEnter string b: ";
        std::cin >> b;               // Зчітав рядок "Hello world», поклав до зміннї char слово Hello та й видалив пробіл із буферу
        std::cout << "\nb: " << b << "\n";  // п  // вивів,  що лежить в змінії 
 
        int j;
        std::cin >> j;  // Ти ти намагаєшся прочитати слово world, що залишилося, в змінну типу int. Помилка! Програма закривається.
        std::cout << "j: " << j << "\n";
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');//відкинути максимальне число символів, яке може містити потік, до першого перекладу рядка включно.
        //як переконатися що потік порожній */
    
    
    using std::cout;
    using std::cin;
    using std::endl;
    String name;
    cout <<"Hi, what's your name?\n>> ";
    cin >> name;   //  Так. Перше. Ввели наме.     До речі розмір або ничого попередньо не вказували.   ..Не бачу зупинки!

    cout << name << ", please enter up to " << ArSize //  Аа, такий-то, введи... Що? Десять?? Що??
         << " short sayings <empty line to quit>:\n";
    String sayings[ArSize];     // array of objects....Не інакше як лічильник об'єктів ... масив об'єктів!!!!!
    char temp[MaxLen];          // temporary string storage
    int i;
    for (i = 0; i < ArSize; i++)
    {     //Функція int istream::get() визначена в класі istream бібліотеки <iostream> за визначенням витягає з вхідного потоку один символ і повертає його цілочисельний код.                                           
        cout << i+1 << ": ";         //Навіщо виводити я + 1 з лічильника? А Хіба ж ...   Зараз..   Ну так!
        cin.get(temp, MaxLen);  // Повинні прочести щось              ..Функція get () же стандартного потоку введення cin примушує систему чекати введення користувачем будь-якого символу
        while (cin && cin.get() != '\n')     // Попередній рядок і так читає до '\n', хіба не так?  Що, що це взагалі?     ....Вже читали, що це ще таке? Читаємо або що?
            continue;                     //Змушує передачу контролю до вираження найменшого застосування, що управляє, роблять, для, або при петлі.
        if (!cin || temp[0] == '\0')    // empty line?
            break;                    // i not incremented                 Затвердження перерви закінчує виконання найближчої додаючої петлі або умовного оператора, в якому це з'являється.
        else
            sayings[i] = temp;  // overloaded assignment
    }
    int total = i;              // total # of lines read       //  Цей цикл цілком зрозумілий! Круто!          ....Тимчасовий об'єкт засовуємо в sayings

    cout << "Here are your sayings:\n";
    for (i = 0; i < total; i++)
        cout << sayings[i][0] << ": " << sayings[i] << endl;  // Опа! Ми використовуємо його то з одним [i], то з двома [i][0]!! Ох ти..
                                    //Ну не інакше як [0] по суті покажчик на початок рядка
    int shortest = 0;
    int first = 0;
    for (i = 1; i < total; i++)
    {
        if (sayings[i].length() < sayings[shortest].length())
            shortest = i;
        if (sayings[i] < sayings[first])
            first = i;
    }
    cout << "Shortest saying:\n" << sayings[shortest] << endl;;
    cout << "First alphabetically:\n" << sayings[first] << endl;
    cout << "This program used "<< String::HowMany() 
         << " String objects. Bye.\n";

    return 0; 
}

//Я особисто ось так би прописував String sayings[ArSize][MaxLen]масив об'єктів бо інакше мені чудиться якась невідповіднисьть чи що..

//Я не можу толком зрозуміти ось цей код. Ніби то все і ясне, а ні, я дивлюся на нього і ниби то багато непоняток для мене.
//cin це об'єкт, він же потік, так? 
//while (cin && Як ми так звертаємося до об'єкту, це що, можна?

//break перериває також цикл for, той, який зовнишьний?     Бо інакше ж то смислу ніякого немає.

//Взагалі, ми ввели ось тут cin.get(temp, MaxLen); все що ввели, а що ж тоді це, while (cin && cin.get() != '\n') що? Ніби то ми узяли
//все з потоку і воно вже все в temp після цього! Ось як хочете, щось я не розумію.

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

Я не можу толком зрозуміти ось цей код. Ніби то все і ясне, а ні, я дивлюся на нього і ниби то багато непоняток для мене.
cin це об'єкт, він же потік, так?
while (cin && Як ми так звертаємося до об'єкту, це що, можна?

break перериває також цикл for, той, який зовнишьний?     Бо інакше ж то смислу ніякого немає.

Взагалі, ми ввели ось тут cin.get(temp, MaxLen); у temp все що ввели з клавіатури, а що ж тоді це, while (cin && cin.get() != '\n') що? Ніби то ми узяли
все з потоку і воно вже все в temp після цього! Ось як хочете, щось я не розумію.

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

2

Re: Я майже не розумію cin.get

Дмитро-Чебурашка написав:

cin це об'єкт, він же потік, так?

Об'єкт класу istream - тобто потік.

Дмитро-Чебурашка написав:

while (cin && Як ми так звертаємося до об'єкту, це що, можна?

Це виклик cin::operator bool - перетворення до типу bool. true, якщо остання операція введення вдала.

Дмитро-Чебурашка написав:

break перериває також цикл for, той, який зовнишьний?     Бо інакше ж то смислу ніякого немає.

break знаходиться в одному циклі - for. Який цикл він має переривати "також"?

Дмитро-Чебурашка написав:

Взагалі, ми ввели ось тут cin.get(temp, MaxLen); у temp все що ввели з клавіатури, а що ж тоді це, while (cin && cin.get() != '\n') що? Ніби то ми узяли все з потоку і воно вже все в temp після цього! Ось як хочете, щось я не розумію.

В temp читається до MaxLen символів. Цикл while - це читання решти до символу '\n' включно, щоб не сталося помилки від зайвих символів при наступному введенні.