Поиск кратчайшего числа из строки - 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[]) и выводит результат.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д