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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2011, 22:47   #1
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию Сравнение строк в C++

Ребятки, всем привет! Возникла такая проблемка в сортировке массива из строк на си++. Строки должны быть упорядочены по алфавиту, а если юзать функцию strcmp то если на входе массив был скажем такой

enbq
rinnekyhetz
ikcpj
fnb
bcvrpov
knshrz
xl
jtxfglxvz

то на выходе получаю такой и нифига не по алфавиту

bcvrpov
enbq
rinnekyhetz
ikcpj
fnb
jtxfglxvz
knshrz
xl

Сортировка идёт по ключу это поле k (если я правильно называю его полем)
Ребятки, как быть, помогите... может вместо strcmp что-нить написать своё?
вот исходник если ещё какие кривости увидите напишите, это моя первая прога на си++
Код:
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define advbubble
int const nmax=1000;
typedef char data[12], key[12];
typedef struct {data d; key k;} item;
typedef struct {item items[nmax+1]; int count;} structure;

void fillstructure(structure& s, int n) {
	int i, j, l;
	s.count=0;
	for (i=1; i<=n; i++) {
		l=1+random(11);
		for (j=0; j<l; j++)
			s.items[i].d[j]=(char)random(256);
		s.items[i].d[l]='\0';
		l=1+random(11);
		for (j=0; j<l; j++)
			s.items[i].k[j]=(char)((int)'a'+random(26));
		s.items[i].k[l]='\0';
		s.count++;
	}
}
void sort(structure& s) {
	int i, j, saved, last;
	item buf;
	last=1;
	saved=0;
	while (last!=saved) {
		saved=last;
		for (j=s.count; j>last; j--) {
			if (strcmp(s.items[j].k, s.items[j-1].k)<0) {
				buf=s.items[j];
				s.items[j]=s.items[j-1];
				s.items[j-1]=buf;
			}
		}
	}
}
int main(int numberofargs, char* szargs[]){
	randomize();
	structure s;
	fillstructure(s, 8);
	int i;
	for (i=1; i<=8; i++)
		cout<<i<<' '<<s.items[i].k<<'\n';
	cin.get();
	sort(s);
	for (i=1; i<=8; i++)
		cout<<i<<' '<<s.items[i].k<<'\n';
	cin.get();
	return 0;
}

Последний раз редактировалось Camaro Chevelle; 12.11.2011 в 22:56.
Camaro Chevelle вне форума Ответить с цитированием
Старый 12.11.2011, 23:42   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Это не C++ ни разу. Это чистейший C, к которому прицепили iostream.

А ошибка тут в алгоритме сортировки, strcmp ни при чем )
Son Of Pain вне форума Ответить с цитированием
Старый 13.11.2011, 00:13   #3
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

аналогичная (вроде бы) прога на паскале работает, в чём разница не вижу

Код:
Procedure Sort(Var Structure: Structure);
  Var
    i, j , Saved, Last: LongInt;
    Buf: Item;
  Begin
    With Structure Do Begin
        Last:=1; saved:=0;
        while saved<>last do begin
          Saved:=Last;
          For j:=Count DownTo Last+1 Do
            If Item[j].Key<Item[j-1].Key Then Begin
              Buf:=Item[j];
              Item[j]:=Item[j-1];
              Item[j-1]:=Buf;
              Last:=j;
            End;
        end;
    end;
  end;
да, забыл сказать. нашёл казалось бы ошибку, на си не хватало команды last=j, исправил, но проблема осталась

Последний раз редактировалось Camaro Chevelle; 13.11.2011 в 00:15.
Camaro Chevelle вне форума Ответить с цитированием
Старый 13.11.2011, 01:01   #4
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

народ, я нашёл ошибку, там надо было for (j=s.count; j>saved; j--) конечно же. очевидная ошибка. но вопрос тогда такой. почему паскаль правильно работает????????
Camaro Chevelle вне форума Ответить с цитированием
Старый 13.11.2011, 12:12   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

потому что есть великая разница в нумерации массивов на С и Паскале )
p51x вне форума Ответить с цитированием
Старый 13.11.2011, 23:38   #6
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

в чём она так велика-то? в индексации в си с нуля, а в паскале откуда захочу?
Camaro Chevelle вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк Corvette Общие вопросы C/C++ 4 11.09.2011 23:42
Сравнение строк Dasharnb777 Общие вопросы .NET 5 22.09.2010 20:46
Макрос на сравнение и подсчет в первом столбце строк, и сумирование значений этих строк в другом столбце Shpr0T Microsoft Office Excel 8 30.08.2010 17:52
Сравнение строк Jasper92 Общие вопросы C/C++ 6 23.12.2009 12:49
Сравнение строк Rivendell Microsoft Office Excel 8 18.12.2009 10:29