Сейчас 19:49:08 Воскресенье, 22 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: BinGO, vladyka  
Нужна помощь по Си
SPtrueДата: Суббота, 20 Сентября 2014, 14:05:19 | Сообщение # 1
Mí alegre
Группа: Проверенные
Сообщений: 2732
Награды: 2
Репутация: 692
Блокировки:
Начал изучать си (в вузе надо), но никак не могу сделать проверку ввода.
Нужно сделать так, чтобы программа принимала только числа, можно отрицательные и дробные. Например -7,567. Но не чтобы не принимало остальной, типа "цуенра56,67,32"
Буду рад, если кто-нибудь напишет мне эту функцию. Заранее спасибо ;) нужно через scant и printf.

Добавлено (20 Сентября 2014, 14:05:19)
---------------------------------------------
*но чтобы не принимало...
Опечатался

 

BinGOДата: Суббота, 20 Сентября 2014, 17:32:41 | Сообщение # 2
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Цитата SPtrue ()
scant и printf.

Цитата SPtrue ()
scant

Цитата SPtrue ()
t

Цитата SPtrue ()
t

Цитата SPtrue ()
t

Ну это даже для меня слишком nate

А вообще, просто циклом по каждому символу проходишься. Потом проверка (if), если этот символ не цифра, не знак минуса или не запятая/точка, то пишешь что все херня давай по новой (не число); если встретил запятую - какой-нить счетчик там сделай тру, чтобы если второй раз запятая встречается (еще одно условие уже внутри первого условия) то тоже писало что все херня и это не число. И если все херня, то сразу заканчиваешь обработку и пишешь что не число.

Код
int CHECKIFANUMBER (char * s) {
        int counter = 0, i;
        for (i = 0; i < strlen(s); i++) {
         if ((s[i] >= '0' && s[i] <= '9') || s[i] == ',' || s[i] == '.' || s[i] == '-') {
          if (s[i] == '-' && i != 0) {
           printf("VSE HERNYA DAVAY PO NOVOY (minus ne v nachale)");
           return 0;
          }
          if ((s[i] == ',' || s[i] == '.') && counter == 0) {
           counter++;        
          }
          else if (s[i] == ',' || s[i] == '.') {
           printf("VSE HERNYA DAVAY PO NOVOY (2 tochki)");
           return 0;
          }
         }
         else {
          printf("VSE HERNYA DAVAY PO NOVOY (wrong symbol detected)");
          return 0;
         }
        }
         
        return 1;
}


Вот так, например.
Функция берет массив чара, то бишь строчку, и возвращает инт (0 = этот массив символов не число, 1 = это число).
Хз мб не работает, писал на коленке в блокноте. Но вроде должно.


Сообщение отредактировал BinGO - Суббота, 20 Сентября 2014, 22:00:54
 

SirNikolasДата: Суббота, 20 Сентября 2014, 20:07:38 | Сообщение # 3
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Не, не работает. Поправил:
Код
#include <stdbool.h>

bool IsFloat(const char s[ ]) {
    bool dot = false;
    int i;
    for (i = s[0] == '-'; s[i]; i++)
        if (s[i] == '.' || s[i] == ',') {
            if (dot)
                /*Две точки.*/
                return false;
            dot = true;
        } else if (s[i] < '0' || s[i] > '9')
            /*Недопустимый символ.*/
            return false;
    return true;
}
Но можно считерить и заюзать стандартную библиотеку:
Код
#include <stdbool.h>
#include <stdlib.h>

bool IsFloat(const char s[ ]) {
    char* end;
    if (!s || !*s)
        return false;
    strtod(s, &end);
    return !*end;
}
Цитата SPtrue ()
Начал изучать си (в вузе надо)
Цитата SPtrue ()
нужно через scant и printf.
Хотя подозреваю, что нужно что-то вроде
Код
int main() {
    float x;
    if (scanf("%f", &x) == 1)
        printf("%f\n", x * x);
    else
        puts("Error");
}


 

