Программирование

Сортировка строк на С++

,

Программирование

Дата публикации:

nvova, 14.05.2007 - 20:38

Имеется структура типа "s".
CODE

struct s
{
...
char rab[30];
...
};

Сортирую строки (qsort):
CODE
int compare(const void *a,const void *b)
{   return( strcmp((*(s*)a).rab,(*(s*)b).rab) );  }

Возник вопрос куда впихнуть "(char *)" или что-то вроде этого, чтоб чтоб не возникала ошибка:
cannot convert parameter from char to int.
Пробовал по всякому, но чего-то не выходит sad.gif

yah, 14.05.2007 - 20:50

Что-то я не въеду вот в это:
CODE

strcmp((*(s*)a).rab

nvova, 14.05.2007 - 20:57

strcmp
Собственно должна сравнивать 2 строки smile.gif

Делал по найденному примеру:

CODE

int compare( const void *a, const void *B)
{
  return( strcmp((char *)a,(char *)B) );
}

Только тут нет структуры

yah, 14.05.2007 - 21:00

Если я не ошибаюсь, то прототип у этой функции такой:
CODE

strcmp(const char *, const char *)

nvova, 14.05.2007 - 21:03

QUOTE(yah @ 14.05.2007 - 22:00)
Если я не ошибаюсь, то прототип у этой функции такой:
*


Подскажи, плиз, тогда где я тупанул?

yah, 14.05.2007 - 21:03

Стоп, напиши нормально код, а то в первом случае в ретурне у тебя strcmp((*(s*)a).rab, а во втором strcmp((char *)a,(char *)cool.gif

nvova, 14.05.2007 - 21:07

Первый случай как у меня в программе. Второй случай просто найденный в мануале пример.

yah, 14.05.2007 - 21:14

я бы сделал так:
CODE

#include <cstring>


struct s
{
char rab[30];
}my,my1;

int compare(const s* struct1, const s* struct2);



int main()
{
int a=compare(&my,&my1);
return 0;
}



int compare(const s* struct1,const s* struct2)
{
int result;
result=strcmp(struct1->rab,struct2->rab);
return result;

}

nvova, 14.05.2007 - 21:20

Ок. Буду пробовать...

yah, 14.05.2007 - 21:23

Только не забудь отписаться о результате.

Штуцер, 14.05.2007 - 22:05

Совершенно согласен с Яхом, одно маленькое "но": разные компиляторы содержат свои собственные библиотеки для работы со строками, поэтому можно включать
CODE
#include <cstring>

или
CODE
#include <cstring.h>

или
CODE
#include <string.h>

или
CODE
#include <string>

хоть что-то, да должно сработать. Верно, Ях?

yah, 14.05.2007 - 22:19

Верно, можно еще просто подключить windows.h. Тоже компилируется нормально.

З.Ы. Ты первый, кто написал по-русски мой ник. Аж непривычно как-то smile.gif

nvova, 2.06.2007 - 13:39

Курсач и др., наконец, сдал smile.gif
Вобщем в первом посту у меня правильно. Извиняюсь за беспокойство, ошибка была в другом.

Возник еще такой вопрос:
Искал информацию по блокировке файла на запись при определенных определенных операциях, но инфы куча для Линукса, а как это сделать в винде че-то не нашел. Если можно, объясните примером.

Niuk, 15.11.2008 - 3:44

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

Вот пример.
Code

#include <fstream.h>  
#include <string.h>  
#include <conio.h>  
#include <iomanip.h>  
#include <stdlib.h>  
#include <io.h>  
#define ID 4  
#define DATA 9  
#define TIME 6  
#define NAME 12
   
struct ychet  
{  
char id[ID];    
char data[DATA];  
char time[TIME];    
char name[NAME];     
};    

void sort();   // Функция сортировки строк из файла с последюущей записью в файл (можно создать новый файл) и выводом на экран.  
{  
что тут писать и по возможности, как это работает?  
};  


Пример файла для сортировки (сортировку произвести по полю id)
Code

1  //id
12.10.07 //data
12-23  //time
Петров  //name
4
12.05.08
14-56
Иванов
2
30.11.07
15-00
Сидоров

Конечный файл
Code

1  //id
12.10.07 //data
12-23  //time
Петров  //name
2
30.11.07
15-00
Сидоров
4
12.05.08
14-56
Иванов

yah, 18.11.2008 - 18:47

Цитата | Quote(Niuk @ 15.11.2008 - 4:44)
Пример файла для сортировки (сортировку произвести по полю id)
*


А заранее известно кол-во строк в файле?

Niuk, 18.11.2008 - 19:52

Цитата | Quote(yah @ 18.11.2008 - 19:47)
А заранее известно кол-во строк в файле?
*


Нет, это всеголишь одна из немногих функций из программы работы с БД
То есть программа так же должна пополнять, удалять и отменять изменения в файле, Проводить поиск по заданому полю.
Всё остальное реализовано кроме сортировки.
Как сдам(если сдам) курсовик выложу его в ветке "учимся в месте".

yah, 19.11.2008 - 0:38

Цитата | Quote(Niuk @ 18.11.2008 - 20:52)
struct ychet 

char id[ID];   
char data[DATA]; 
char time[TIME];   
char name[NAME];   
};
*



Цитата | Quote(Niuk @ 15.11.2008 - 4:44)
Пример файла для сортировки (сортировку произвести по полю id)
*



1. Если я не ошибаюсь, то сортировать по массивам нельзя, отсюда следуют пункты...
2. Поле ID - точно массив?
3. ...Точно типа char?

Niuk, 19.11.2008 - 2:54

Исходник полностью рабочий компилируется bc++ v3.1
В структуре ychet все поля типа чар. Сортировка нужна по выбранному полю, но для примера подойдет и первое поле id[ID]
» Исходник «

yah, 19.11.2008 - 8:21

Цитата | Quote(Niuk @ 19.11.2008 - 3:54)
В структуре ychet все поля типа чар. Сортировка нужна по выбранному полю, но для примера подойдет и первое поле id[ID]
*


Смотри, допустим даны числа 1 3 5 2. Чтобы их отсортировать (например по возрастанию), нужно их сравнить между собой... А если вместо чисел - массивы? Как тогда? Как ты определишь что, например, массив А больше массива Б ? Скорее всего поле ID должно быть простого типа (int например)...

yah, 19.11.2008 - 12:31

Принимай, только я бы на твоем месте, прежде чем использовать, все перепроверил бы раз 10 smile.gif

» Нажмите, для открытия спойлера | Press to open the spoiler «

Niuk, 20.11.2008 - 22:32

Есть проблемма вот с этим.
Цитата | Quote(yah @ 19.11.2008 - 13:31)
using namespace std;

Что это мой компилятор ругается.
П.С. BC++ v3.1

yah, 20.11.2008 - 23:36

Цитата | Quote(Niuk @ 20.11.2008 - 23:32)
Что это мой компилятор ругается.
П.С. BC++ v3.1
*


А почему именно этот компилятор, а не билдер или VC++ (я компилировал из-под Visual Studio 6) ну или на крайняк BC++ 5.5.1 ?

Niuk, 21.11.2008 - 1:17

Чтобы препод мог нормально исходник компилить.
П.С. в цикле есть ошибка, в том который определяет кол-во строк (он был бесконечным).
Пришлой включить мозг и отшлейфовать немного =))
Спасибо тебе за наводку.
» Исходник 100% работает на bc++ v3.1 «

yah, 21.11.2008 - 13:35

Цитата | Quote(Niuk @ 21.11.2008 - 2:17)
П.С. в цикле есть ошибка, в том который определяет кол-во строк (он был бесконечным).
*


Скорее всего это из-за BC++ v3.1 , т.к. я собирал под VS 6.0 и все работало.

alikaaaa, 13.12.2008 - 1:09

мне нужно прогу написать в с++.Слова, одинаково читающиеся справа налево и слева направо


версия для печати -> Полная версия

SoftoRooM © 2004-2024