Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
psevdomak
1 / 1 / 1
Регистрация: 11.07.2014
Сообщений: 27
#1

Найти первое число в строке, возвести его в квадрат и вывести - C++

27.11.2014, 16:13. Просмотров 623. Ответов 10
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
char str[255], slovo[100][100], *s;
    int scount = 0;                
    int n,i;
    bool found = false;
    printf ("Input str:" ); gets(str);
    
     s = strtok(str, " ");
    while(s != NULL ) 
    {
        strcpy(slovo[scount++], s); 
        s = strtok(NULL, " "); 
    }
   for(int i = 0; i < scount; i++)
    {
        s = slovo[i];
        n = strtol(slovo[i], &s, 10); 
        if(s[0] == '\0') 
        {
            printf("Pervoe chislo v kvadrate: %ld", n*n);
            found = true;
            break;
        }
    }
    if(!found) printf("Chisel net.");
    printf("\n");
Суть: Программа находит первое число, возводит его в квадрат и выводит.
Мне не понятно как работает условие if(s[0] == '\0'), и что в нем сказано?
http://www.cyberforum.ru/cpp-beginners/thread1552473.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 16:13
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Найти первое число в строке, возвести его в квадрат и вывести (C++):

Найти первое число последовательности большее, чем X, вывести порядковый номер числа и его величину
Дано число X и последовательность (1,1 + 1/2, 1+1/2+1/3...) , найти первое...

Найти первое натуральное число,квадрат которого больше n
Дано число n. Найти первое натуральное число,квадрат которого больше n ...

Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число
Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить...

Запросить целое число у пользователя, вывести его квадрат
Доброго времени суток! Народ, кому не сложно, помогите с данной задачей....

Найти первое отрицательное число в массиве, заменить его на ноль
Здравствуйте! Задача: написать функцию определения первого отрицательного...

10
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,210
27.11.2014, 16:16 #2
Цитата Сообщение от psevdomak Посмотреть сообщение
if(s[0] == '\0'), и что в нем сказано?
ищет в массиве s 0
проще говоря проверяет на конец строки
1
psevdomak
1 / 1 / 1
Регистрация: 11.07.2014
Сообщений: 27
27.11.2014, 16:23  [ТС] #3
Это ясно, но как он узнал что нужно записать именно первое найденное число, если он прошел всю строку?
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,210
27.11.2014, 17:11 #4
Лучший ответ Сообщение было отмечено psevdomak как решение

Решение

сначала бьем строку на слова
Цитата Сообщение от psevdomak Посмотреть сообщение
C++
1
2
3
4
5
while(s != NULL ) 
    {
        strcpy(slovo[scount++], s); 
        s = strtok(NULL, " "); 
    }
потом цикл по полученному массиву строк
переводим строку в число
Цитата Сообщение от psevdomak Посмотреть сообщение
C++
1
n = strtol(slovo[i], &s, 10);
s будет указывать на конец строкового представление числа
например "100предметов" будет указывать на п
а если "100" то на конец строки(0)
вот это и проверяем
Цитата Сообщение от psevdomak Посмотреть сообщение
C++
1
if(s[0] == '\0')
если это число(конец строки 0)
то возводим в квадрат и выходим из цикла
Цитата Сообщение от psevdomak Посмотреть сообщение
C++
1
break;
но программа не идеальна
не проверяется что вернула strtol
а если там нет ни одной цифры?
далее strtol работает с длинными числами
http://lord-n.narod.ru/download/book.../18/strtol.htm
да и это
Цитата Сообщение от psevdomak Посмотреть сообщение
s = slovo[i];
по моему лишнее
1
psevdomak
1 / 1 / 1
Регистрация: 11.07.2014
Сообщений: 27
28.11.2014, 09:20  [ТС] #5
Воооот! За это спасибо!

Добавлено через 15 часов 51 минуту
А на что будет указывать s если например ввести строку: Привет 2 как дела.
Тоже на конец строки 0?
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,210
28.11.2014, 11:06 #6
Цитата Сообщение от psevdomak Посмотреть сообщение
А на что будет указывать s если например ввести строку: Привет 2 как дела.
Разбивается на 4 слова
Привет
2
как
дела
во втором слове (2) будет указывать на конец строки
возьми отладчик, пройди по шагам, и все вопросы отпадут
1
psevdomak
1 / 1 / 1
Регистрация: 11.07.2014
Сообщений: 27
28.11.2014, 11:38  [ТС] #7
Так у нас же strtok разбила строку на слова, вставляя \0, получается что после каждого слова есть конец строки
slovo[0]=Привет\0
slovo[1]=2\0
slovo[2]=как\0
slovo[3]=дела\0
мне непонятно как работает условие, а точнее s[0] почему 0? типа конец строки?
з.ы отладчиком прогонял уже, все равно не могу понять...
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,210
28.11.2014, 13:08 #8
Цитата Сообщение от psevdomak Посмотреть сообщение
Так у нас же strtok разбила строку на слова, вставляя \0, получается что после каждого слова есть конец строки
да
получился массив строк
Цитата Сообщение от psevdomak Посмотреть сообщение
slovo[100][100]
в каждом элементе отдельная строка которая состоит из одного слова
Цитата Сообщение от psevdomak Посмотреть сообщение
slovo[0]=Привет\0
slovo[1]=2\0
slovo[2]=как\0
slovo[3]=дела\0
все правильно
slovo[1] это строка которая содержит одно слово "2"
1
psevdomak
1 / 1 / 1
Регистрация: 11.07.2014
Сообщений: 27
28.11.2014, 15:56  [ТС] #9
И так как же определяем что после 2 нам нужно перейти к условию, что бы вывести число? Скорее вопрос в самом условии if(s[0] == '\0') какое значение будет у нас в s[0] и почему именно s[0] почему не s[1]?
0
ValeryS
Модератор
7124 / 5392 / 669
Регистрация: 14.02.2011
Сообщений: 18,210
28.11.2014, 16:21 #10
Лучший ответ Сообщение было отмечено psevdomak как решение

Решение

Цитата Сообщение от psevdomak Посмотреть сообщение
у нас в s[0] и почему именно s[0]
ты ссылку читал?
s будет указывать на конец строки если strtol отработает нормально
если не нормально то будет указывать куда угодно только не на конц строки
Цитата Сообщение от psevdomak Посмотреть сообщение
почему именно s[0] почему не s[1]
прочитай, что такое указатели, что такое массивы и что такое адресная арифметика
s[0] это синоним *(s+0) или *s
а s[1] это *(s+1)
представляю сколько было бы удивления если было бы написано 0[s](это синоним s[0] )
1
psevdomak
1 / 1 / 1
Регистрация: 11.07.2014
Сообщений: 27
28.11.2014, 16:37  [ТС] #11
Вот что я и хотел узнать, спасибо!
0
28.11.2014, 16:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 16:37
Привет! Вот еще темы с решениями:

Дано действительно число а.Найти среди чисел 1, 1*1/2, 1*/1/2+1/3, ... первое число, большее а, и его номер в последовательности чисел.
Прошу помочь решить задачки!:(очень нужно (Билет №2) Дано действительно...

Быстро возвести в квадрат число заданной длины (<16 байт)
Нужно быстро возвести в квадрат число заданной длины (&lt;16 байт). Лучшее, что я...

Если квадрат числа меньше 100, напечатать число и его квадрат
Ввести с клавиатуры 10 чисел. Если квадрат числа меньше 100, напечатать число и...

В каждой строке матрицы найти и вывести минимальный элемент и его номер в строке
/*Дана матрица А. В каждой строке матрицы найти и вывести минимальный элемент...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru