Лабораторная работа 8. Указатели и строки в стиле С
Для решения задач использовать строки в стиле С (null-terminated byte
strings) и функции по работе со сроками из заголовочного файла
https://en.cppreference.com/w/cpp/header/cstring
Для считывания строк использовать метод getline или функцию gets_s сейчас дам задания
Отлично! Я готов помочь с лабораторной работой по указателям и строкам в стиле C. Пожалуйста, предоставьте задания, и мы сможем обсудить, как их решить, используя функции из заголовочного файла <cstring>
и методы для работы со строками.
Задачи
- Создать статический массив из 10 элементов и проинциализировать
его произвольными целыми числами. Используя обращение к
элементам массива по указателю (вместо array[i] использовать
*(array + i)), вывести на экран все четные элементы массива и их
адреса (значения самих указателей). - Получить от пользователя строку текста, подсчитать количество
символов в тексте и вывести полученное значение на экран.
Повторять до тех пор, пока не встретится строка «quit». - Получить от пользователя строку текста и подсчитать количество
точек в строке. Повторять до тех пор, пока не встретится строка «quit». - Получить от пользователя строку текста и найти самое длинное слово
текста. Повторять до тех пор, пока не встретится строка «quit». - Получить от пользователя строку текста и определить, содержит ли
строка хотя бы пару соседних одинаковых слов. Повторять до тех пор,
пока не встретится строка «quit». - Получить от пользователя строку текста и поменять местами первое и
последнее слова в строке. Повторять до тех пор, пока не встретится
строка «quit».
Давайте разберем каждую задачу по отдельности и предложим возможные решения. Я буду использовать указатели и функции работы со строками из заголовка <cstring>
.
Задача 1
Создать статический массив из 10 элементов и проинициализировать его произвольными целыми числами. Вывести на экран все четные элементы массива и их адреса.
Шаги:
- Создать массив из 10 целых чисел.
- Инициализировать массив произвольными значениями.
- Использовать указатели для перебора массива.
- Проверить, является ли элемент четным, и если да, вывести его значение и адрес.
Код:
#include <stdio.h>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *ptr = array;
for (int i = 0; i < 10; i++) {
if (*(ptr + i) % 2 == 0) {
printf("Четное число: %d, адрес: %p\n", *(ptr + i), (ptr + i));
}
}
return 0;
}
Задача 2
Получить от пользователя строку текста, подсчитать количество символов и вывести значение на экран. Повторять до «quit».
Шаги:
- Использовать
getline
для считывания строки. - Подсчитать количество символов в строке.
- Проверить, не введена ли строка «quit».
Код:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
while (1) {
printf("Введите строку (или 'quit' для выхода): ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0; // Удаление символа новой строки
if (strcmp(str, "quit") == 0) {
break;
}
printf("Количество символов: %zu\n", strlen(str));
}
return 0;
}
Задача 3
Подсчитать количество точек в строке. Повторять до «quit».
Шаги:
- Считывать строку от пользователя.
- Подсчитать количество точек в строке.
- Проверить, не введена ли строка «quit».
Код:
#include <stdio.h>
int main() {
char str[100];
while (1) {
printf("Введите строку (или 'quit' для выхода): ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0;
if (strcmp(str, "quit") == 0) {
break;
}
int count = 0;
for (char *ptr = str; *ptr != '#include <stdio.h>
int main() {
char str[100];
while (1) {
printf("Введите строку (или 'quit' для выхода): ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0;
if (strcmp(str, "quit") == 0) {
break;
}
int count = 0;
for (char *ptr = str; *ptr != '\0'; ptr++) {
if (*ptr == '.') {
count++;
}
}
printf("Количество точек: %d\n", count);
}
return 0;
}
'; ptr++) {
if (*ptr == '.') {
count++;
}
}
printf("Количество точек: %d\n", count);
}
return 0;
}
Задача 4
Найти самое длинное слово в строке. Повторять до «quit».
Шаги:
- Считывать строку от пользователя.
- Разбить строку на слова, используя пробел как разделитель.
- Сравнить длину найденных слов и сохранить самое длинное.
Код:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
char str[100];
while (1) {
printf("Введите строку (или 'quit' для выхода): ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0;
if (strcmp(str, "quit") == 0) {
break;
}
char *longest_word = NULL;
int max_length = 0;
char *token = strtok(str, " ");
while (token != NULL) {
int length = strlen(token);
if (length > max_length) {
max_length = length;
longest_word = token;
}
token = strtok(NULL, " ");
}
if (longest_word != NULL) {
printf("Самое длинное слово: %s\n", longest_word);
}
}
return 0;
}
Задача 5
Определить, содержит ли строка пару соседних одинаковых слов. Повторять до «quit».
Шаги:
- Считывать строку от пользователя.
- Разбить строку на слова.
- Проверить соседние слова на равенство.
Код:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
while (1) {
printf("Введите строку (или 'quit' для выхода): ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0;
if (strcmp(str, "quit") == 0) {
break;
}
char *prev_word = NULL;
int has_duplicates = 0;
char *token = strtok(str, " ");
while (token != NULL) {
if (prev_word != NULL && strcmp(prev_word, token) == 0) {
has_duplicates = 1;
break;
}
prev_word = token;
token = strtok(NULL, " ");
}
printf(has_duplicates ? "Содержит соседние одинаковые слова.\n" : "Не содержит соседних одинаковых слов.\n");
}
return 0;
}
Задача 6
Поменять местами первое и последнее слова в строке. Повторять до «quit».
Шаги:
- Считывать строку от пользователя.
- Найти первое и последнее слово.
- Поменять их местами.
Код:
#include <stdio.h>
#include <string.h>
int main() {
char str[100];
while (1) {
printf("Введите строку (или 'quit' для выхода): ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = 0;
if (strcmp(str, "quit") == 0) {
break;
}
char *first_word = strtok(str, " ");
char *last_word = NULL;
char *token = NULL;
while ((token = strtok(NULL, " ")) != NULL) {
last_word = token;
}
if (last_word != NULL) {
printf("Измененная строка: %s %s\n", last_word, first_word);
}
}
return 0;
}
Заключение
Я представил решение для всех шести задач, используя указатели и функции работы со строками. Если у вас есть какие-либо вопросы или нужны уточнения по коду, дайте знать!
а можешь вывод делать ввод и вывод с помощью #include
Конечно! Давайте адаптируем каждый из предложенных решений, чтобы использовать #include <iostream>
и стандартные потоки ввода-вывода cin
и cout
. Вот обновленные версии кода для каждой задачи:
Задача 1
Создать статический массив из 10 элементов и проинициализировать его произвольными целыми числами. Вывести на экран все четные элементы массива и их адреса.
Код:
#include <iostream>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *ptr = array;
for (int i = 0; i < 10; i++) {
if (*(ptr + i) % 2 == 0) {
std::cout << "Четное число: " << *(ptr + i) << ", адрес: " << (ptr + i) << std::endl;
}
}
return 0;
}
Задача 2
Получить от пользователя строку текста, подсчитать количество символов и вывести значение на экран. Повторять до «quit».
Код:
#include <iostream>
#include <string>
int main() {
std::string str;
while (true) {
std::cout << "Введите строку (или 'quit' для выхода): ";
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::cout << "Количество символов: " << str.length() << std::endl;
}
return 0;
}
Задача 3
Подсчитать количество точек в строке. Повторять до «quit».
Код:
#include <iostream>
#include <string>
int main() {
std::string str;
while (true) {
std::cout << "Введите строку (или 'quit' для выхода): ";
std::getline(std::cin, str);
if (str == "quit") {
break;
}
int count = 0;
for (char ch : str) {
if (ch == '.') {
count++;
}
}
std::cout << "Количество точек: " << count << std::endl;
}
return 0;
}
Задача 4
Найти самое длинное слово в строке. Повторять до «quit».
Код:
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str;
while (true) {
std::cout << "Введите строку (или 'quit' для выхода): ";
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string word, longest_word;
size_t max_length = 0;
while (iss >> word) {
if (word.length() > max_length) {
max_length = word.length();
longest_word = word;
}
}
std::cout << "Самое длинное слово: " << longest_word << std::endl;
}
return 0;
}
Задача 5
Определить, содержит ли строка пару соседних одинаковых слов. Повторять до «quit».
Код:
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str;
while (true) {
std::cout << "Введите строку (или 'quit' для выхода): ";
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string word, prev_word;
bool has_duplicates = false;
while (iss >> word) {
if (word == prev_word) {
has_duplicates = true;
break;
}
prev_word = word;
}
std::cout << (has_duplicates ? "Содержит соседние одинаковые слова." : "Не содержит соседних одинаковых слов.") << std::endl;
}
return 0;
}
Задача 6
Поменять местами первое и последнее слова в строке. Повторять до «quit».
Код:
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str;
while (true) {
std::cout << "Введите строку (или 'quit' для выхода): ";
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string first_word, last_word;
std::string word;
bool first_word_set = false;
while (iss >> word) {
if (!first_word_set) {
first_word = word;
first_word_set = true;
}
last_word = word; // Последнее слово будет обновляться на каждом шаге
}
if (first_word_set) {
std::cout << "Измененная строка: " << last_word << " " << first_word << std::endl;
}
}
return 0;
}
Заключение
Теперь все задачи используют iostream
для ввода и вывода данных. Если у вас есть дополнительные вопросы или предложения по улучшению кода, дайте знать!
а можешь еще не выводить подсказки типа “введите строку “
Конечно! Вот обновленные версии кода для каждой задачи без подсказок при вводе строки.
Задача 1
#include <iostream>
int main() {
int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *ptr = array;
for (int i = 0; i < 10; i++) {
if (*(ptr + i) % 2 == 0) {
std::cout << *(ptr + i) << " " << (ptr + i) << std::endl;
}
}
return 0;
}
Задача 2
#include <iostream>
#include <string>
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::cout << str.length() << std::endl;
}
return 0;
}
Задача 3
#include <iostream>
#include <string>
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
int count = 0;
for (char ch : str) {
if (ch == '.') {
count++;
}
}
std::cout << count << std::endl;
}
return 0;
}
Задача 4
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string word, longest_word;
size_t max_length = 0;
while (iss >> word) {
if (word.length() > max_length) {
max_length = word.length();
longest_word = word;
}
}
std::cout << longest_word << std::endl;
}
return 0;
}
Задача 5
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string word, prev_word;
bool has_duplicates = false;
while (iss >> word) {
if (word == prev_word) {
has_duplicates = true;
break;
}
prev_word = word;
}
std::cout << (has_duplicates ? "Yes" : "No") << std::endl;
}
return 0;
}
Задача 6
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string first_word, last_word;
std::string word;
bool first_word_set = false;
while (iss >> word) {
if (!first_word_set) {
first_word = word;
first_word_set = true;
}
last_word = word; // Последнее слово будет обновляться на каждом шаге
}
if (first_word_set) {
std::cout << last_word << " " << first_word << std::endl;
}
}
return 0;
}
Теперь все версии кода не содержат подсказок и просто ожидают ввода строки от пользователя. Если есть дополнительные пожелания или вопросы, дайте знать!
а почему не работает
#include
#include <stdio.h>
#include
#include
int main() {
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr = array;
for (int i = 0; i < 10; i++) {
if (*(ptr + i) % 2 == 0) {
std::cout << *(ptr + i) << (ptr + i) << std::endl;
}
}
return 0;
}
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::cout << str.length() << std::endl;
}
return 0;
}
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
int count = 0;
for (char ch : str) {
if (ch == '.') {
count++;
}
}
std::cout << count << std::endl;
}
return 0;
}
int main() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string word, longest_word;
size_t max_length = 0;
while (iss >> word) {
if (word.length() > max_length) {
max_length = word.length();
longest_word = word;
}
}
std::cout << longest_word << std::endl;
}
return 0;
}
В вашем коде есть несколько проблем, которые мешают ему компилироваться и работать корректно. Основные ошибки заключаются в том, что вы определяете несколько функций main()
в одном файле, что недопустимо в C++. В C++ может быть только одна функция main()
, которая является точкой входа в программу.
Вот как можно организовать код, чтобы все задачи работали последовательно в одной программе:
#include <iostream>
#include <string>
#include <sstream>
void task1() {
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr = array;
for (int i = 0; i < 10; i++) {
if (*(ptr + i) % 2 == 0) {
std::cout << *(ptr + i) << " " << (ptr + i) << std::endl;
}
}
}
void task2() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::cout << str.length() << std::endl;
}
}
void task3() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
int count = 0;
for (char ch : str) {
if (ch == '.') {
count++;
}
}
std::cout << count << std::endl;
}
}
void task4() {
std::string str;
while (true) {
std::getline(std::cin, str);
if (str == "quit") {
break;
}
std::istringstream iss(str);
std::string word, longest_word;
size_t max_length = 0;
while (iss >> word) {
if (word.length() > max_length) {
max_length = word.length();
longest_word = word;
}
}
std::cout << longest_word << std::endl;
}
}
int main() {
// Вызовите нужную задачу, например:
task1(); // Задача 1
task2(); // Задача 2
task3(); // Задача 3
task4(); // Задача 4
return 0;
}
Что изменилось:
-
Функции для задач: Каждая задача теперь оформлена как отдельная функция, что позволяет избежать повторного определения
main()
и сделать код более организованным. -
Вызов задач в
main()
: В функцииmain()
вы можете вызывать любую задачу, которую хотите протестировать.
Теперь вы можете компилировать и запускать этот код, и он будет работать корректно. Вы можете изменять порядок вызова функций в main()
или добавлять условные операторы для выбора, какую задачу выполнять.
#chats