— Вводите все через массивы char, никаких string.
— Почему?
— Потому что string — это для счастливых людей, а мы в МГТУ.
Текстовые строки в С++ могут быть реализованы в одном из двух видов:
- первый предполагает, что мы студенты МГТУ и строка определяется как символьный массив, который завершается нулевым символом ( '\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 к прописному формату | взглянуть 🔞 |
Пример:
Вводим в консоль
1+2+3=
Выводим:
6
Сначала идея была такова
Но это в моменте показалось бредовым, ведь есть метод проще - а именно, пробегаться по массиву, но через элемент(по числам), сделав шаг не i++
а i+=2
, и брать литер от a[i-1]
элемента(чтобы не выйти за пределы массива).
Вот кратенько по пунктам:
- Подлючаю заголовочные:
#include <iostream>
Я пробовала сделать с помощью atoi, но там много вылезло заморочек
- Пишем ввод:
char input[100];
std::cin.getline(input, 100);
Ну в вводе - ничего особенного.
- Вот тут и начался прикол
Как я сказала выше, atoi оказался не дружелюбным, поэтому благодарим https://qna.habr.com/q/1090394
Почему так? Да потому)
В плюсах можно просто вычесть символ '0'
из символа цифры, чтобы получить его целое значение.
Например: '3' - '0'
даст число 3
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;
}
}
- Готовая программка
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;
}