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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2009, 21:21   #1
Roomper
Пользователь
 
Регистрация: 12.05.2008
Сообщений: 13
По умолчанию [C++] Задача на строки

Вот собственно условие:
Дан текст, состоящий из N (2<=N<=10) строк с максимальной длиной 80 символов. Необходимо вывести в обратном алфавитном порядке слова, являющиеся палиндромами. Считать, что текст написан синтаксически грамотно, в качестве знаков препинания используются точка и запятая, слова состоят только из букв, перенос слов по слогам отсутствует. Для выделения слов из строки и определения является ли они палиндромами, создать пользовательские функции.


А вот мои наброски:

Код:
#pragma hdrstop
#include <iostream.h>
#include <string.h>

char palindr()

int main(int argc, char* argv[])
{
	char text[10][80],str[80];
	int n,i,j;
	cout << "Vvedite kol-vo strok: ";
	cin >> n;

	cout << "Vvedite text: \n";

	for(i = 0; i <= n; i++)
	{
		cin.getline(str,80);
		for(j = 0; j < 80; j++)
		{
			text[i][j] = str[j];
		}
	}

	for(i=0;i <= n; i++)
	{
		cout << text[i] << "\n";
	}

	getchar();
	return 0;
}

char palindr()
{
	for(int i = 0; i <= n; i++)
	{

            }

}
Функцию я пока оставил, объявил лишь прототип. Вот такой вопрос у меня возник: как выделить слова из строки произвольных символов с пробелами? А потом как опредеить явл. ли они палиндромами? Подскажите хоть алгоритм, а там я уж сам как-нибудь разберусь.
Roomper вне форума Ответить с цитированием
Старый 03.04.2009, 21:28   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Вот такой вопрос у меня возник: как выделить слова из строки произвольных символов с пробелами? А потом как опредеить явл. ли они палиндромами? Подскажите хоть алгоритм, а там я уж сам как-нибудь разберусь.
Выделение слов:
Как вариант: идете посимвольно по строке и пишете эти символы в строку-буфер. Если встретили пробел или дошли до конца строки, то буфер сбрасываем куда нужно (например, в массив слов) и очищаем его.

Про палиндром: идете по слову до середины и проверяете.. Примерно так:
Код:
for(i=0;i<N/2;i++)
 if(str[i] != str[N-i-1])
   { слово не палиндром  }
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 06.04.2009, 14:59   #3
Roomper
Пользователь
 
Регистрация: 12.05.2008
Сообщений: 13
По умолчанию

С алгоритмами вроде разобрался, но столкнулся с другой проблемой.
Вот изменная программа:

Код:
#pragma hdrstop
#include <iostream.h>
#include <string.h>

//---------------------------------------------------------------------------

int words(char*, char);

int main(int argc, char* argv[])
{
	char text[10][80],str[80];
	char arr_words[100][20],words_palindr[100][20];
	int n,i=0,j;
	cout << "Vvedite kol-vo strok: ";
	cin >> n;
	cout << "Vvedite text: \n";
	for (i = 0; i <= n; i++)
	{
		cin.getline(str,80);
		strcpy(text[i],str);
		words(str,arr_words);
	}
	int length;
	int cp=0,t=1;
	for (i = 0; i <= j; i++)
	{
		length = strlen(arr_words[i]);
		for(int k = 0; k <= length/2; k++)
		{
			if (arr_words[i][k] != arr_words[i][length-k-1])
			{
				t = 0;
				break;
			}
		}
		if (t==1)
		{
			strcpy(words_palindr[i],arr_words[i]);
			cp++;
		}

	}

   	printf("______________ \n\n");
	for(int i = 0; i <= n; i++)
	{
		cout << text[i] << "\n";

	}

	printf("Palindromi: \n\n");

	for(int i = 0; i <= cp; i++)
	{
		cout << words_palindr[i] << "\n";

	}
	getchar();getchar();
	return 0;
}

int words(char *str, char array_of_words[][])
{
	char *p;
	int j;
	p = strtok(str," .,!\n");
		for (j = 0; p; j++)
		{
			strcpy(array_of_words[j],p);
			p=strtok(NULL, " .,!\n");
		}
	return j;
}
При компиляции выводит следующее:

