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

Тема в разделе "Общие вопросы по С и С++", создана пользователем BoSSea, 9 дек 2010.

Статус темы:
Закрыта.
  1. BoSSea

    BoSSea Гость

    Привет, помогите разобраться с программой ...
    Задание : С клавиатуры считывается ряд символов , вывести на экран самое короткое слово . Спс заранее
    <!--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]
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    > С клавиатуры считывается ряд символов
    Предложение, состоящее из слов?
     
  3. BoSSea

    BoSSea Гость

    Ну скорее всего что ряд слов поскольку вывести на экран нужно самое короткое слово
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Что-то я не понял.. Программа должна в этих символах слова искать??
    Или под словами подразумеваются ряды символов, разделенные запятыми?
     
  5. savaa

    savaa Гость

    нужно или регекспы юзать или создать массив строк (или двумерный массив чаров) и записать туда слова.
    например,
    Код (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]");
     
  6. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Тут не "не фонтан", тут "не водопад виктория"...
     
  7. savaa

    savaa Гость

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

    ensane Гость

    Вариант 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, если он его до ума доведет.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей