C ++ Сравнение символов

  • Автор темы BoSSea
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

BoSSea

#1
Привет, помогите разобраться с программой ...
Задание : С клавиатуры считывается ряд символов , вывести на экран самое короткое слово . Спс заранее
<!--shcode--><pre><code class='sql'>#include<stdio.h>
#include<conio.h>
void main()
{ char q[80],min[80]; int i,j;
clrscr();
gets(q);
for (i=0;q;i++)
for (j=0;min[j];j++)
if (min[j]>q) min[j]=q;
printf("Samoe korotkoe slovo : %c",min[j]);
getch();
}[/CODE]
 

lazybiz

Well-known member
03.11.2010
1 339
0
#2
> С клавиатуры считывается ряд символов
Предложение, состоящее из слов?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#4
Что-то я не понял.. Программа должна в этих символах слова искать??
Или под словами подразумеваются ряды символов, разделенные запятыми?
 
S

savaa

#5
нужно или регекспы юзать или создать массив строк (или двумерный массив чаров) и записать туда слова.
например,
C++:
char *startstring="ololo o olo";

char **words;
char = new words*[11]; //количество символов исходной строки.
int counter[11]; // считает длину слов
for (int i=0i;<11;i++)
words[i]=new char[11]; //собствено длина каждого слова

int k=0,j=0;
for (int i=0;i<11;i++)
if (startstring[i]==" ")
{ counter[k]=j-1; k++; j=0; }
else
{ words[k][j]=startstring[i]; j++ }
реализация, ясное дело, не фонтан, но хоть что-то на скорую руку=)
а потом выбираешь с массива меньшее значение и выводишь слово аля

C++:
for (int i=0;i<11;i++)
printf("words[counter[min]][i]");
 
S

savaa

#7
ну, можно посчитать длинну исходной строки функцией и тралаляля, но вчера и сегодня тоже бака гудит и думаю туго%)
 
E

ensane

#8
Вариант 1. Тут мы сохраняем все слова в отдельный массив. Неэкономно в плане расхода памяти, но мало ли, вдруг пригодится:
C++:
#include <stdio.h>
#include <cstring>

#define MAX_WORDS 1024
#define	MAX_WORD_LENGTH 64

bool split(const char *src, char *word, char *rest){
/*	делим строку src на одно слово и остаток строки, попутно выбрасывая
пробелы в начале и в конце строки
т.е. из "  раз	два	 три  " получим "раз" и "	два	 три"
возвращаем false если в src только одно слово*/
size_t start, end, sp_pos, sp_pos2;
start = 0; end = strlen(src)-1;
while((src[start]==' ')&&(start<end))start++;
while((src[end]==' ')&&(end>start))end--;
if(start>=end)return false;//случилось что-то очень нехорошее! строка состоит из одних пробелов!
sp_pos = start;
//sp_pos2 = end;
while((src[sp_pos]!=' ')&&(sp_pos<end))sp_pos++;
if(sp_pos == end){//в строке только одно слово
strncpy(word, src+start, (end-start+1));
word[end-start+1]=0;
return false;
};
/*
если мы дошли сюда, то у нас в start - начало первого слова
в sp_pos - адрес первого пробела, т.е. конец первого слова+1
а в end - конец строки
*/
strncpy(word, src+start, (sp_pos - start));word[sp_pos - start]=0;
strncpy(rest, src+sp_pos, (end-sp_pos+1));rest[end-sp_pos+1]=0;
return true;
};

int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Russian");
char *words[MAX_WORDS];
char *buf = new char[MAX_WORDS * MAX_WORD_LENGTH];
printf("Введите ваше предложение:");
gets(buf);

size_t cur_word = 0;
bool done = false;
char *str = buf;//поступаем так, чтобы не потерять указатель на начало строки.
do{
words[cur_word] = new char[MAX_WORD_LENGTH];
if(split(str, words[cur_word], str))cur_word++;
else done = true;
}while(!done);

delete [] buf;
size_t max_length = 0;
size_t max_idx = 0;
for(size_t i=0; i<=cur_word;i++){
if(strlen(words[i])>max_length){
max_length = strlen(words[i]);
max_idx = i;
};
};

printf("Слово с максимальной длиной(%i):\"%s\"\n", max_length, words[max_idx]);

for(size_t i=0; i<=cur_word;i++){
delete[] words[i];
};
return 0;
}
Вариант второй: слова отдельно не храним. Только слово с максимальной длиной.
C++:
#include <stdio.h>
#include <cstring>

#define MAX_WORDS 1024
#define	MAX_WORD_LENGTH 64

bool split(const char *src, char *word, char *rest){
/*	делим строку src на одно слово и остаток строки, попутно выбрасывая
пробелы в начале и в конце строки
т.е. из "  раз	два	 три  " получим "раз" и "	два	 три"
возвращаем false если в src только одно слово*/
size_t start, end, sp_pos, sp_pos2;
start = 0; end = strlen(src)-1;
while((src[start]==' ')&&(start<end))start++;
while((src[end]==' ')&&(end>start))end--;
if(start>=end)return false;//случилось что-то очень нехорошее! строка состоит из одних пробелов!
sp_pos = start;
//sp_pos2 = end;
while((src[sp_pos]!=' ')&&(sp_pos<end))sp_pos++;
if(sp_pos == end){//в строке только одно слово
strncpy(word, src+start, (end-start+1));
word[end-start+1]=0;
return false;
};
/*
если мы дошли сюда, то у нас в start - начало первого слова
в sp_pos - адрес первого пробела, т.е. конец первого слова+1
а в end - конец строки
*/
strncpy(word, src+start, (sp_pos - start));word[sp_pos - start]=0;
strncpy(rest, src+sp_pos, (end-sp_pos+1));rest[end-sp_pos+1]=0;
return true;
};

int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL,"Russian");
char *word = new char[MAX_WORD_LENGTH];
char *result = new char[MAX_WORD_LENGTH];
char *buf = new char[MAX_WORDS * MAX_WORD_LENGTH];
size_t max_length = 0;
printf("Введите ваше предложение:");
gets(buf);

size_t cur_word = 0;
bool done = false;
char *str = buf;//поступаем так, чтобы не потерять указатель на начало строки.
do{
if(split(str, word, str))	cur_word++; else done = true;
if(strlen(word)>max_length){
max_length = strlen(word);
strcpy(result, word);
};
}while(!done);

delete [] buf;
delete [] word;

printf("Слово с максимальной длиной(%i):\"%s\"\n", max_length, result);

delete [] result;	
return 0;
}
Можно, как вариант, вообще не делить на слова, а просто пробегать по строке, выделяя координаты пробелов. См. вариант от savaa, если он его до ума доведет.
 
Статус
Закрыто для дальнейших ответов.