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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2010, 20:36   #1
yugik
Пользователь
 
Аватар для yugik
 
Регистрация: 04.01.2010
Сообщений: 23
По умолчанию Сортировка строк по алфавиту

Условие: Дана строка слов разделенных запятыми, в конце строки точка.
Задача: Вывести на экран все слова остортированные в алфавитном порядке. (кириллицу можно не использовать)

Я знаю что можно как-то использовать функцию strcmp () но никак не могу разобраться как.

Вот мой вариант кода, но мне кажеться сильно замудренный от того и запутался наверное.

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

using namespace std;
void filter(char *string, int n, int x, char **new_str)
{
		for (int i=0, j=0;i<n;i++)
			if (string[i]!=','||string[i]!='.')
			{
				*new_str[j]=string[i];
			}
			else
			{
				j++;
				continue;
			}
		
	
}

void main ()
{
	char *string = new char [100];
	int x=0,n=0,y=0;

	gets(string);
	n = strlen (string);
	for (int i=0;i<n;i++)
	{
		if (string[i]==','||string[i]=='.')
			x++;
	}
	char **new_str = new char* [x];
	for (int i = 0; i<x;i++)
	{
		new_str = new char*[20];
	}	
	filter (string,n,x,new_str);

	for (int i=0;i<x;i++)
	{
		puts(new_str[i]);
		cout<<"\n";
	}
	delete [] string;
	for (int i=0;i<x;i++)
	{
		delete [] new_str[i];
	}
	delete [] new_str;
}
Прошу помочь с решением, если можно с небольшими комментариями для понимания.
yugik вне форума Ответить с цитированием
Старый 20.05.2010, 22:54   #2
psihadelic
Пользователь
 
Регистрация: 17.11.2009
Сообщений: 26
По умолчанию

Код:
#include <iostream>
using namespace std;
#include <string>
void sort(string st)
{
	for (int i = 0; i < st.length(); i++)
		for (int j = 0; j <st.length(); j++)
		{
			int a = int(st[j]);
			int b = int(st[j+1]);
			if (a > b)
			{
				char buf = st[j];
				st[j] = st[j+1];
				st[j+1] = buf;
			}
		}
	cout<<st<< "\n";
};
void main()
{
	string str = "asdfewrfwefd";
	sort(str);
}
Тут работа чисто с типом string, если выложу об этом статью на свой блог, дам знать) Но это будет не скоро)
psihadelic вне форума Ответить с цитированием
Старый 21.05.2010, 09:47   #3
yugik
Пользователь
 
Аватар для yugik
 
Регистрация: 04.01.2010
Сообщений: 23
По умолчанию

Вообщем спасибо за попытку, но что-то этот код не работает. В своем коде я пытался занести каждое слово от запятой до запятой в отдельный подмассив многомерного массива. После чего можно былобы сравнивать их по старшинству и сортировать внутри многомерного массива. но от чегото при выводе в массивы записываеться не верные значения:
Код:
cat,world,hand,sun,happy.
.═══════════════════¤¤¤¤g       x◄▐`

════════════════════¤¤¤¤h       y▼▐hэC

════════════════════¤¤¤¤h       y▼▐иэC

════════════════════¤¤¤¤h       y▼▐шэC

════════════════════¤¤¤¤P       x&▐`☻

Для продолжения нажмите любую клавишу . . .
Помогите кто-нибудь разобраться, где ошибка заключаеться?
yugik вне форума Ответить с цитированием
Старый 21.05.2010, 12:23   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
#include <iostream>
#include <cstring>

using namespace std;

void filter(const char* str, char** destlist);
void sort(char** strlist, int strcnt);

int main()
{
	char   str[80];
	char** strlist;
	int    delimcnt = 0;

	cin.getline(str, 80);
	
	for(int i = 0; str[i] != '\0'; i++)
		if(str[i] == ',' || str[i] == '.')
			delimcnt++;

	if(delimcnt == 0) {
		cout << "Wrong input string\n";
		return 1;
	}

	strlist = new char*[delimcnt];
	for(int i = 0; i < delimcnt; i++)
		strlist[i] = new char[20];

	filter(str, strlist);
	sort(strlist, delimcnt);

	for(int i = 0; i < delimcnt; i++)
		cout << strlist[i] << endl;

	return 0;
}

void filter(const char* str, char** destlist)
{
	for(int i = 0, j = 0, k = 0; str[i] != '\0'; i++) {
		if(str[i] == ',' || str[i] == '.') {
			// Если j не равно нулю, то прибавить единицу, дабы не скопировать запятую
			strncpy(destlist[k], str + j + (j != 0), i - j - (j != 0));
			destlist[k][i-j] = '\0';
			k++;
			j = i;
		}
	}
}

void sort(char** strlist, int strcnt)
{
	for(int i = 0; i < strcnt - 1; i++)
		for(int j = i + 1; j < strcnt; j++)
			if(strcmp(strlist[i], strlist[j]) > 0) {
				char* tmp = strlist[i];
				strlist[i] = strlist[j];
				strlist[j] = tmp;
			}
}
Вот рабочий вариант, немного переделанная ваша программа )

Последний раз редактировалось netrino; 21.05.2010 в 12:25.
netrino вне форума Ответить с цитированием
Старый 21.05.2010, 14:01   #5
yugik
Пользователь
 
Аватар для yugik
 
Регистрация: 04.01.2010
Сообщений: 23
Хорошо

Огромное спасибо! Отличное решение!
yugik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка строк по алфавиту Tsvetochek Microsoft Office Excel 2 10.05.2010 21:43
Сортировка по алфавиту DimOn4Ik БД в Delphi 3 17.04.2010 06:48
сортировка списка строк по алфавиту -GT- Общие вопросы C/C++ 0 26.11.2009 20:27
Сортировка строк по алфавиту в структуре с помощью указателей Anarki Общие вопросы C/C++ 2 23.10.2009 19:36