Введение
В этом практическом занятии (лабораторной работе) мы напишем программу на языке C, которая определяет, является ли введенное пользователем число целым или дробным. Это фундаментальное понятие в программировании, где различные типы данных имеют разные требования к памяти и поведение.
Мы сосредоточимся на обнаружении десятичной точки во входных данных, чтобы определить, является ли число значением с плавающей точкой. В этой лабораторной работе вы познакомитесь с базовым обработкой строк на языке C, обработкой пользовательского ввода и условной логикой.
По завершении этой лабораторной работы вы научитесь:
- Читать пользовательский ввод в виде строки на языке C
- Проверять строку на наличие определенных символов
- Использовать условную логику для принятия решений на основе входных данных
Создание и открытие файла программы на языке C
Начнем с создания нового файла на языке C для нашей программы. Назовем его main.c и поместим в директорию проекта.
- Сначала убедитесь, что вы находитесь в директории проекта:
cd ~/project
Теперь в WebIDE нажмите на меню "File", выберите "New File" и назовите его
main.c. В качестве альтернативы вы можете использовать значок "New File" в боковой панели проводника файлов.Редактор файла откроется автоматически. Добавим в нашу программу необходимые заголовочные файлы:
#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");
}
Рассмотрим, что делает этот код:
- Инструкция
printf()выводит приглашение, попросив пользователя ввести число. - Функция
scanf()читает ввод пользователя как строку и сохраняет его в массивеnumber. - Мы используем цикл
forдля перебора каждого символа строки до тех пор, пока не достигнем нулевого символа ('\0'). - Внутри цикла мы проверяем, является ли каждый символ десятичной точкой (
'.'). Если точка найдена, мы устанавливаем флагflagв значение 1 и выходим из цикла. - Наконец, мы используем оператор
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;
}
Компиляция и запуск программы
Теперь, когда мы написали нашу программу, давайте скомпилируем и запустим ее, чтобы увидеть, как она работает.
Сначала сохраните файл, если вы еще этого не сделали (Ctrl+S или File > Save).
Откройте терминал в WebIDE (если он еще не открыт).
Перейдите в директорию проекта и скомпилируйте программу с помощью компилятора GCC:
cd ~/project
gcc main.c -o main
Команда gcc компилирует наш исходный файл на языке C, а опция -o main указывает, что выходной исполняемый файл должен называться main.
- Теперь запустите скомпилированную программу:
./main
- Когда появится приглашение, введите число. Сначала попробуйте целое число, например
42:
Enter a number: 42
Вы должны увидеть следующий вывод:
The entered number is an integer number.
- Запустите программу еще раз и попробуйте дробное число, например
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;
}
В этом улучшенном варианте программы реализованы следующие функции:
- Цикл
do-while, который позволяет пользователю проверять несколько чисел. - Валидация ввода, чтобы убедиться, что ввод содержит только цифры и не более одной десятичной точки.
- Более удобный интерфейс с более понятными приглашениями и обратной связью.
Скомпилируйте и запустите этот улучшенный вариант:
cd ~/project
gcc main.c -o main
./main
Протестируйте программу с различными входными данными, включая:
- Целые числа, такие как
42 - Дробные числа, такие как
3.14 - Недопустимые входные данные, такие как
abcили1.2.3
Программа должна корректно обрабатывать все эти случаи и позволить вам продолжать проверку чисел, пока вы не решите выйти.
Резюме
В этом практическом занятии вы успешно создали программу на языке C, которая определяет, является ли введенное пользователем число целым или дробным. Вот основные концепции, которые вы изучили:
Работа со строками в C: Вы использовали символьные массивы для хранения и обработки строковых данных, проходя по каждому символу, чтобы проверить его свойства.
Обработка пользовательского ввода: Вы узнали, как запрашивать и считывать пользовательский ввод с помощью функции
scanf().Контрольные структуры: Вы реализовали условные операторы (
if-else) и циклы (for,do-while) для управления потоком выполнения программы.Валидация ввода: В улучшенной версии программы вы добавили проверки, чтобы убедиться, что пользовательский ввод является допустимым числом.
Улучшение программы: Вы улучшили базовую программу, добавив такие функции, как цикл для пользователя и валидацию ввода, сделав ее более надежной и удобной для пользователя.
Эти концепции являются фундаментальными для многих программистских задач и станут прочной основой при дальнейшем изучении программирования на языке C. Способность различать разные типы данных особенно важна в строго типизированных языках, таких как C, где разные типы данных имеют разную память и поведение.



