Консультация № 170305
09.07.2009, 20:56
0.00 руб.
0 7 2
Уважаемые эксперты помогите пожалуйста! Буду очень благодарен. Задача: Даны натуральное число n, символы S1, S2, ..., Sn. Группы символов, разделённых пробелами (одним или несколькими) и не содержащим пробелов внутри себя будем называть словами. найти длину самого короткого слова. Заранее спасибо.

Обсуждение

Неизвестный
10.07.2009, 01:57
общий
это ответ
Здравствуйте, sidxoi.
Программа. С++. Microsoft Visual Studio 2008
Код:

#include <limits>
#include <iostream>
#include <locale>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
locale::global(locale("russian_russia.866"));
wcout<<L"Введите строку символов:"<<endl;
// Строка
wstring str;
getline(wcin,str);
// С этого потока будем читать по словам
wstringstream stream(str);
// Слово
wstring word;
// Минимальный размер
wstring::size_type min_size=numeric_limits<wstring::size_type>::max();
// Вектор в котором будем хранить слова
vector<wstring> words;
// Берем следующее слово
while(stream>>word)
{
// Если новый минимум
if(word.length()<min_size)
{
// Сохраним размер
min_size=word.length();
// Очистим вектор
words.clear();
}
// Если нашли слово с размером min_size
if(word.length()==min_size)
{
// Добавим его
words.push_back(word);
}
}
// Если вектор не пуст
if(words.size())
{
// Если больше чем одно слово
if(words.size()>1)
{
// Рачспечатаем
wcout<<L"Найдено несколько слов с минимальной длиной("<<min_size<<L"):"<<endl;
for(vector<wstring>::const_iterator it=words.begin();it!=words.end();++it)
{
wcout<<*it<<endl;
}
}
else
{
wcout<<L"Минимальное слово ""<<words[0]<<L"" содержит "<<min_size<<L" символов"<<endl;
}
}
else
{
wcout<<L"Слов нет"<<endl;
}
system("PAUSE");
return 0;
}


Пример работы:
Код:

Введите строку символов:
Наша служба и опасна и трудна
Найдено несколько слов с минимальной длиной(1):
и
и
Неизвестный
10.07.2009, 10:34
общий
В мой ответ закралась ошибка. Исправленный вариант:

# include <stdio.h>
# include <conio.h>

int TheShortestWord(FILE * f,unsigned int n)
{
unsigned char c, len=0, min=0;
for (unsigned int i=0;i<n;i++)
{
do
{
fscanf(f,"%c", &c);
if (c!=32) || (c=='\n')
++len;
else
if (min>en)
{min=len; len=0;}
}
while(len==0);
}
return(min);
}
void main(void)
{
unsigned int n;
FILE * f=fopen("d:\\input.txt","rt");
if (f==NULL)
{
printf("Can't open the file");
return;
}
clrscr();
fscanf(f,"%ud", &n);
printf("The Shortest Word is %d charfcters length",TheShortestWord(f,n));
getch();
}
Неизвестный
10.07.2009, 12:34
общий
Максим Юрьевич:
Во вторую программу тоже закралась ошибка(синтаксическая). Проверьте. Хоть я и не компилятор, но бросилась в глаза сразу.
Код:

if (min>en)

Неопределенный идентификатор.
Неизвестный
10.07.2009, 19:50
общий
Максим Юрьевич:
У Вас тут так же не мало ошибок..
Неизвестный
10.07.2009, 19:59
общий
sidxoi:
Вот, очень похожий вариант что дал Максим Юрьевич
Код:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/***************************************************/
int TheShortestWord(FILE * f)
{
int len=0, max=100;
char ch;

do
{
ch = fgetc(f);
if(isalnum(ch))
{
if(ch != 32)
{
len++;
printf("%c",ch);
}
}
else
{
if ((max > len) && (len > 0))
max=len;
printf("\t\tlen = %i\tmax = %i\n",len,max);
len = 0;
}
}while(ch != EOF);
return(max);
}
/************** главная функция **********************/
int main(void)
{
FILE * f=fopen("test.txt","rt");
if (f==NULL)
{
printf("Can't open the file");
return 0;
}
printf("The Shortest Word is %i charfcters length",TheShortestWord(f));
getchar();
return 0;
}
Неизвестный
10.07.2009, 20:12
общий
Максим Юрьевич:
"работа над ошибками"

unsigned char c, len=0, min=0; с какой целью используется беззнаковые типы?
for (unsigned int i=0;i<n;i++) // для чего тут беззнаковый тип?
fscanf(f,"%c", &c);//без модификатора читает char
if ((c!=32) || (c=='\n') )//нет закрывающих скобок
++len; //для чего префиксный инкримент?
else
if (min>en)// ошибка в переменной
{min=len; len=0;}
}
while(len==0);// после этого вы заканчиваете цикл и выходите без анализа остальных слов.
while(len==0);// окончание файла есть EOF (-1)
unsigned int n;//для чего тип беззнаковый?
fscanf(f,"%ud", &n); //ошибка модификатора
printf("The Shortest Word is %d charfcters length",TheShortestWord(f,n));// не верный параметр, функция возвращает int
*********************
в результате, Ваша программа возвращает на текстовом файле
4
aa bbb cccc
ddddd fffff
ssssss gggggggg
ss j

The Shortest Word is 0 charfcters length
давно
Академик
320937
2216
11.07.2009, 11:07
общий
это ответ
Здравствуйте, sidxoi. Предлагаю свой вариант, так как, судя по задаче, она выполняется с минимальными знаниями по C/C++.


Приложение:
#include <stdio.h>
/* решение TurboC */
void main(void)
{
int nc = 0; /* считано символов */
int tot_c; /* максимальное число символов */
int min_len = 0; /* минимальная длина слова */
int ch;
int in_word = 0; /* устанавливаем статус "внутри слова" в ЛОЖЬ, т.е. "вне слова" */
int len=0;

printf("vsego simvolov=");
scanf("%d", &tot_c);
getchar(); /* считываем возврат каретки */
min_len = tot_c+1; /* заведомо большая длина слова */

while (nc < tot_c && (ch=getchar()) != EOF) {
/* если считали все символы, остановимся, возможен ^Z раньше */
++nc;
if (in_word && (ch == ' ' || ch == '\n' || ch == '\t')) {
/* первый пробельный символ */
in_word = 0; /* вне слова */
if (len < min_len)
min_len = len;
len=0; /* сбрасываем текущую длину */
}
else if (ch != ' ' && ch != '\n' && ch != '\t') {
/* непробельные символы */
++len;
if (!in_word)
/* устанавливаем статус "внутри слова" */
in_word = 1;
}
}
if (in_word && len<min_len)
/* если последний ситмвол в строке - непробельный */
min_len = len;
if (min_len<tot_c+1)
printf("minimalnaya dlina=%d\n", min_len);
else
printf("net slov\n");
}
Форма ответа