Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2012, 20:35   #1
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию Цикл while в C

программа должна считать, сколько цифр в введёном числе, и вроде бы пашет, но если вводиш число в котором больше 10 цифер начинает неправильно считать
Код:
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
main()
{
int N, i = 0;
printf ("Введите целое число: \n");
scanf ("%d",&N );
while(N > 0)
{
N = N / 10;
i++;
}
printf ("В этом числе %d цифер",i);
getch();
}
помогите разобраться в чём ошибка
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 28.09.2012, 20:54   #2
yurats
Пользователь
 
Регистрация: 28.09.2012
Сообщений: 20
По умолчанию

Тип переменных "int" имеет границы, при выходе за которые случаются ошибки и переполнения. Я не помню точно, но не исключено, что Вы таки за эти границы вышли, введя слишком большое число.

Возможные пути решения, в порядке возрастания сложности:
1) Не использовать очень большие числа.
2) Использовать типы данных, у которых диапазон значений больше. Например, __int64
Пример тут: http://lukianov.ru/content/ispol-zov...nt64-v-cc.html
3) Написать свой тип данных, реализующий неограниченные целые числа.
yurats вне форума Ответить с цитированием
Старый 28.09.2012, 20:58   #3
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Я думал насчёт этого, а вот нифига подобного, даже если 11 цифер, уже косяк
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 28.09.2012, 21:03   #4
yurats
Пользователь
 
Регистрация: 28.09.2012
Сообщений: 20
По умолчанию

Насчёт чего именно? Того, что int ограничен? Или насчёт использования __int64?
yurats вне форума Ответить с цитированием
Старый 28.09.2012, 21:07   #5
yurats
Пользователь
 
Регистрация: 28.09.2012
Сообщений: 20
По умолчанию

Нужно ещё не забыть правильно указать аргументы у функции scanf, когда будете раотать с __int64. Будет выглядеть так: scanf("%I64d", &N);.
yurats вне форума Ответить с цитированием
Старый 28.09.2012, 21:07   #6
yurats
Пользователь
 
Регистрация: 28.09.2012
Сообщений: 20
По умолчанию

Нужно ещё не забыть правильно указать аргументы у функции scanf, когда будете работать с __int64. Будет выглядеть так: scanf("%I64d", &N);.
yurats вне форума Ответить с цитированием
Старый 28.09.2012, 21:07   #7
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Цитата:
Сообщение от yurats Посмотреть сообщение
Того, что int ограничен?
Насчёт этого, это первое, что пришло в голову
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 28.09.2012, 21:12   #8
yurats
Пользователь
 
Регистрация: 28.09.2012
Сообщений: 20
По умолчанию

Ну так пользуйтсь __int64, если так нужны большие числа. Но это тоже ограниченный тип, просто ограничение побольше. С точки зрения алгоритма программа у Вас написана правильно.
yurats вне форума Ответить с цитированием
Старый 28.09.2012, 21:13   #9
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Попробовал с __int64, всё заработало.Спасибо.
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 28.09.2012, 21:16   #10
yurats
Пользователь
 
Регистрация: 28.09.2012
Сообщений: 20
По умолчанию

А теперь попробуйте ввести 30-значное число.

Ничего бесконечного не бывает, увы...
yurats вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл do while S@muel Общие вопросы C/C++ 1 29.03.2009 23:01
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34