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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> число в строку 
:(
    Опции темы
Guest
Дата 22.5.2005, 18:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Попалась такая задача: определить является строка числом или нет с условием, первый символ строки может быть '+'.
Вот, что я смог написать. Подскажите где ошибки, заранее спасибо.

Код

#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main(){
   int i,j,y,number,dlina;
   char *temp[dlina],*cislo[dlina];
   char *a="123556";

   dlina=strlen(a);
   j=0;
   temp[dlina]=a;

        if(temp[0]=="-"){
                printf("4islo ne mozet byt otrecatel'nym\n");
                return 0;
        }
        if(!isdigit(temp[0])&&(temp[0]!="+"))
                printf("Eto ne 4islo\n");
        if(isdigit(temp[0]))
                cislo[j++]=temp[0];

        for(i=1;i<=dlina;i++){
                if(isdigit(temp[i]))
                        cislo[j++]=temp[i];
                else{
                        printf("%s Eto ne 4islo\n",a);
                        return 0;
                }
        }
        number=atoi(cislo);
        printf("number: %d\n",number);
}


  Вверх
Guest
Дата 22.5.2005, 18:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











10-я строчка лишняя(temp[dlina]=a;)

Код

#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main(){
   int i,j,y,number,dlina;
   char *temp[dlina],*cislo[dlina];
   char *a="123556";

   dlina=strlen(a);
   j=0;
         if(temp[0]=="-"){
                printf("4islo ne mozet byt otrecatel'nym\n");
                return 0;
        }
        if(!isdigit(temp[0])&&(temp[0]!="+"))
                printf("Eto ne 4islo\n");
        if(isdigit(temp[0]))
                cislo[j++]=temp[0];

        for(i=1;i<=dlina;i++){
                if(isdigit(temp[i]))
                        cislo[j++]=temp[i];
                else{
                        printf("%s Eto ne 4islo\n",a);
                        return 0;
                }
        }
        number=atoi(cislo);
        printf("number: %d\n",number);
}

  Вверх
sergejzr
Дата 22.5.2005, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



а atoi нельзя пользоваться?


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
En_t_end
Дата 22.5.2005, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



sergej.z
Вероятно это зачетная прога smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Guest
Дата 22.5.2005, 18:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











если в строке присутствует запятая или точка, то atoi откинет дробную часть..
  Вверх
sergejzr
Дата 22.5.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Ну atof smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 22.5.2005, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



я бы так решил:

Код

#include <stdio.h> //больше нафиг ничего не надо :)

bool isPsositiveNumber(char * check, char *number)
{
    if(*check=='+') //плюс ок. Берём строку со следующего символа
        check++;

        while((*check>'0'&&*check<'9')||*check=='.') //если буква число или точка, происходит копирование
        {
            *number++=*check++; //здесь копирование

        }
        
        return (*number++=*check++)==0; //копируем последний символ и проверяем, дошли ли до конца строки
}

int main()
{
    char *tst=new char[256];
    char *num="-12343546"; 

//Проверка на позитивный номер
    if(isPsositiveNumber(num,tst))
    {
        printf("%s is a number %s\n",num,tst); //Да! Распечатаем tst
    }
    else
    {
        printf("%s is NOT a number, tst not valid!!!\n",num); //Нет1! tst у нас не валидный.
    }
    return 0; //впринципе всё ок :)
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 24.5.2005, 08:53 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну а вот более простой вариант, без лишних проверок и функций. smile

Код


#include <stdio.h>
#include <stdlib.h>

int main()
{
    char string[10]= {0};
    char *substring;
    double value = 0;
    
    printf("Vvedite chislo ");
    scanf("%s", string);
    value = strtod(string, &substring);
    printf("%f", value);
    system("pause");
    return 0;
}

  Вверх
sergejzr
Дата 24.5.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Ув. Guest
во первых вы пользуетесь функцией strtod от которой мы вроде отказались,
во вторых Проверка на позитивное число отсутствует (и вообще на число)
в третьих отсутствует копирование правильного числа в строку
в четвёртых перевод в число - не нужная процедура, как видно из первого примера
в пятых Ваш пример будет примерно в 100 раз медленнее моего
в шестых(придирка smile ) хорошо написанная функция - всегда хорошо "лишних" не бывает smile


И чего в том варианте непростого? Комментары вроде тоже есть.
Ладно, напишу покороче

Код

#include <stdio.h> //больше нафиг ничего не надо :)

int main()
{
    char *number=new char[256]; //вспомогательный массив в который скопируется 
    char *result=number;//запомним указатель на ответ
    char *toCheck="+12343546"; //число которое надо проверить
    char *check=*toCheck=='+'?toCheck+1:toCheck; //плюс ок. Берём строку со следующего символа

    for(;((*check>'0'&&*check<'9')||*check=='.');*number++=*check++);//копируем пока символы валидные
    
    if(*number++=*check++)
      printf("%s is NOT a number, tst not valid!!!\n",toCheck); //Нет! toCheck у нас не валидный.
    else
      printf("%s is a number %s\n",toCheck,result); //Да! Распечатаем tst

    return 0; //впринципе всё ок :)
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
kleks
Дата 6.10.2005, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Попалась похожая задачка..., отсюда вопрос: а если в строке встречается пробел? Т.е как сделать так, что бы если я ввёл "321 321", то программа не приняла данную строчку за число!!! Заранее благодарен...
PM MAIL   Вверх
_hunter
Дата 6.10.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



проверить на наличие в строке пробелов -- strchr() ( или strstr() )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
kleks
Дата 6.10.2005, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



На сколько я понял, в вышеуказанном примере, я должен сделать буквально следующие:
Код

bool isPsositiveNumber(char * check, char *number)
{
    if(*check=='+') 
       check++;   
      char ch=' ';
        char *loc;
        loc=strchr(check,ch);
        while(*check>'0'&&*check<'9' && loc==NULL) 
        {
            *number++=*check++; 
        }
        
        return (*number++=*check++)==0; 
}

В чём ошибка?!
PM MAIL   Вверх
sergejzr
Дата 6.10.2005, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Цитата(kleks @ 6.10.2005, 17:09)
Попалась похожая задачка..., отсюда вопрос: а если в строке встречается пробел? Т.е как сделать так, что бы если я ввёл "321 321", то программа не приняла данную строчку за число!!! Заранее благодарен...

Она и так не примет.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
kleks
Дата 6.10.2005, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Действительно..., а почему тогда если в гл. программе я сам ввожу заданную строку, например так:
Код

int main()
{
    char *tst=new char[256];
    char *num=new char[100]; 
    cin>>num;
    if(isPsositiveNumber(num,tst))
    {
        printf("%s is a number %s\n",num,tst); 
    }
    else
    {
        printf("%s is NOT a number, tst not valid!!!\n",num);
    return 0; 
}

То программа принемает это число (например "546 465")!!! Подскажите пожалуйста, что не так!!!
PM MAIL   Вверх
bel_nikita
Дата 6.10.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



Усложним задачку smile строка может быть шестнадцатиричным числом smile
Добавлено @ 20:14
kleks
Цитата
Попалась похожая задачка..., отсюда вопрос: а если в строке встречается пробел? Т.е как сделать так, что бы если я ввёл "321 321", то программа не приняла данную строчку за число!!! Заранее благодарен...

Код

BOOL _isdigit(const char* p) const
{
  for ( ; *p!=NULL; ++p ) { if (!isdigit(*p)) break; }
  return !*p;
}




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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