Определение целого числа или дробного в C

CCBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) мы напишем программу на языке C, которая определяет, является ли введенное пользователем число целым или дробным. Это фундаментальное понятие в программировании, где различные типы данных имеют разные требования к памяти и поведение.

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

По завершении этой лабораторной работы вы научитесь:

  • Читать пользовательский ввод в виде строки на языке C
  • Проверять строку на наличие определенных символов
  • Использовать условную логику для принятия решений на основе входных данных

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/FileHandlingGroup(["File Handling"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/BasicsGroup -.-> c/operators("Operators") c/ControlFlowGroup -.-> c/if_else("If...Else") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/ControlFlowGroup -.-> c/while_loop("While Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/FileHandlingGroup -.-> c/create_files("Create Files") c/UserInteractionGroup -.-> c/user_input("User Input") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/variables -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/operators -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/if_else -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/for_loop -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/while_loop -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/arrays -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/create_files -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/user_input -.-> lab-123267{{"Определение целого числа или дробного в C"}} c/output -.-> lab-123267{{"Определение целого числа или дробного в C"}} end

Создание и открытие файла программы на языке C

Начнем с создания нового файла на языке C для нашей программы. Назовем его main.c и поместим в директорию проекта.

  1. Сначала убедитесь, что вы находитесь в директории проекта:
cd ~/project
  1. Теперь в WebIDE нажмите на меню "File", выберите "New File" и назовите его main.c. В качестве альтернативы вы можете использовать значок "New File" в боковой панели проводника файлов.

  2. Редактор файла откроется автоматически. Добавим в нашу программу необходимые заголовочные файлы:

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

Эти заголовочные файлы являются обязательными для нашей программы:

  • stdio.h предоставляет функции для стандартных операций ввода и вывода, таких как printf() и scanf().
  • string.h предоставляет функции для манипуляции строками, хотя в этой простой программе мы в основном будем использовать его для вычисления длины строки.

Обратите внимание, что мы не включили conio.h, как было указано в исходном шаблоне. Это связано с тем, что conio.h не является стандартной библиотекой C и недоступна на многих системах, в том числе в нашей среде Ubuntu.

Добавление основной функции и объявление переменных

Теперь, когда у нас есть заголовочные файлы, добавим функцию main() и объявим переменные, необходимые для нашей программы.

Добавьте следующий код в файл main.c:

int main() {
    char number[20];  // Array to store the input number as a string
    int flag = 0;     // Flag to track if a decimal point is found (0 = not found, 1 = found)
    int i;            // Loop counter variable

    // Program will continue here...

    return 0;
}

Понять эти переменные можно следующим образом:

  • number[20]: Это символьный массив (строка), в котором будет храниться ввод пользователя. Мы увеличили размер до 20 символов, чтобы вместить более большие числа.
  • flag: Эта целочисленная переменная будет действовать как булево флаг. Если мы найдем десятичную точку во входных данных, мы установим ее в значение 1.
  • i: Простая счетчик переменная для нашего цикла.

Функция main() является точкой входа в нашу программу на языке C. Вся написанная нами программа будет находиться внутри этой функции. Инструкция return 0 в конце указывает, что программа успешно выполнилась.

Теперь ваш файл должен выглядеть следующим образом:

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

int main() {
    char number[20];  // Array to store the input number as a string
    int flag = 0;     // Flag to track if a decimal point is found (0 = not found, 1 = found)
    int i;            // Loop counter variable

    // Program will continue here...

    return 0;
}

Реализация логики программы

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

Замените комментарий "Program will continue here..." следующим кодом:

    // Prompt the user to enter a number
    printf("Enter a number: ");
    scanf("%s", number);

    // Check each character in the number string for a decimal point
    for(i = 0; number[i] != '\0'; i++) {
        if(number[i] == '.') {
            flag = 1;  // Set flag to 1 if decimal point is found
            break;
        }
    }

    // Display the result based on the flag value
    if(flag) {
        printf("The entered number is a floating point number.\n");
    } else {
        printf("The entered number is an integer number.\n");
    }

Рассмотрим, что делает этот код:

  1. Инструкция printf() выводит приглашение, попросив пользователя ввести число.
  2. Функция scanf() читает ввод пользователя как строку и сохраняет его в массиве number.
  3. Мы используем цикл for для перебора каждого символа строки до тех пор, пока не достигнем нулевого символа ('\0').
  4. Внутри цикла мы проверяем, является ли каждый символ десятичной точкой ('.'). Если точка найдена, мы устанавливаем флаг flag в значение 1 и выходим из цикла.
  5. Наконец, мы используем оператор if для проверки, установлен ли флаг flag. Если он установлен, мы сообщаем пользователю, что число является дробным; в противном случае это целое число.

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

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

int main() {
    char number[20];  // Array to store the input number as a string
    int flag = 0;     // Flag to track if a decimal point is found (0 = not found, 1 = found)
    int i;            // Loop counter variable

    // Prompt the user to enter a number
    printf("Enter a number: ");
    scanf("%s", number);

    // Check each character in the number string for a decimal point
    for(i = 0; number[i] != '\0'; i++) {
        if(number[i] == '.') {
            flag = 1;  // Set flag to 1 if decimal point is found
            break;
        }
    }

    // Display the result based on the flag value
    if(flag) {
        printf("The entered number is a floating point number.\n");
    } else {
        printf("The entered number is an integer number.\n");
    }

    return 0;
}

Компиляция и запуск программы

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

  1. Сначала сохраните файл, если вы еще этого не сделали (Ctrl+S или File > Save).

  2. Откройте терминал в WebIDE (если он еще не открыт).

  3. Перейдите в директорию проекта и скомпилируйте программу с помощью компилятора GCC:

cd ~/project
gcc main.c -o main

Команда gcc компилирует наш исходный файл на языке C, а опция -o main указывает, что выходной исполняемый файл должен называться main.

  1. Теперь запустите скомпилированную программу:
./main
  1. Когда появится приглашение, введите число. Сначала попробуйте целое число, например 42:
Enter a number: 42

Вы должны увидеть следующий вывод:

The entered number is an integer number.
  1. Запустите программу еще раз и попробуйте дробное число, например 3.14:
./main
Enter a number: 3.14

Вы должны увидеть следующий вывод:

The entered number is a floating point number.

Программа правильно определяет целые и дробные числа на основе наличия десятичной точки во входных данных.

Улучшение программы

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

Обновите файл main.c следующим кодом:

#include <stdio.h>
#include <string.h>
#include <ctype.h>  // For isdigit function

int main() {
    char number[20];
    int flag, i;
    char choice;

    do {
        flag = 0;  // Reset flag for each iteration

        // Prompt the user to enter a number
        printf("\nEnter a number: ");
        scanf("%s", number);

        // Input validation - check if the input contains only digits and at most one decimal point
        int valid = 1;
        int decimal_count = 0;

        for(i = 0; number[i] != '\0'; i++) {
            if(number[i] == '.') {
                decimal_count++;
                if(decimal_count > 1) {
                    valid = 0;
                    break;
                }
            } else if(!isdigit(number[i])) {
                valid = 0;
                break;
            }
        }

        if(!valid) {
            printf("Invalid input! Please enter a valid number.\n");
            continue;
        }

        // Check if the number is integer or float
        for(i = 0; number[i] != '\0'; i++) {
            if(number[i] == '.') {
                flag = 1;
                break;
            }
        }

        // Display the result
        if(flag) {
            printf("The entered number is a floating point number.\n");
        } else {
            printf("The entered number is an integer number.\n");
        }

        // Ask if the user wants to continue
        printf("\nDo you want to check another number? (y/n): ");
        scanf(" %c", &choice);

    } while(choice == 'y' || choice == 'Y');

    printf("\nThank you for using the program!\n");
    return 0;
}

В этом улучшенном варианте программы реализованы следующие функции:

  1. Цикл do-while, который позволяет пользователю проверять несколько чисел.
  2. Валидация ввода, чтобы убедиться, что ввод содержит только цифры и не более одной десятичной точки.
  3. Более удобный интерфейс с более понятными приглашениями и обратной связью.

Скомпилируйте и запустите этот улучшенный вариант:

cd ~/project
gcc main.c -o main
./main

Протестируйте программу с различными входными данными, включая:

  • Целые числа, такие как 42
  • Дробные числа, такие как 3.14
  • Недопустимые входные данные, такие как abc или 1.2.3

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

Итоги

В этом практическом занятии вы успешно создали программу на языке C, которая определяет, является ли введенное пользователем число целым или дробным. Вот основные концепции, которые вы изучили:

  1. Работа со строками в C: Вы использовали символьные массивы для хранения и обработки строковых данных, проходя по каждому символу, чтобы проверить его свойства.

  2. Обработка пользовательского ввода: Вы узнали, как запрашивать и считывать пользовательский ввод с помощью функции scanf().

  3. Контрольные структуры: Вы реализовали условные операторы (if-else) и циклы (for, do-while) для управления потоком выполнения программы.

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

  5. Улучшение программы: Вы улучшили базовую программу, добавив такие функции, как цикл для пользователя и валидацию ввода, сделав ее более надежной и удобной для пользователя.

Эти концепции являются фундаментальными для многих программистских задач и станут прочной основой при дальнейшем изучении программирования на языке C. Способность различать разные типы данных особенно важна в строго типизированных языках, таких как C, где разные типы данных имеют разную память и поведение.