Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять не получаеться проверка на unsigned int! 
V
    Опции темы
Killer_13
Дата 5.5.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Здрастуйте, уже замусорил форум своим одвечным вопросом проверки на unsigned int! Но вот может в конце концов кто нить помочь, подсказать? Заранее благодарен
Так вот есть задача определения високосного года, 
функция должна возвращать значение в промежутке от щ до UINT_MAX 

Код

#include <stdio.h>
#include <limits.h>


int myUnsignedIntInput (char *s, int *i_ein); 

int main()
{
    char s[255];
    unsigned int jahr;
    int *i_ein=&jahr, fun=0;
    double d;
    
    printf("\n-------------------------------------------------\n");
    printf("Geben Sie bitte eine Jahreszahl ein!\n\n");

  do{
    fun=myUnsignedIntInput(s,i_ein); 
  }
  while(fun!=0);

  if(!((jahr%100)%4) && (jahr%100) || !(jahr%400))         
    printf("\nDas Jahr %d ist ein Schaltjahr!\n",jahr);    
  else
    printf("\nDas Jahr %d ist kein Schaltjahr!\n",jahr);
    printf("\n-------------------------------------------------\n");

    /*scanf ("%lf", &d);
    if (0 <= d && d <= UINT_MAX &&  d == floor(d)) // ob Zahl "d" Ganze Zahl ist
    printf("\nUnsigned int");  // это unsigned int
    else
    printf("\nNICHT Unsigned int");*/

return 0;
}

int myUnsignedIntInput (char *s, int *i_ein)
{

    int i,lng,z;
    unsigned int d;
    printf("\nEingabe->");
    scanf("%s",s);

    lng=strlen(s);
  if (lng-1>10){                           
    printf("Ihre Eingabe ist zu lang!\n\n");
    return 1;
  }

  for(i=0;i<lng-1;i++) {
    if(isdigit(s[i]))
      continue;
    else
      {
      printf("Bitte nur positive ganze Zahlen eingeben!\n\n");
      return 1;
      }
  }  
//
    d=atoi(s);//нужна другая функция, возвращает тип int нужен unsigned int или проверять.
if (0 <= d && d < UINT_MAX)
    *i_ein=d;
    else
 {                           
    printf("Ihre Eingabe ist zu lang!\n\n");
    return 1;
   }
//
return 0;
}



вот этот кусочек, немогу доделать и все. :(
Код

    d=atoi(s);//нужна другая функция, возвращает тип int нужен unsigned int или проверять.
if (0 <= d && d < UINT_MAX)
    *i_ein=d;
    else
 {                           
    printf("Ihre Eingabe ist zu lang!\n\n");
    return 1;
   }

нужно чтоб значение переменной d было всегда в диапазоне от 0 до UINT_MAX иначе выдать сообщение, и запросить еще раз ввести значение.
Надеюсь, что кто то подскажет как, и это будет мое последнее сообщение о unsigned int
PM MAIL   Вверх
Cheloveck
Дата 5.5.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



_atoi64 вернёт 64-битное число, младшие 32 бита - твоё unsigned int  smile 

Это сообщение отредактировал(а) Cheloveck - 5.5.2009, 21:07


--------------------
user posted image
PM Jabber   Вверх
zim22
Дата 5.5.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Cheloveck, 
Код

char *s = "-5";
unsigned int d=(unsigned int)atoi(s);
if(d > 0); // true



--------------------
PM MAIL   Вверх
Cheloveck
Дата 5.5.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



zim22,  во ты шустрый, я ступил, не успел исправить, а ты уж тут как тут)))


--------------------
user posted image
PM Jabber   Вверх
Killer_13
Дата 5.5.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Господа, а если к примеру в стринг будет введено максимальное число unsigned int - 4294967295
тогда функция atoi - неправильно отобразит заданное значение, поскольку она возвращает значение int.
если я например набираю какое то 9 значное число, оно мне не выдает ошибку, оно пишет 2147483648 не високосный год
мне же нужно, чтоб действительно проверялось и печатался мой принтф, что значение оч длинное  
PM MAIL   Вверх
Soah
Дата 5.5.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 6
Всего: 54



Killer_13, 
Цитата(Killer_13 @  5.5.2009,  21:18 Найти цитируемый пост)
тогда функция atoi - неправильно отобразит заданное значение, поскольку она возвращает значение int.

а что atol() не работает?

PM MAIL   Вверх
zim22
Дата 5.5.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Killer_13 @  5.5.2009,  21:18 Найти цитируемый пост)
оспода, а если к примеру в стринг будет введено максимальное число unsigned int - 4294967295

перед конвертированием string в unsigned int проверяйте его(string) допустимость.


--------------------
PM MAIL   Вверх
Killer_13
Дата 5.5.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



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


Почему мне выдает эту строчку 
Код

Das Jahr 2147483647 ist kein Schaltjahr!

при вводе значения 42949672956
вместо 
Код

printf("Ihre Eingabe ist zu lang!\n\n");



Цитата(zim22 @  5.5.2009,  21:30 Найти цитируемый пост)

