Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/64: Рейтинг темы: голосов - 64, средняя оценка - 4.70
1 / 1 / 1
Регистрация: 19.09.2014
Сообщений: 36

Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного - 2

01.11.2014, 12:41. Показов 13039. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя преобразовать в число, то вывести 0.

Простите, я уже постила эту задачу. И мне ее решили. Но там все очень сложно. Все , что там было - мы не проходили в универе. Я все же надеюсь, что кто-то сможет помочь мне ее написать простым понятным кодом, иначе я просто свихнусь((((

Приложу коды, как ее делали, но(еще раз повторюсь) меня препод на части разорвет , если это увидит.


за этот код благодарю @schdub
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <stdlib.h>
 
int GetNumType(const char * p) {
    if (*p == '\0') return 0;
    int float_sep = 0;
    for (;*p; ++p) {
        if (!isdigit(*p)) {
            if (*p == '.') ++float_sep; else return 0;
        }
    }
    if (float_sep == 0) return 1;
    return ((float_sep == 1 && p[-1] != '.') ? 2 : 0);
}
 
void test(const char * num) {
    printf("%d '%s'\n", GetNumType(num), num);
}
 
int main() {
    test("1");
    test("1.0");
    test("1abc");
    test("0.0");
    test(".0");
    test("0.");
    return 0;
}
за этот спасибо @easybudda
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
 
typedef enum NUMBERTYPE { NT_NAN = 0, NT_INTEGRAL = 1, NT_REAL = 2 } numbertype_t;
 
numbertype_t test_number(const char * data) {
    long integral;
    double real;
    char * tail;
    
    errno = 0;
    integral = strtol(data, &tail, 10);
    if ( ! ( errno || *tail ) )
        return NT_INTEGRAL;
    
    errno = 0;
    real = strtod(data, &tail);
    if ( ! ( errno || *tail ) )
        return NT_REAL;
    
    return NT_NAN;
}
 
typedef char shortstring_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
 
int main(void) {
    shortstring_t str;
    
    while ( printf("Data: ") && get_string(str) ) {
        switch(test_number(str)) {
            case NT_NAN :
                printf("Not a number.\n");
                break;
            case NT_INTEGRAL :
                printf("Integral type.\n");
                break;
            case NT_REAL :
                printf("Real type.\n");
                break;
            default :
                printf("Unknown error!\n");
                break;
        }
    }
    
    return 0;
}
помогите мне, пожалуйста
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2014, 12:41
Ответы с готовыми решениями:

Дана строка. Если она представляет собой запись целого числа, то вывести 1
под словом &quot;текст&quot; понимается строка символов, слова в которой, разделены пробелами, &quot; , &quot;,&quot; . &quot;,&quot; ! ...

Дана строка. Если она представляет собой запись целого числа, то вывести 1
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если...

Если строка представляет собой запись целого числа, то вывести 1
Подскажите: дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести...

10
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.11.2014, 12:54
devochka_lena, а чем не устраивают приведенные решения?

Добавлено через 1 минуту
Цитата Сообщение от devochka_lena Посмотреть сообщение
Все , что там было - мы не проходили в универе.
А что проходили, и что можно использовать?
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
01.11.2014, 13:12
Цитата Сообщение от devochka_lena Посмотреть сообщение
простым понятным кодом
Куда уж проще?

Не по теме:

Что за студенты пошли? Хорошо хоть, это не медицинский форум.



C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
 
#define NAN  0
#define INT  1
#define REAL 2
 
int
numtype(char *s)
{
    int type;
 
    type = INT;
    for (; *s; s++)
        if (*s == '.')
            if (type == REAL)
                return NAN;
            else
                type = REAL;
        else if (*s < '0' || *s > '9')
            return NAN;
    return type;
}
 
int
main(int argc, char *argv[])
{
    int i;
 
    for (i = 1; i < argc; i++)
        printf("%d\n", numtype(argv[i]));
 
    return 0;
}
Bash
1
2
3
4
5
6
7
8
9
10
% tcc -run numtype.c 1 1.0 1abc 0.0 .0 0. 1.1.1
1
2
0
2
2
2
0
 
%
1
1 / 1 / 1
Регистрация: 19.09.2014
Сообщений: 36
01.11.2014, 13:57  [ТС]
ну например мы пишем такие коды:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int main()
{ 
  int A[10], i;
  int first, last;
  
  for (i=0; i<10; i++)
   { 
   printf(" A[%d] = ", i+1); 
   scanf(" %d", &A[i]);
   }
    
    for (i=0; i<10; i++)
    {
    if (i>0 && i<10)
    {
    first=i;
    break;  
    }   
    }
   
   for (i=first+1; i<10; i++)
   if(i>0 && i<9)
   last=i; 
 
   printf("\n First %d", first);
   printf("\n Last  %d\n\n", last);
    
   system("PAUSE");
   return 0;
}
как видите - там нет непонятных (ну для меня) операторов.

Не критикуйте меня - я ведь учу то, что преподают. И мне трудно очень разобраться в той задаче. А то что мне написали, я вообще не понимаю. поэтому не могу даже переделать под себя.

не проходили
C
1
2
3
#define NAN  0
#define INT  1
#define REAL 2
не проходили
C
1
REAL
не проходили
C
1
numtype(char *s)
вообще убило вот это
Bash
1
2
3
4
5
6
7
8
9
10
% tcc -run numtype.c 1 1.0 1abc 0.0 .0 0. 1.1.1
1
2
0
2
2
2
0
 
%
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.11.2014, 14:33
Лучший ответ Сообщение было отмечено devochka_lena как решение

Решение

Вот переделал код korvin_. Поддержки отрицательных чисел в нем разве что нет.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>
int main() {
    char str[256];
    scnaf("%s", str);
    int length = strlen(str);
    int type = 1;
    for (int i=0; i < length; ++i) {
        if (str[i] == '.') {
            if (type == 2) {
                type = 0;
                break;
            } else {
                 type = 2;
            }
        } else {
            if (str[i] < '0' || str[i] > '9') {
                type = 0;
                break;
            }
        }
    }
    printf("type = %d\n", type);
}
Цитата Сообщение от devochka_lena Посмотреть сообщение
я ведь учу то, что преподают
Если планируешь работать по специальности связанной с программированием то не нужно ограничивать себя знаниями, полученными в учебном заведении. В принципе это подходит и к любой другой специальности.
2
1 / 1 / 1
Регистрация: 19.09.2014
Сообщений: 36
01.11.2014, 17:16  [ТС]
спасибо большое!!! это уже понятно, буду разбирать))

Добавлено через 5 минут
компилятор ошибку выдает в
C
1
scnaf("%s", str);
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.11.2014, 17:31
C
1
scanf("%s", str);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
01.11.2014, 22:45
Когда дело доходит до конкретного кода, возникает вопрос о тонкостях разрешенных форматов числа.

Тот код, который был приведен korvin_ и транслирован Jewbacabra, считает пустую строку корректным представлением целого числа. Это плохо.

Строка из одной-единственной точки считается корректным представлением вещественного числа - это тоже плохо. ("Куда уж проще?", говорите?)

Строки типа '5.' и '.3' считаются корректным представлением вещественных чисел. Да, это так в языке С (например), но вот подразумевалось ли это в исходной задаче - не ясно.

А как насчет обрамления представления числа пробелами - разрешается или нет?

Добавлено через 6 минут
В том числе поэтому вместо реализации некоей "машины состояний" с единственным главным циклом я бы в таком случае все-таки предпочел распарсить все компоненты представления индивидуально

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#define NAN  0
#define INT  1
#define REAL 2
 
unsigned numtype(const char s[])
{
  const char *endw, *endf;
 
  for (endw = s; *endw != '\0'; ++endw)
    if (*endw < '0' || *endw > '9')
      break;
 
  if (endw > s && *endw == '\0')
    return INT;
 
  if (*endw != '.')
    return NAN;
 
  for (endf = endw + 1; *endf != '\0'; ++endf)
    if (*endf < '0' || *endf > '9')
      break;
 
  if (*endf != '\0')
    return NAN;
 
  if (endw > s || endf > endw + 1)
    return REAL;
 
  return NAN;
}
Добавлено через 2 часа 28 минут
При этом понятно, что '\0' тоже удовлетоворяет условию '< '0'', что позволяет нам записать циклы более компактно

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
unsigned numtype(const char s[])
{
  const char *endw, *endf;
 
  for (endw = s; *endw >= '0' && *endw <= '9'; ++endw);
 
  if (endw > s && *endw == '\0')
    return INT;
 
  if (*endw != '.')
    return NAN;
 
  for (endf = endw + 1; *endw >= '0' && *endw <= '9'; ++endf);
 
  if (*endf != '\0')
    return NAN;
 
  if (endw > s || endf > endw + 1)
    return REAL;
 
  return NAN;
}
но не хочется пугать ТС.
1
1 / 1 / 1
Регистрация: 19.09.2014
Сообщений: 36
11.11.2014, 19:33  [ТС]
Специально для тех, кто мучится так же как и я!
Ребята, я решила эту задачу.(не прошло и пол года...)

Делайте добро=)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
 
int main()
{
    char s[5], i;
    int type = 0, f = 0;
    
    printf ("\n Vvedite stroku 5 simvolov...\n");
    printf ("\n s = ");
    scanf("%s", s);
    for (i=0; i<5; i++)
    {
        if (s[i]>=48 && s[i]<=58 )
            f=f+1;
        if (f==5) 
            type = 1; 
        if (s[i]==44 || s[i]==46)
            type = 2;               
    }
              
    printf(" result = %d\n\n", type);
    system("pause");
    return 0;   
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,294
11.11.2014, 20:21
Цитата Сообщение от devochka_lena Посмотреть сообщение
Ребята, я решила эту задачу.
Это шутка?

Даже если закрыть глаза на странное требование ввести ровно 5 символов, ваше решение считает, что строки "5.3.4", "@#.&?" и ".,.,." являются записью вещественного числа. Это не говоря еще о том, что для "stroku 5 simvolov" нужен строковый массив размера как минимум 6, а не 5.

Поэтому мой вам совет: внимательно рассмотрите правильные решения выше и внимательно же разберите ошибки вашего решения.
0
1 / 1 / 1
Регистрация: 19.09.2014
Сообщений: 36
12.11.2014, 09:38  [ТС]
это не шутка. У меня только числа, буквы и точку распознает. больше и не надо для препода. При всем этом я сделала самыми простыми операторами. Если вы не студент первак, вы меня не поймете)

мне и нужно было, что бы запись, содержащую только числа определяло как целочисленную, запись с точкой - вещественную, а строку, содержащую что-то иное - как запись, которую нельзя преобразовать в число. вот и все)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2014, 09:38
Помогаю со студенческими работами здесь

Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если строку нельзя
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если...

Дана строка. Если она представляет собой запись целого числа - то вывести 1, если вещественного - вывести 2
дана строка.если она представляет собой запись целого числа то вывести 1, если вещественного вывести 2 если строку нельзя преобразовать то...

Дана строка. Если она представляет собой запись целого числа, то вывести 1, если вещественного (с дробной частью) — вывести 2
Дана строка. Если она представляет собой запись целого числа, то вывести 1, если вещественного (с дробной частью) — вывести 2; если строку...

Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2
Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2; если...

Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то вывести 2
Помогите пожалуйста! Дана строка. Если она представляет собой запись целого числа, то вывести 1; если вещественного (с дробной частью), то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru