Поиск кратчайшего числа из строки - C (СИ)
Формулировка задачи:
Здравствйте. Есть такая задача:
Составить программу, которая выделяет отдельные целые числа из введенной пользователем строки. Числом считается последовательность цифр, разделяемых одним или несколькими пробелами, которая может включать знак минус, стоящий в начале. Найти в строке число, содержащее наименьшее количество цифр.
Я смог составить программу, которая выделяет эти числа и находит количество. Но как найти самое короткое из них? Помогите, пожалуйста Вот код#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char s[100];
gets(s);
int n = strlen(s), flag = 0, k = 0, current = 0;
for (int i = 0; i < n; i++){
if ( (s[i] >= '0') && (s[i] <= '9') ){ /* если число*/
if (flag == 1/* проверяем,что стояло перед числом,1-стояла не цифра*/){
printf(" %c", s[i]);
flag = 0;
}
else printf("%c", s[i]);
if (current == 0/*если перед числом стоял символ*/){
k++;
current = 1;
}
}
else
if ( (s[i] == '-') && (s[i+1] >= '0') && (s[i+1] <= '9') ) {
current = 0;
flag = 0;
if (k > 0)
printf(" %c", s[i]);
else
printf("%c", s[i]);
}
else {
flag = 1;
current = 0;
}
}
printf("\nKol-vo = %d\n", k);
return 0;
}Решение задачи: «Поиск кратчайшего числа из строки»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int text(char *str)
{
int num_min_len[2], flag = 1, n;// num..[0] - число num..[1] - длина числа; flag - проверка на первое вхождение, чтоб задать первичные даныее в num..[]; n - число
while(*str){ // Пока есть символы...
n = 1; // не 0, т.к. дальше мы умножаем n само на себя..
if(*str == '-'){ // Если наткнулись на ' - '...
n = -1; // n = -1 , и при n*=atoi(str) получим отрицательное число..
++str; // переходим к след. символу..
}
if((*str >= '0') && (*str <= '9')){ // Если поймали цифру...
n *= atoi(str); // преобразовываем символы 0-9 в число..
int n2 = n; // чтоб при подсчете не потерять n создаем n2 инициализированную n
size_t count = 0; // счетчик..
while(n2){ // Считаем длину числа...
n2/=10;
++count;
}
if(flag == 1){ // Собственно проверка на первое вхождение..
num_min_len[0] = n;
num_min_len[1] =count;
flag = 0;
}
else{
if(count < num_min_len[1]){// Сравнение длины числа..
num_min_len[0] = n;
num_min_len[1] = count;
}
}
str+=count; // пропускае кол-во символов равное count..
}
else str++; // Переходим к след символу, если не 0-9
}
return num_min_len[0]; // Возвращаем первое короткое число.
}
int main(void)
{
printf("Enter string ('0-9' and '-'): ");
char str[50] = {'\0'};
gets(str);
printf("Result: %d", text(str));
return 0;
}
Объяснение кода листинга программы
- Входные данные: строка, в которой содержатся числа и знак минус.
- Выходные данные: кратчайшее число из строки.
- Если входная строка пустая, то выводится сообщение об ошибке.
- Функция text() выполняет следующие действия:
- инициализирует два указателя на массив num_min_len[], чтобы хранить результат.
- устанавливает флаг = 1.
- проходит по каждому символу входной строки.
- если символ является числом от 0 до 9, то преобразует его в число и сохраняет его в переменной n.
- затем преобразует n в строку и сравнивает длину этой строки с длиной текущего минимального числа.
- если длина равна или меньше, то обновляет переменные num_min_len[] и устанавливает флаг = 0.
- после прохода по всей строке, возвращает первое короткое число.
- В функции main() происходит следующее:
- запрашивает у пользователя строку.
- сохраняет эту строку в массив str[].
- вызывает функцию text(str[]) и выводит результат.