перед конвертированием string в unsigned int проверяйте его(string) допустимость. 

А эт как? Подскажите, если поможет при решении моего вопроса. :(


Это сообщение отредактировал(а) Killer_13 - 5.5.2009, 21:43

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  11.jpg 46,41 Kb
PM MAIL   Вверх
zim22
Дата 5.5.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Killer_13 @  5.5.2009,  21:41 Найти цитируемый пост)
Почему мне выдает эту строчку 

потому что, если число не соответствует диапазону значений, то оно преобразуется так, чтобы соответствовало.


--------------------
PM MAIL   Вверх
Killer_13
Дата 5.5.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



а мне нужно чтоб выдавало мой принтф если число не соответствует. :(:(:(
PM MAIL   Вверх
zim22
Дата 5.5.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Killer_13 @  5.5.2009,  21:41 Найти цитируемый пост)
А эт как? Подскажите, если поможет при решении моего вопроса. :(

а так, что т.к. число должно быть в диапазоне [0, UINT_MAX], то следовательно на строку накладываются ограничения:
1) строка должна состоять только из цифр (буквы, знаки, символы пунктуации не допускаются)
2) размер строки должен быть не больше, чем количество десятичных разрядов числа UINT_MAX
Размер по формуле считается
Код

int number_of_digits =  log(UINT_MAX) / log(10) + 1;

3) всякие разные другие проверки.

Возможно есть способ попроще smile


--------------------
PM MAIL   Вверх
Killer_13
Дата 5.5.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



в программе это все уже учтено

здесь - длина строки не больше 10, за вашей формулой именно столько и выдалось
 
Код

lng=strlen(s);
  if (lng-1>10){                           
    printf("Ihre Eingabe ist zu lang!\n\n");
    return 1;
  }


здесь позволяет вводить только цифры 
Код

for(i=0;i<lng-1;i++) {
    if(isdigit(s[i]))
      continue;
    else
      {
      printf("Bitte nur positive ganze Zahlen eingeben!\n\n");
      return 1;
      }
  }  


А вот почему не работает, почему не печатается 
принтф из этого условия???????
вот, мой основной вопрос, и почему не проверяется диапазоном?
Код

 d=(unsigned int)atol(s);
if (0 <= d && d < UINT_MAX)
    *i_ein=d;
    else
 {                           
    printf("Ihre Eingabe ist zu lang!\n\n");
    return 1;
   }

PM MAIL   Вверх
Killer_13
Дата 5.5.2009, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



я вижу, что делаю не правильно, число d типа unsigned int проверяю в его же диапазоне.
ну а если сделать вот так.
Код

long int d;
......
 d=atol(s);
*i_ein=d;


потом в функции мейн
int *i_ein=&jahr;
......
if (0 <= jahr && jahr < UINT_MAX)
{
    printf("Goood!\n\n");
  if(!((jahr%100)%4) && (jahr%100) || !(jahr%400))         
    printf("\nDas Jahr %d ist ein Schaltjahr!\n",jahr); 
    
  else
    printf("\nDas Jahr %d ist kein Schaltjahr!\n",jahr);
}
    else       
    printf("Ihre Eingabe ist zu lang!\n\n");

почему не печатается 
Код

printf("Ihre Eingabe ist zu lang!\n\n");

а печатается
Код

Das Jahr 2147483647 ist kein Schaltjahr!


PM MAIL   Вверх
zim22
Дата 5.5.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Killer_13, держи
Код

#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <cstdio>

int main() 
{  
  char *s = "9294967295";  
  int digits_from_string = strlen(s);
  int digits_from_number = log(UINT_MAX + 0.0) / log(10.) + 1;
  
  if (digits_from_string > digits_from_number) {
    printf("Too many digits\n");
  } else if (s[0] == '-') {
    printf("Number is less, than zero\n");  
  } else {
    double s_convert = 0;
    for (int i = 0; i != digits_from_string; ++i) {
      s_convert = (s_convert * 10) + s[i] - '0';
    }
    if (s_convert > (double)UINT_MAX) {
      printf("Number is bigger, than UINT_MAX\n");
    } else {
      printf("Congrats! Number is correct!\n");

    }
  }  
  return 0;
}


Это сообщение отредактировал(а) zim22 - 6.5.2009, 07:36


--------------------
PM MAIL   Вверх
Killer_13
Дата 5.5.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



smile спасибо большое, но  __int64 - не стандартная ф-ция или?
соответственно это не проходит, нужно все стандартным вариантом делать.
А вообще будет проверяться на машинах, где стоит Solaris, и ХЗ как он отреагирует.
вот, в итоге компиляции

Код

p.c: In function `main':
p.c:17: error: `__int64' undeclared (first use in this function)
p.c:17: error: (Each undeclared identifier is reported only once
p.c:17: error: for each function it appears in.)
p.c:17: error: parse error before "s_convert"
p.c:18: error: 'for' loop initial declaration used outside C99 mode
p.c:19: error: `s_convert' undeclared (first use in this function)

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0842 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.