Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > "[C++] Работа со строками"


Автор: Fedor1989 9.12.2007, 13:18
Помогите написть лабу.

Дана строка символов.Распечатать слова, отличные от последнего ,оставив  в каждом слове только первые вхождение каждой буквы.

например:
строка символов:
"Весна наступила птицы прелетели"
на экран должно выводится
"Весна наступил птицы прелти"

Автор: Fedor1989 17.12.2007, 14:18
может бать кто-нибудь идею поткинет

Автор: mr.Anderson 17.12.2007, 15:05
Могу дать только идею. И написать код, но на паскале, т.к. С++ уже подзабыл. Если надо, выложу.

Добавлено через 5 минут и 49 секунд
В общем, вот паскалевский вариант. Если сишники зайдут, перепишите на С++.
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 al = 0;
 ah = 255;

var
 s : String;
 l : Array [al..ah] of Boolean;
 i : Word;
 j : Word;

begin
 readln( s );

 for i:=1 to Length(s) do
 begin
  if( s[i] = ' ' ) then
  begin
   for j:=al to ah do
    l[j] := False;

   write( ' ' );

   continue;
  end;

  if( l[ ord(s[i]) ] = False ) then
  begin
   write( s[i] );

   l[ ord(s[i]) ] := True;
  end;
 end;
end.


Добавлено через 11 минут и 32 секунды
Идея работы.

1. Заводим логический массив от 0 до 255, куда гарантированно влезут все символы. В нем будем хранить индикатор, был ли данный символ в данном слове.
2. Получаем строку.
3. Пробегаемся по ней посимвольно.
4. Если текущий символ - пробел (разделитель слов), то:
    4.1. Пробегаемся по логическому массиву, сбрасывая все элементы на False.
    4.2. Выводим пробел.
    4.3. Прерываем цикл и продолжаем его со следующей итерации (continue).
5. Если текущий символ - НЕ пробел (т.е. НЕ разделитель слов), и по индексу кода данного символа в нашем логическом массиве стоит False, т.е. этого символа еще не было в данном слове, то:
    5.1. Выводим данный символ.
    5.2. В логический массив (опять же, по индексу кода данного символа в таблице ASCII) выставляем True.


Вот и весь алгоритм работы. Более оптимального варианта я не вижу.

Автор: Fedor1989 17.12.2007, 20:55
мне бы на C++ а то я не силен в pascal

Автор: mr.Anderson 17.12.2007, 22:15
Я на С++ не смогу, уже не помню. Я дал идею. Мож сам справишься с кодом? Он прям пошагово описан.

Автор: Fedor1989 27.12.2007, 20:27
вот надумал код только он ничего не выводит
Код

#include <stdio.h>   
#include <string.h>   
#include <stdlib.h>   
  
  
void print_word(char* w)   
{  
    int i,j;  
    bool p;  
    for(i = 0; i < strlen(w); i++)  
    {  
        p = true;  
        for(j = i - 1;j >= 0;j--)  
         if(w[i] == w[j]) {p = false; break;}  
        if(p) printf("%c",w[i]);   
    }   
    printf(" ");   
}   
  
void get_last_w(const char* st, char* w)   
{  
    int i;  
    while(1)  
    {  
        for(i = 0;st[i] && !strstr(" .,!?:;"/*разделители*/,st+i);i++);  
        strncpy(w, st, i); w[i] = 0;  
        if(!st[i]) break;  
        st += (i + 1);  
    }  
}   
  
  
int main()   
{  
    char string[512], lw[64], w[64];  
    char *st;  
    int i = 0;  
    printf("Enter string:");  
    scanf("%500s", string);  
    get_last_w(string, &lw[0]);  
    printf("\n");  
 
    st = &string[0];  
    while(1)  
    {  
        for(i = 0;st[i] && !strstr(" .,!?:;"/*разделители*/,st+i);i++);  
        strncpy(w, st, i);  w[i] = 0;  
        if(strcmp(w,lw)) print_word(w);  
        if(!st[i]) break;  
        st+=(i+1);  
    }  
    printf("\n");   
       
    return 0;   
}


Автор: Fedor1989 28.12.2007, 12:01
помогите отыскать ошибку

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)