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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2012, 23:12   #1
Timosha
 
Регистрация: 29.05.2012
Сообщений: 3
По умолчанию Удаление слов равных последнему. С++

Задан текст, между словами пробел, за последним словом точка. Напечатать все симметричные слова отличные от последнего. Использовать функции.


Вообщем сделал вот что:


Код:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
void arr(char a[80]);
void symm();
void lastw(char a[80]);
void del(char a[80]);
char text[80], text1[80], *words[80], b[20][80], *last;
int n = 0;
void main()
{
	clrscr();
	cout << "Enter the text: " << endl;
	gets(text);
	for (int i=0; i<strlen(text); i++) if (text[i]==' ') n++;
	++n;
	lastw(text);
	arr(text);
	symm();
	del(text1);
	getch();
}
void lastw(char a[80])
{
	last = strrchr(a,' ');
	last = last+1;
}
void arr(char a[80])
{
	int i, j, r=0, l=0;
	for (i=0; i<n; i++){
		for(j=r; a[j]!=' ' && a[j]!='\0'; j++) {
			b[i][l] = a[j];
			l++;
		}
		r = j+1;
		l = 0;
	}
}
void symm()
{
	int flag[11], flag1[11];
	int l=0;
	for (int i=0; i<n; i++) {
		if (strlen(b[i])%2) flag[i] = 0;
		else flag[i] = 1;
	}
	for (i=0; i<n; i++) {
		if (flag[i]) {
			int j, k;
			for (j=0, k=(strlen(b[i])-1), l=0; l<strlen(b[i])/2; l++, j++, k--) {
				if (b[i][j] == b[i][k]) flag1[i]=1;
				else {
					flag1[i]=0;
					break;
				}
			}
		}
	}
	l = 0;
	for (i=0; i<n; i++) {
		if (flag1[i]==1 && flag[i]==1) {
			for (int j=0; b[i][j]!='\0'; j++) {
				text1[l] = b[i][j];
				l++;
			}
			text1[l]=' ';
			l++;
		}
	}
	int length = strlen(text1);
	text1[length-1]='\0';
}
void del(char a[80])
{
	int count = 0;
	char* p = strtok(a," ");
	int flag;
	 while (p)
	{
		flag = 1;
		if (!strcmp(p, last)) flag = 0;
		for (int i = 0; i < count; i++) if (!strcmp(p, words[i]))
		{
				flag = 0;
				break;
		  }
		  if (flag) words[count++] = p;
		p = strtok('\0'," ");
	}
	cout << "Changed text: " << endl;
	for (int i = 0; i < count ; i++) cout << words[i] << " ";
}

Вся соль в том, что программа удаляет последнее слово, но не удаляет слова одинаковые с ним. Прошу помощи в исправлении. Извиняюсь если как то не так оформил текст программы в посте. Спасибо.

Последний раз редактировалось Timosha; 29.05.2012 в 23:19.
Timosha вне форума Ответить с цитированием
Старый 29.05.2012, 23:52   #2
ps10n1ck
Пользователь
 
Аватар для ps10n1ck
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

Цитата:
Напечатать все симметричные слова отличные от последнего.
Я так понимаю тебе нужно из исходной строки удалить все слова которые совпадают с последним введенным словом в строке?
ps10n1ck вне форума Ответить с цитированием
Старый 30.05.2012, 00:11   #3
Timosha
 
Регистрация: 29.05.2012
Сообщений: 3
По умолчанию

Нужно оставить только симметричные слова, если они отличны от последнего.
Timosha вне форума Ответить с цитированием
Старый 30.05.2012, 00:28   #4
ps10n1ck
Пользователь
 
Аватар для ps10n1ck
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

что значит симметричные слова? я что-то не понял =) равные по размеру символов?

проще напишите сроку текста, и что должно получиться в результате работы - я так быстрее пойму, что нужно от программы

Последний раз редактировалось ps10n1ck; 30.05.2012 в 00:33.
ps10n1ck вне форума Ответить с цитированием
Старый 30.05.2012, 00:36   #5
Timosha
 
Регистрация: 29.05.2012
Сообщений: 3
По умолчанию

Дана строка: asdffdsa hfjhfd ghjjhg ytty sfdgh ytty.
Результат: asdffdsa ghjjhg.

Вот так)
Timosha вне форума Ответить с цитированием
Старый 30.05.2012, 06:31   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

очень плохой код, такой никто читать не будет.
Если решать вашу задачу "в лоб", то:
Первое что должна сделать программа - разделить текст на слова. Надо сохранить каждое слово отдельно. Было char*, стало char**; пусть массив слов называется words, количество слов nw;
пишите что-то такое:
Код:
for( i = 0; i < nw; i ++ )
    if( symm( words[ i ] && strcmp( words[ i ], words[ nw - 1 ] ) ) )
        cout << words[ i ];
Ну и на этом все
В задании сказано что надо использовать функции, вот и найдите в интернетах функцию проверки строки на симметричность и напишите функцию для разделения строки на слова (удобно stringstream тут использовать или strtok, но лучше первый вариант).

ну а по вашему коду:
я думаю, что void symm() должно проверять симметричность, но сделать это можно более элегантно, а еще, эта функция должна принимать строку в качестве аргумента, как минимум, и возвращать bool.

наверное, функция void del(char a[80]) удаляет что-то из строки. Зачем? Читайте внимательно задание.

походу, функцией void arr(char a[80]) вы пытаетесь разделить текст на слова, тогда непонятно зачем пишите это:
Код:
void lastw(char a[80])
{
	last = strrchr(a,' ');
	last = last+1;
}
в вашем случае последнее слово это b[n-1]. Хотя разделение на слова у вас проходит максимально криво ))

Цитата:
что значит симметричные слова? я что-то не понял =) равные по размеру символов?
однако, под симметричными имелись ввиду палиндромы.

Последний раз редактировалось Stilet; 30.05.2012 в 06:58.
rrrFer вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление слов из строк . С++ Purr Помощь студентам 3 21.09.2010 02:38
Удаление повторяющихся слов C vivo89 Помощь студентам 2 24.12.2009 09:18
Удаление слов из строки. grave123 Общие вопросы C/C++ 2 20.12.2009 15:01
Удаление слов из текста Gery Помощь студентам 24 22.09.2009 14:37
удаление одинаковых слов (С/С++) jewel Помощь студентам 1 12.12.2008 15:14