Цитата:
[C++ Error] Unit1.cpp(29): E2034 Cannot convert 'char ( *)[20]' to 'char'
[C++ Error] Unit1.cpp(29): E2340 Type mismatch in parameter 2 (wanted 'char', got 'char ( *)[20]')
[C++ Error] Unit1.cpp(75): E2453 Size of the type 'char[]' is unknown or zero
[C++ Error] Unit1.cpp(82): E2453 Size of the type 'char[]' is unknown or zero
Проблема с передачей параметров в функцию. Никак не пойму эти указатели на чары... помогите разобраться.
Roomper вне форума Ответить с цитированием
Старый 06.04.2009, 15:51   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Во-первых:
Код:
int words(char*, char);
А в описании функции:
Код:
int words(char *str, char array_of_words[][])
Во-вторых, так вообще нельзя.
Надо:
Код:
int words(char *str, char array_of_words[][20])
После этого исправления программа запустится, но не будет работать как надо.

Ошибок много. Уже не помню всего, что исправил. Вот несколько:
В функции отделения слов:
Код:
return j;
Возвращаете j, но не используете его:
Код:
words(str,arr_words);
Там еще много ошибок было связано с j.
---------------
вот тут:
Код:
strcpy(words_palindr[i],arr_words[i]);
надо
Код:
strcpy(words_palindr[cp++],arr_words[i]);
иначе будет бред.
----------------
В цикле, где слово проверяется на "палиндромность" после первого же непалиндрома, все остальные тоже будут считаться непалиндромами, т.к. t все время = 0.
--------------

В общем, все исправил.
Код:
#include <iostream.h>
#include <string.h>
#include <stdio.h>

//---------------------------------------------------------------------------

int words(char*, char[][20],int);

int main(int argc, char* argv[])
{
	char text[10][80],str[80];
	char arr_words[100][20],words_palindr[100][20];
	int n,i=0,j=0;
	cout << "Vvedite kol-vo strok: ";
	cin >> n;
	cout << "Vvedite text: \n";
	for (i = 0; i <= n; i++)
	{
		cin.getline(str,80);
		strcpy(text[i],str);
		j = words(str,arr_words,j);
	}

	int length;
	int cp=0,t=1;
	for (i = 0; i < j; i++)
	{
		length = strlen(arr_words[i]);
		t = 1;
		for(int k = 0; k < length/2; k++)
		{
			if (arr_words[i][k] != arr_words[i][length-k-1])
			{
				t = 0;
				break;
			}
		}
		if (t==1)
			strcpy(words_palindr[cp++],arr_words[i]);

	}
   	printf("______________ \n\n");
	for(int i = 0; i <= n; i++)
	{
		cout << text[i] << "\n";

	}

	printf("Palindromi: \n\n");

	for(int i = 0; i < cp; i++)
	{
		cout << words_palindr[i] << "\n";

	}
	getchar();
	return 0;
}
//-------------------------


int words(char *str, char array_of_words[][20],int start)
{
	char *p;
	int j;
	p = strtok(str," .,!\n\0");
		for (j = start; p; j++)
		{
			strcpy(array_of_words[j],p);
			p=strtok(NULL, " .,!\n\0");
		}
	return j;
}
-----------
Замечание вдогонку: раз уж вы пишете на C++, то почему бы не использовать класс string вместо си-строк?
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.04.2009, 18:25   #5
Roomper
Пользователь
 
Регистрация: 12.05.2008
Сообщений: 13
По умолчанию

Вот спасибо, все работает! Насчет класса string: сначала решил взяться за массив чаров, чтоб во всем разобраться, в том числе и с указателями. Но как оказалось, надо было бы сразу перейти на string, что намного проще и понятнее.
Roomper вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки Stiff Помощь студентам 6 26.03.2009 22:47
Задача на строки LaSeule Помощь студентам 2 31.01.2009 00:54
Задача на строки Juhn Паскаль, Turbo Pascal, PascalABC.NET 1 13.05.2008 16:10
задача на строки Hostlman Помощь студентам 2 26.12.2007 03:17