Модераторы: 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   Вверх
kleks
Дата 6.10.2005, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(bel_nikita @ 6.10.2005, 20:10)
Код

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


Извините, но я не совсем понял, как это функция работает, я пытался её использовать, но результат всё равно тот же!!! могли объяснить?!
PM MAIL   Вверх
Void
Дата 6.10.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



Цитата(sergej @ 24.5.2005, 15:15)
    for(;((*check>'0'&&*check<'9')||*check=='.');*number++=*check++);

А что, "1234....4324...12" у нас теперь нормальное действительное число? smile
Код

bool is_number(const char *s) {
    if (*s == '+')
        ++s;
    if (!isdigit(*s))
        return false;
    while (isdigit(*s))
        s++;
    if (*s == '.')
        s++;
    while (isdigit(*s))
        s++;
    return !*s;    
}



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
bel_nikita
Дата 6.10.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



kleks
Цитата
Извините, но я не совсем понял, как это функция работает, я пытался её использовать, но результат всё равно тот же!!! могли объяснить?!

Код

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

using namespace std;

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

int main(int argc, char* argv[])
{
    printf("Hello World!\n");
  
  char *tst=new char[256];
  char num[100]={0}; 

  cin.getline(num,sizeof(num));

  if( _isdigit(num) )
  {
    printf("%s is a number %s\n",num); 
  }
  else
  {
    printf("%s is NOT a number, tst not valid!!!\n",num);
  }
  return 0; 
}

_isdigit(const char* p) - берет каждый символ и проверяет его: цифра или нет. Если нет, то возвращаем false


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Helicopterr
Дата 6.10.2005, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



возник обратный вопрос - как значение переменной int i поместить в char massive [n]?


--------------------
people can fly
PM MAIL   Вверх
bel_nikita
Дата 6.10.2005, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

int n  = 100;
int i = 123;

char massive [n];
sprintf(massive,"i=%d",i);



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 6.10.2005, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(Void @ 6.10.2005, 19:48)
что, "1234....4324...12" у нас теперь нормальное действительное число?

Ну да, надо прибить.
Код

int cnt=0;
for(;((*check>'0'&&*check<'9')||(*check=='.'&&!cnt++));*number++=*check++);//копируем пока символы валидные


Товарищи в задаче strtod, strtof, isdigit - функции библиотек, а ими пользоваться нельзя в этом случае иначе любую задачу X можно было бы решить:

#include <library_for_solving_X>
cout<<solve(X);

Ну а если пользоваться можно всем, то почему не strtod?


Цитата(kleks @ 6.10.2005, 19:09)
Действительно..., а почему тогда если в гл. программе я сам ввожу заданную строку, например так:

Это не функции проблема, а cin он пробелом разбивает на два числа. cin как то настраивается, но я сейчас не знаю таких тонкостей, на Си давно не прогал.
Добавлено @ 23:12
А, вот! cin.getline(num, длинна_num, '\n') поможет smile


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


Опытный
**


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

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



Цитата(bel_nikita @ 6.10.2005, 23:08)
Код

int n  = 100;
int i = 123;

char massive [n];
sprintf(massive,"i=%d",i);

ой я имел ввиду поместить на место n-го элемента с сохранением остальных. ( __int8 т.е. 0-9)


--------------------
people can fly
PM MAIL   Вверх
sergejzr
Дата 6.10.2005, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Вот пока полное решение:
Код

#include <iostream.h>//Только либа для ввода/ввывода
bool isPsositiveNumber(char * toCheck)
{
    char num[256]; //вспомогательный массив в который скопируется 
    char *number=num;
    char *result=number;//запомним указатель на ответ
    char *check=*toCheck=='+'?toCheck+1:toCheck; //плюс ок. Берём строку со следующего символа
    int cnt=0;
    for(;((*check>'0'&&*check<'9')||(*check=='.'&&!cnt++));*number++=*check++);//копируем пока символы валидные
    
    return (*number++=*check++)==0;
   
}
int main()
{
    int str_length=100;
        char *num=new char[str_length]; 
    while (true)
    {
         cin.getline(num,str_length,'\n');
     cout<<num<<" is "<<(isPsositiveNumber(num)?"":"NOT ")<<"a number"<<endl;
    }
    return 0; 
}

Добавлено @ 23:24
Цитата(Helicopterr @ 6.10.2005, 22:16)
ой я имел ввиду поместить на место n-го элемента с сохранением остальных. ( __int8 т.е. 0-9)


Код

#include <iostream.h>

int main()
{
    char number[256];
    cin.getline(number,256,'\n');//читаем число
    int insert=8;
    number[8]=insert+'0'; //теперь на восьмом месте восьмёрка
        return 0; 
}



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


Эксперт
****


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

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



sergej.z
Цитата
Товарищи в задаче strtod, strtof, isdigit - функции библиотек, а ими пользоваться нельзя в этом случае иначе любую задачу X можно было бы решить
Как это нельзя? smile Это стандартные либы! И их нужно пользовать


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 6.10.2005, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Цитата(bel_nikita @ 6.10.2005, 22:25)
Как это нельзя? smile Это стандартные либы! И их нужно пользовать

Тогда смысл задания пропадает. потому что ответ={char *x="1234.44"; strtod((x),&x);}


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


^аВаТаР^ сообщение>>
****


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

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



Хоть библиотеками пользоваться нельзя, но вот еще один метод(может string'ами можно). не претендует на скорость.
Код

bool isPositiveNumber(const char* n)
{
  return  strspn(n,"0123456789.+") == strlen(n)    //строка состоит только из цифр плюса и точки
                          && (*n == '+' || strchr(n, '+') == NULL ) //плюс либо в начале, либо его нет
                          && (strchr(n, '.') == strrchr(n,'.'))  //точка либо одна, либо её нет
}

smile (шучу конечно)

оффтоп отсюда
зы. а вообще запрещать юзать стд либы это неправильно. Это всё равно что учить изобретать велосипед - зачем? От этого никому легче не становится

Это сообщение отредактировал(а) Mayk - 6.10.2005, 23:37


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 6.10.2005, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



Скажем так, ... неинтересно smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0978 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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