Лаба 4. 9 вар
.doc
1. Постановка задачи
Определить самое длинное и самое короткое слово в предложении, при условии, что каждое слово отделяется от другого пробелом.
2. Описание алгоритма
Чтобы определить самое длинное и самое короткое слово в предложении, требуется вычленить сами слова. Важно учесть следующие свойства слов: 1) между двумя словами обязательно есть пробел; 2) слово может быть слито со знаком препинания. Соответственно, этапы вычленения слов следующие:
1) разделить предложение на подстроки по пробелам (использовать метод Split);
2) убрать с конца каждого слова знаки препинания, если они есть (метод TrimEnd, в который передаётся массив знаков препинания типа char).
В массиве слов ищутся самое короткое и самое длинное слово по следующему принципу. Изначально самым коротким считается первое слово, оно же считается самым длинным. Далее в цикле проверяется каждое слово из оставшихся. Если проверяемое на данной итерации цикла слово короче ранее считавшегося самым коротким, проверяемое слово теперь считается самым коротким; если оно длиннее ранее считавшегося самым длинным, проверяемое слово теперь считается самым длинным. В некоторой мере это можно сравнить с обновлением рекордов: как только показатель превышает рекордный, старый рекорд стирается, и на его место записывается новый. Точно по такой же стратегии решаются многие другие задачи поиска экстремальных значений, например, ищутся минимум и максимум в числовых массивах.
3. Исходный код программы
using System;
namespace Strings
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Введите предложение:");
string source = Console.ReadLine();
string[] words = source.Split(new char[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
char[] prepin = { '.', '?', ',', ':', '!', ';' };
int i;
Console.WriteLine("Промежуточные данные");
for (i = 0; i < words.Length; i++)
{
words[i] = words[i].TrimEnd(prepin);
Console.WriteLine("Слово [{0}] = {1}", i, words[i]);
}
string Shortest = words[0], Longest = words[0];
for (i = 1; i < words.Length; i++)
{
if (words[i].Length < Shortest.Length)
Shortest = words[i];
if (words[i].Length > Longest.Length)
Longest = words[i];
}
Console.WriteLine("Самое короткое слово: {0}", Shortest);
Console.WriteLine("Самое длинное слово: {0}", Longest);
Console.ReadKey();
}
}
}
Рассмотрим выполнение последнего цикла на примере предложения «Это же самая сложная прога в мире!». В данном случае words={“Это”, “же”, “самая”, “сложная”, “прога”, “в”, “мире”}. Изначально текущий минимум: “Это”, оно же текущий максимум. В табл. 1 представлены подробные данные по этому примеру.
Таблица 1
Пример поиска самого короткого и самого длинного слова
Слово для сравнения |
Минимум |
Максимум |
||
До сравнения |
После |
До сравнения |
После |
|
же |
Это |
же |
Это |
Это |
самая |
же |
же |
Это |
самая |
сложная |
же |
же |
самая |
сложная |
прога |
же |
же |
сложная |
сложная |
в |
же |
в |
сложная |
сложная |
мире |
в |
в |
сложная |
сложная |
Примечание: если есть несколько самых коротких (или самых длинных) слов, запоминается первое из них.
4. Тестирование
На рис. 1-2 представлены тесты программы:
1) простой тест, основан на разобранном выше примере;
2) сложный тест, содержит много знаков препинания.
Рис. 1. Тестирование: простой тест
Рис. 2. Тестирование: сложный тест