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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2012, 21:48   #1
RayBM
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 2
Печаль C++(Visual). Работа со строками.

Задача:
Дан текст, состоящий из N (2<=N<=10) строк с максимальной длиной 80 символов.
Необходимо вывести в обратном алфавитном порядке те слова,
длина которых не превышает K символов.
Считать, что текст написан синтаксически грамотно,
в качестве знаков препинания использу-ются точка и запятая,
слова состоят только из букв, перенос слов по слогам отсутствует.
Для выделения слов из строки создать пользовательскую функцию.
Код:
Код:
#include "stdafx.h"
#include <iostream>
#include <string>
int NewWords(char* string);
bool GetWord(char* string, char* word, int& wordSet);
int _tmain(int argc, _TCHAR* argv[])
{
	char String[81] = {0};
	int SizeString = 80;
	int n,k;
	std::cout << "How a lot of symbols in the word?" << std::endl;
	std::cin >> k;
	std::cout << "How a lot of strings you will use?" << std::endl;
	
	do{
	std::cin >> n;
	std::cin.get();
	}while(n<2 || n >= 10);

	char **Strings = new char* [n];
	std::cout << "Please enter strings." << std::endl;
	for(int i = 0; i < n; i++)
	{
		Strings[i] = new char [81];
		gets(String);
		strcpy(Strings[i],String);
	}

	int nsws = 0;
	for(int i = 0; i < n; i ++)
		nsws+=NewWords(Strings[i]);
	char **NewStrings = new char* [nsws];
	for(int i = 0; i < nsws; i++)
		NewStrings[i] = new char [80];

	int z;
	for(int s = 0; s < n; s++)
	{
		int wordSet = 0;
		int i = 0;
		while (GetWord(Strings[s],String,wordSet))
		{
			if(k>(int)strlen(String))
			{
				strcpy(NewStrings[i],String);
				z = i++;
			}
		}
	}
	//Сортируем в обратном алфавитном порядке
	for(int i = 0; i < z - 1; i++)
		{
		for(int j = i + 1; j < z; j++)
		if( strcmp(NewStrings[i] , NewStrings[j]) < 0 )
			{
		char* tmp = NewStrings[i];
		NewStrings[i] = NewStrings[j];
		NewStrings[j] = tmp;
			}
		}

	for(int i = 0; i < n; i++)
		puts(NewStrings[i]);
	system("pause");
	return 0;
}

int NewWords(char* string)
{
	int rw = 0;//переменная за подсчет количества слов в строке
	int dop = 0,dop2 = 0;
	for(int i = 0; string[i]!='\0'; i++)
	{
		if(string[i] == ' '|| string[i] == ',' || string[i] == '.' || string[i] == '\t')
		{
			dop++;
			if(dop-1>dop2) rw--;
			rw++;
		}
		else
		{
			dop = 0;	
		}
	}
	return rw;
}

bool GetWord(char* string, char* word, int& wordSet)
{
	if(!string[wordSet])
		return false;
	char *p1, *p2;
	p1 = p2 = string + wordSet;
	for(int i = 0; i < (int)strlen(p1) && !isalnum(p1[0]); i++)
		p1++;
	if(!isalnum(p1[0]))
		return false;
	p2 = p1;
	while(isalnum(p2[0]))
		p2++;
	int lenght = int (p2-p1);
	strncpy(word,p1,lenght);
	word[lenght] = '\0';
	for(int i = int(p2-string); i < (int)strlen(string) && !isalnum(p2[0]);i++)
		p2++;
	wordSet = int(p2-string);
}
Суть проблемы:
Когда выводит слова, то их количество равно количеству строк.
Пример:
6, 2.(не более 6 букв и 2 строки на вводе).
-Ввод-
Hello world.
I like it.
-Выводит-
like
I
Подозреваю, что проблема где-то здесь:
Код:
	int z;
	for(int s = 0; s < n; s++)
	{
		int wordSet = 0;
		int i = 0;
		while (GetWord(Strings[s],String,wordSet))
		{
			if(k>(int)strlen(String))
			{
				strcpy(NewStrings[i],String);
				z = i++;
			}
		}
	}
RayBM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со строками в Visual Studio С++ 2008 Nubster Помощь студентам 1 11.02.2011 21:29
Работа со строками(visual c++) Vitalka Помощь студентам 3 17.12.2010 13:08
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
работа со строками в visual c++ 6.0 MURREX Помощь студентам 1 09.12.2008 10:57
Задача в Visual C++ 6.0, работа со строками Serezhik Visual C++ 6 30.11.2008 20:31