Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2007, 10:02   #1
Федор
 
Регистрация: 10.12.2007
Сообщений: 5
По умолчанию [С++]работа со строками

Помогите написать лабу.
Дана строка символов.распечатать слова отличные от последнего оставив в каждом слове только первые вхождения каждой буквы.
Например:
дана строка:"Vesna nastala ptici prileteli"
на экран должен вывести:
"Vesna nastl ptic"
Федор вне форума Ответить с цитированием
Старый 20.12.2007, 16:36   #2
Федор
 
Регистрация: 10.12.2007
Сообщений: 5
По умолчанию

подскажите хотябы идею.
Федор вне форума Ответить с цитированием
Старый 20.12.2007, 17:54   #3
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Код:
#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;
}
theos вне форума Ответить с цитированием
Старый 21.12.2007, 21:56   #4
Федор
 
Регистрация: 10.12.2007
Сообщений: 5
По умолчанию

Что то эта прога не выводит ничего.
Федор вне форума Ответить с цитированием
Старый 22.12.2007, 18:08   #5
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Выводит. Просто консоль закрывается зразу по завершению программы. Попробуй так:

Код:
#include <stdio.h>   
#include <string.h>   
#include <stdlib.h>   
#include <conio.h>  // 1е именение
  
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");   
    
    getch();// 2е именение
    return 0;   
}
theos вне форума Ответить с цитированием
Старый 22.12.2007, 20:10   #6
Федор
 
Регистрация: 10.12.2007
Сообщений: 5
По умолчанию

неа нефурычит
Федор вне форума Ответить с цитированием
Старый 23.12.2007, 12:35   #7
Федор
 
Регистрация: 10.12.2007
Сообщений: 5
По умолчанию

Помогите.
Перевести прогу с Pascal на С++
Код:
program Proectl;
{&APPTYRE 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 Lenht(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.


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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками GoAnd Общие вопросы по Java, Java SE, Kotlin 9 22.09.2010 03:36
Работа со строками. ViNcHeStEr Помощь студентам 6 29.06.2008 08:14
РАБОТА СО СТРОКАМИ kluwa Общие вопросы C/C++ 7 20.12.2007 18:30