Skip to content

theory with the necessary samples for performing laboratory work 5 (assembling materials)

Notifications You must be signed in to change notification settings

Ms1black/cstring-lecture

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 

Repository files navigation

Строки в С++

Внимание, анекдот!

— Вводите все через массивы char, никаких string.

— Почему?

— Потому что string — это для счастливых людей, а мы в МГТУ.

Текстовые строки в С++ могут быть реализованы в одном из двух видов:

  • первый предполагает, что мы студенты МГТУ и строка определяется как символьный массив, который завершается нулевым символом ( '\0')
  • второй является частью библиотеки классов => не встроенный тип <=> херня, переделывай

Чтение наших строк с клавиатуры


$${\color{red}ЗАПРЕЩАЮ}$$ $${\color{green}РАЗРЕШАЮ}$$✔️
#include <iostream>
          
int main()
{
char str[80];
          
std::cin >> str;
          
std::cout << str;
          
return 0;
}
#include <iostream>
          
int main()
{
char str[80];
          
std::cin.getline(str, 80);
          
std::cout << str;
          
return 0;
}

Почему так? В варианте слева программа формально корректна, НО оператор >> прекращает считывание строки, как только встречает символ пробела,табуляции, новой строки

А во втором примере cin.getline() позволяет считывать строки, включая пробелы. Если формально описывать ее функционал, то она извлекает данные из входного потока до строкового разделителя, который не записывается в получившийся массив данных.


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


Функция Заголовок Описание Пример использования
strcpy(s1,s2) <cstring> Копирование строки s2 в строку s1 взглянуть 🔞
strcat(s1,s2) <cstring> Строка s2 присоединяется к строке s1 взглянуть 🔞
strcmp(s1,s2) <cstring> Сравнение строк s1 и s2: если строки равны, возвращается значение 0 взглянуть 🔞
strchr(s1,ch) <cstring> Указатель на первую позицию символа ch в строке s взглянуть 🔞
strlen(s) <cstring> Возвращает длину строки, указанной аргументом s взглянуть 🔞
atoi(s) <cstdlib> Преобразование состоящей из цифр строки s в целое число типа int взглянуть 🔞
atol(s) <cstdlib> Преобразование состоящей из цифр строки s в целое число типа long взглянуть 🔞
atof(s) <cstdlib> Преобразование состоящей из цифр строки s в целое число типа double взглянуть 🔞
tolower(ch) <cctype> Преобразование буквенного символа ch к строчному формату взглянуть 🔞
toupper(ch) <cctype> Преобразование буквенного символа ch к прописному формату взглянуть 🔞

Попробуем задачу щелкнуть либо она решается, либо я начинаю истерить


I Осознание

Прочитаем условие:

изображение

Какие данные?
на вход получаем "пример в строке", а вывести должны сумму

Пример:

Вводим в консоль 1+2+3=

Выводим: 6

В чем прикол задачи?
прикол в том, что вводим мы символы, а их надо преобразовать в int и выполнить указанное арифметическое действие.

II Решение

Сначала идея была такова

Но это в моменте показалось бредовым, ведь есть метод проще - а именно, пробегаться по массиву, но через элемент(по числам), сделав шаг не i++ а i+=2, и брать литер от a[i-1] элемента(чтобы не выйти за пределы массива). Вот кратенько по пунктам:

III Кодинг

  1. Подлючаю заголовочные:
#include <iostream>

Я пробовала сделать с помощью atoi, но там много вылезло заморочек

  1. Пишем ввод:
char input[100]; 
std::cin.getline(input, 100); 

Ну в вводе - ничего особенного.

  1. Вот тут и начался прикол

Как я сказала выше, atoi оказался не дружелюбным, поэтому благодарим https://qna.habr.com/q/1090394
Почему так? Да потому)
В плюсах можно просто вычесть символ '0' из символа цифры, чтобы получить его целое значение.
Например: '3' - '0' даст число 3

int result = input[0] - '0';

Тут мы сохранили первое число, чтобы дальше уже работать с циклом и не выйти за пределы строки слева.

  1. Пишем цикл

Так как у нас уже записано первое число, то в процессе было решено, сначала определить знак, а след. символом число.
то есть теперь наш алгоритм выглядит так:

вот код этого алгоритма, на пальцах:
   for (int i = 1; input[i] != '='; i += 2) { // Шагаем через два элемента
        int nextNumber = input[i + 1] - '0'; // Преобразуем следующую цифру в число

        if (input[i] == '+') { // Если знак плюса, прибавляем
            result += nextNumber; 
        }
        else if (input[i] == '-') { // Если знак минуса, вычитаем
            result -= nextNumber; 
        }
    }
  1. Готовая программка
include <iostream>

int main() {
    char input[100];
    std::cin.getline(input, 100); 

    int result = input[0] - '0'; 

    for (int i = 1; input[i] != '='; i += 2) { 
        int nextNumber = input[i + 1] - '0'; 

        if (input[i] == '+') {
            result += nextNumber; 
        }
        else if (input[i] == '-') {
            result -= nextNumber; 
        }
    }

    std::cout << "Сумма: " << result << std::endl; 
    return 0;
}

bdd7770cd828942e152bec5b71265245

About

theory with the necessary samples for performing laboratory work 5 (assembling materials)

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published