Меню

Вывести строку с максимальной длинной

Поиск самой длинной строки [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 3 года назад .

Необходимо найти N самых длинных строк в файле и вывести их в другой файл в обратном порядке.

Как это можно сделать наиболее эффективно по скорости работы и потреблению памяти?

3 ответа 3

Разбейте задачу на подзадачи.

  1. Как читать и писать файл со строками? — std::fstream и производные классы
  2. Как работать со строками? Как узнать длину строки? — std::string
  3. Как работать с набором строк? — std::list / std::vector
  4. Как отсортировать набор? — std::list::sort() + шаблоны + компаратор

После 1-2 часов внимательной работы с поисковиком по этим пунктам у вас будет хорошая база знаний для решения этой задачи. Обязательно пишите небольшие кусочки кода самостоятельно, не берите готовые примеры — это убивает творчество.

UPD. Вопрос был изменен автором, поэтому обновляю и ответ

Чтобы узнать самые длинные строки в файле, придется прочитать весь файл. Если вы не прочитаете хотя бы одну строку — возможно она и была самой длинной. Проще всего использовать std::fstream + std::list + std::getline

Теперь у нас есть список из строк. Нам нужно взять оттуда N самых длинных строк. Сортируем по длине строки! Нам поможет std::list::sort()

Необходимо определить функцию для сравнения двух элементов списка

Теперь мы можем использовать эту функцию для сортировки

В итоге мы получим первые N самых длинных строк из файла

Источник

Поиск нескольких значений с максимальной длиной строки в EXCEL

history 16 апреля 2013 г.

Найдем в исходном списке текстовые значения, которые имеют максимальную длину строки, и выведем их в отдельный диапазон.

Пусть в диапазоне A4:A12 имеется список имен.

Задача

Найти самое длинное имя (значение с максимальной длиной строки) (см. файл примера ). Так как имен с одинаковыми длинами может быть несколько, например Ярослава и Владимир имеют по 8 букв, то и имен с максимальной длиной может быть также несколько. Выведем их все в отдельный диапазон.

Решение

Создадим для удобства Динамический диапазон Список . Это нам позволит добавлять при необходимости в Исходный список новые имена. Новые имена будут автоматически учтены при работе нижеследующих формул. Формула для создания Динамического диапазона : =СМЕЩ(лист1!$A$7;;;СЧЁТЗ(лист1!$A$7:$A$19))

Теперь найдем максимальную длину строки с использованием формулы массива =МАКС(ДЛСТР(Список)) . В нашем случае это 8 (имена Ярослава и Владимир имеют длину по 8 букв). Формулу разместим в ячейке D7 .

Также найдем количество значений с максимальной длины строки =СУММПРОИЗВ((ДЛСТР(Список)=D7)*1) . В нашем случае это 2 (имена Ярослава и Владимир).

Наконец выведем значения, имеющие максимальную длину строки, в отдельный диапазон. Для этого используем формулу массива : =ИНДЕКС(Список; НАИМЕНЬШИЙ(ЕСЛИ(ДЛСТР(Список)=$D$7;СТРОКА(Список)-СТРОКА($A$6);9999); СТРОКА(ДВССЫЛ(«A1:A»&ЧСТРОК(Список)))))

  • часть формулы ДЛСТР(Список)=$D$7 возвращает массив <ЛОЖЬ: ЛОЖЬ: ИСТИНА : ЛОЖЬ: ЛОЖЬ: ЛОЖЬ: ЛОЖЬ: ИСТИНА : ЛОЖЬ>. В этом можно убедиться, выделив в Строке формул соответствующее выражение и нажать клавишу F9 . Значение ИСТИНА соответствует значению с максимальной длиной строки. Как видим, это третье и восьмое значение. Всего значений 9, как и имен в Исходном списке;
  • функция ЕСЛИ() возвращает массив номеров строк, в которых содержатся значения с максимальной длиной строкой <9999:9999: 3 :9999:9999:9999:9999: 8 :9999>. Остальные элементы массива равны 9999 (требуется для дальнейшей сортировки);
  • функция НАИБОЛЬШИЙ() сортирует полученный выше массив. Формула СТРОКА(ДВССЫЛ(«A1:A»&ЧСТРОК(Список))) возвращает массив последовательных чисел от 1 до 9 (9 – количество значений в исходном массиве);
  • функция ИНДЕКС() возвращает значения с максимальной длиной строки из столбца А .

Формула массива возвращает несколько значений и должна быть введена в диапазон, совпадающий по размерности с исходным списком (хотя и необязательно), например, в A7:A15 . Для этого: выделите диапазон, в Строке формул введите вышеуказанную формулу массива и нажмите CTRL + SHIFT + ENTER .

Читайте также:  Можно ли стирать для новорожденного машиной

В ячейках диапазона A7:A15 , не содержащих имен, содержится ошибка #ССЫЛКА! — это результат формулы массива. С помощью Условного форматирования эту ошибку можно скрыть .

С помощью Условного форматирования также выделены имена с максимальной длиной в Исходном диапазоне.

СОВЕТ: Как найти значение с максимальной или минимальной длиной строки и вывести только первое найденное значение рассказано в статье Поиск значения с максимальной или минимальной длиной строки .

Источник

Строки в языке C

Строка — это последовательность ASCII или UNICODE символов.

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

Исторически сложилось два представления формата строк:

  1. формат ANSI;
  2. cтроки с завершающим нулем (используется в C).

Формат ANSI устанавливает, что значением первой позиции в строке является ее длина, а затем следуют сами символы строки. Например, представление строки «Моя строка!» будет следующим:

11 ‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’
В строках с завершающим нулем, значащие символы строки указываются с первой позиции, а признаком завершения строки является значение ноль. Представление рассмотренной ранее строки в этом формате имеет вид:

‘М’ ‘о’ ‘я’ ‘ ‘ ‘с’ ‘т’ ‘р’ ‘о’ ‘к’ ‘а’ ‘!’ 0

Объявление строк в C

Строки реализуются посредством массивов символов. Поэтому объявление ASCII строки имеет следующий синтаксис:

char имя[длина];
Объявление строки в С имеет тот же синтаксис, что и объявление одномерного символьного массива. Длина строки должна представлять собой целочисленное значение (в стандарте C89 – константа, в стандарте C99 может быть выражением). Длина строки указывается с учетом одного символа на хранение завершающего нуля, поэтому максимальное количество значащих символов в строке на единицу меньше ее длины. Например, строка может содержать максимально двадцать символов, если объявлена следующим образом:
char str[21]; Инициализация строки в С осуществляется при ее объявлении, используя следующий синтаксис:
char str[длина] = строковый литерал;

Строковый литерал – строка ASCII символов заключенных в двойные кавычки. Примеры объявления строк с инициализацией:

char str1[20] = «Введите значение: «, str2[20] = «»;

const char message[] = «Сообщение об ошибке!»;

Работа со строками в С

Так как строки на языке С являются массивами символов, то к любому символу строки можно обратиться по его индексу. Для этого используется синтаксис обращения к элементу массива, поэтому первый символ в строке имеет индекс ноль. Например, в следующем фрагменте программы в строке str осуществляется замена всех символов ‘a’ на символы ‘A’ и наоборот.

Читайте также:  Чем можно отбелить пластиковые подоконники

Массивы строк в С

Объявление массивов строк в языке С также возможно. Для этого используются двумерные массивы символов, что имеет следующий синтаксис:
char имя[количество][длина];

Первым размером матрицы указывается количество строк в массиве, а вторым – максимальная (с учетом завершающего нуля) длина каждой строки. Например, объявление массива из пяти строк максимальной длиной 30 значащих символов будет иметь вид:

При объявлении массивов строк можно производить инициализацию:
char имя[количество][длина] = <строковый литерал №1, . строковый литерал №N>;

Число строковых литералов должно быть меньше или равно количеству строк в массиве. Если число строковых литералов меньше размера массива, то все остальные элементы инициализируются пустыми строками. Длина каждого строкового литерала должна быть строго меньше значения длины строки (для записи завершающего нуля).

При объявлении массивов строк с инициализацией допускается не указывать количество строк в квадратных скобках. В таком случае, количество строк в массиве будет определено автоматически по числу инициализирующих строковых литералов.
Например, массив из семи строк:

Функции для работы со строками в С

Все библиотечные функции, предназначенные для работы со строками, можно разделить на три группы:

  1. ввод и вывод строк;
  2. преобразование строк;
  3. обработка строк.

Ввод и вывод строк в С

Для ввода и вывода строковой информации можно использовать функции форматированного ввода и вывода (printf и scanf). Для этого в строке формата при вводе или выводе строковой переменной необходимо указать спецификатор типа %s. Например, ввод и последующий вывод строковой переменной будет иметь вид:

char str[31] = «»;
printf(«Введите строку: «);
scanf(«%30s”,str);
printf(«Вы ввели: %s”,str);

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

Поэтому, используя данную функцию невозможно ввести строку, содержащую несколько слов, разделенных пробелами или табуляциями. Например, если в предыдущей программе пользователь введет строку: «Сообщение из нескольких слов», то на экране будет выведено только «Сообщение».
Для ввода и вывода строк в библиотеке stdio.h содержатся специализированные функции gets и puts.

Функция gets предназначена для ввода строк и имеет следующий заголовок:
char * gets(char *buffer);

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

char * fgets(char * buffer, int size, FILE * stream);

где buffer — строка для записи результата, size — максимальное количество байт, которое запишет функция fgets, stream — файловый объект для чтения данных, для чтения с клавиатуры нужно указать stdin. Эта функция читает символы со стандартного ввода, пока не считает n — 1 символ или символ конца строки, потом запишет считанные символы в строку и добавит нулевой символ. При этом функция fgets записывает в том символ конца строки в данную строку, что нужно учитывать.

Читайте также:  Можно ли чистить воздушный фильтр пылесосом

Функция puts предназначена для вывода строк и имеет следующий заголовок:
int puts(const char *string);

Простейшая программа: ввод и вывод строки с использованием функций fgets и puts будет иметь вид:

Для считывания одного символа можно использовать функцию fgetc(FILE * stream) . Она считывает один символ и возвращает значение этого символа, преобразованное к типу int, если же считывание не удалось, то возвращается специальная константа EOF, равная -1. Функция возвращает значение -1 для того, чтобы можно было обрабатывать ситуацию конца файла, посимвольное чтение до конца файла можно реализовать следующим образом:

int c;
while ((c = fgetc(stdin)) != EOF) <
// Обработка символа
>

Для вывода одного символа можно использовать функцию int fputc(int c, FILE *stream); .

Помимо функций ввода и вывода в потоки в библиотеке stdio.h присутствуют функции форматированного ввода и вывода в строки. Функция форматированного ввода из строки имеет следующий заголовок:

int sscanf(const char * restrict buffer, const char * restrict string, [address] . );

Функции форматированного вывода в строку имеют следующие заголовки:

Преобразование строк

В С для преобразования строк, содержащих числа, в численные значения в библиотеке stdlib.h
предусмотрен следующий набор функций:
double atof(const char *string); // преобразование строки в число типа double
int atoi(const char *string); // преобразование строки в число типа int
long int atol(const char *string); // преобразование строки в число типа long int
long long int atoll(const char *string); // преобразование строки в число типа long long int

Корректное представление вещественного числа в текстовой строке должно удовлетворять формату:

После символов E, e указывается порядок числа. Корректное представление целого числа в текстовой строке должно удовлетворять формату:

Помимо приведенных выше функций в библиотеке stdlib.h доступны также следующие функции преобразования строк в вещественные числа:

Аналогичные функции присутствуют и для преобразования строк в целочисленные значения:

Функции обратного преобразования (численные значения в строки) в библиотеке stdlib.h присутствуют, но они не регламентированы стандартом, и рассматриваться не будут. Для преобразования численных значений в строковые наиболее удобно использовать функции sprintf и snprintf.

Обработка строк

В библиотеке string.h содержаться функции для различных действий над строками.
Функция вычисления длины строки:
size_t strlen(const char *string);

Функции копирования строк:

Функции сравнения строк:

Функции осуществляют сравнение строк по алфавиту и возвращают:

положительное значение – если string1 больше string2;
отрицательное значение – если string1 меньше string2;
нулевое значение – если string1 совпадает с string2;

Функции объединения (конкатенации) строк:

Функции поиска символа в строке:

Функция поиска строки в строке:
char * strstr(const char *str, const char *substr);

Функция поиска первого символа в строке из заданного набора символов:
size_t strcspn(const char *str, const char *charset);

Функции поиска первого символа в строке не принадлежащему заданному набору символов:
size_t strspn(const char *str, const char *charset);

Функции поиска первого символа в строке из заданного набора символов:
char * strpbrk(const char *str, const char *charset);

Функция поиска следующего литерала в строке:
char * strtok(char * restrict string, const char * restrict charset);

Источник