BinGOДата: Суббота, 20 Сентября 2014, 20:35:09 | Сообщение # 4
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
О, а у меня еще минус посреди числа может быть, между делом trollface А, ну и да, там надо условие в условии делать при таком подходе, я чето вообще чушь написал.
Да, так покороче код получился. Давно я ничего не кодил, совсем никак не пытался оптимизировать даже.
Цитата SirNikolas ()
Хотя подозреваю, что нужно что-то вроде

А, кстати, очень даже может быть, что это имелось в виду.
 

SirNikolasДата: Суббота, 20 Сентября 2014, 20:57:32 | Сообщение # 5
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Упс, она у меня на пустые строки true выдает, а на нулевом указателе крашится. Надо в начало функции поставить if (!s || !*s) return false;

 

BinGOДата: Суббота, 20 Сентября 2014, 21:43:40 | Сообщение # 6
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Починил немного свой код, сейчас наверное должно работать D:
 

SirNikolasДата: Суббота, 20 Сентября 2014, 21:47:08 | Сообщение # 7
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата BinGO ()
if ((s[i] == ',' || s[i] == '.') && counter == null)


И перед последним else закрывающей фигурной скобки не хватает.


 

BinGOДата: Суббота, 20 Сентября 2014, 21:57:39 | Сообщение # 8
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Цитата BinGO ()
null

Ахаха, что-то я совсем поехал lol
А скобки это да, может быть, в форме добавления ответа кодить не очень удобно, пропустить легко.

Добавлено (20 Сентября 2014, 21:57:39)
---------------------------------------------
Вроде не перед, а после него не хватает. А то получается, что сразу при первом прогоне цикла вернет единичку.

 

SirNikolasДата: Суббота, 20 Сентября 2014, 21:59:08 | Сообщение # 9
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Перед. Это скобка от if s[i] >= '0' && s[i] <= '9' || ...

 

BinGOДата: Суббота, 20 Сентября 2014, 22:03:55 | Сообщение # 10
Группа: Модераторы
Сообщений: 2906
Награды: 8
Блокировки:
Пожалуй, пора в блокнот скопировать и посмотреть D:

Добавлено (20 Сентября 2014, 22:00:16)
---------------------------------------------
Да, действительно, теперь вижу.

Добавлено (20 Сентября 2014, 22:03:55)
---------------------------------------------
Надо бы опять кодингом чего-нибудь заняться, а то совсем внимательность растерял. Нечего только кодить.

 

SPtrueДата: Пятница, 03 Октября 2014, 13:25:17 | Сообщение # 11
Mí alegre
Группа: Проверенные
Сообщений: 2732
Награды: 2
Репутация: 692
Блокировки:
Сорь, в дороге писал
Scanf офк
Спасибо за помощь, гляну ;)

Добавлено (03 Октября 2014, 13:25:17)
---------------------------------------------
В общем. Снова у меня проблема
Пытаюсь сделать функцию и передать ее в main

Но в итоге получаются лишь нули. Пробовал указатели ставить, но ничего в итоге не вышло, может неправильно расставил. Подскажите как реализовать это вообще...
Массив почему то сканом считывает, а эти числа нет



Сообщение отредактировал SPtrue - Пятница, 03 Октября 2014, 18:19:57
 

SirNikolasДата: Пятница, 03 Октября 2014, 18:54:54 | Сообщение # 12
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата SPtrue ()
Пытаюсь сделать функцию и передать ее в main
Передать функцию? Ничего похожего в коде не вижу. К тому же, в main ничего передать точно не получится. Может быть, нужно вызвать функцию из main?
Цитата SPtrue ()
mas = new int*[h];
И да, какой же это C? Это C++.
Код
#include <cstdio>

//Returns false on failure.
bool InputHW(int* h, int* w) {
     bool ok = scanf("%d%d", h, w) == 2;
     fflush(stdin);
     return ok;
}

int main() {
     int** arr;
     int h, w;
     int i;
     puts("Input height and width:");
     while (!InputHW(&h, &w))
         puts("Invalid input, try again please:");
     arr = new int*[h];
     for (i = 0; i < h; i++)
         arr[i] = new int[w];
     //...
     for (i = 0; i < h; i++)
         delete[ ] arr[i];
     delete[ ] arr;
}


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz