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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2010, 23:04   #1
Ronk
 
Регистрация: 12.01.2009
Сообщений: 6
По умолчанию Сортировка заглавных и строчных букв

Написал программу базы данных, необходимо сделать так, чтобы сортировка по тексту выполнялась независимо, написано оно с маленькой или заглавной буквы. То есть MOSCOW, Moscow и moscow должно воспринимать, как одинаковые названия.
Вот код проги, не могу никак сделать сортировку с учетом строчных и заглавных... Прошу помощи у опытных программистов!


Код:
#include <iostream.h>
#include <fstream.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <stdio.h>
#include <process.h>

struct inf {char tname[20];char country[15];int cost;int dlength;char transport[10];};
void prepfile(char* path);
void inputfile(char* path);
void viewfile(char* path);
void sortbyname(char* path);
void sortbycost(char* path);
void pickdata(char* path);
int requestopt();
int processopt(int option,char* path);

void main()
{

	int excode,act;
	char* fname;
	textbackground(0);
	clrscr();
	textbackground(2);
	window(2,2,25,3);
	clrscr();
	cout <<"Input file name \n";
	gotoxy(1,2);
	cin >>fname;
	prepfile(fname);
	excode=0;
	do 
	{
		act=requestopt();
		if ((act<7)&&(act>-1)) excode=processopt(act,fname);
	}
	while (excode==0);

}

void prepfile(char* path)
{
	FILE *f;
	if ((f=fopen(path,"r+b"))==NULL) f=fopen(path,"wb");
	fclose(f);
}
void inputfile(char* path)
{
	inf r;
	FILE *f;
	char *ended;

	f=fopen(path,"r+b");
	fseek(f,0,SEEK_END);
	do
	{
		window(27,14,79,24);
		clrscr();
		cout <<"Input excursion name ";
		cin >>r.tname;
		gotoxy(1,2);
		cout <<"Input country ";
		cin >>r.country;
		gotoxy(1,3);
		cout <<"Input cost ";
		cin >>r.cost;
		gotoxy(1,4);
		cout <<"Input length ";
		cin >>r.dlength;
		gotoxy(1,5);
		cout <<"Input transport name ";
		cin >>r.transport;
		gotoxy(1,6);
		fwrite(&r,sizeof(inf),1,f);
		cout <<"Again? y/n";
		cin >>ended;
	}
	while (ended=="y");
	fclose(f);
}

void viewfile(char* path)
{
	inf r;
	int i=2;
	FILE *f;
	int done;
	f=fopen(path,"r+b");
	cout <<"Name            Country        Cost Length Transport\n";
	do
	{
		gotoxy(1,i);
		done=fread(&r,sizeof(inf),1,f);
		if (done>0) {printf("%-15s %-15s %-4i %-5i %-10s\n",r.tname,r.country,r.cost,r.dlength,r.transport);};
		i++;
	}
	while (done>0);
	fclose(f);
}

void sortbyname(char* path) //Вот эта процедура сортировки
{
	FILE *f;
	inf r1,r2,buf;
	int done,changed,j;
	f=fopen(path,"r+b");
	do
	{
		changed=0;
		fseek(f,0,SEEK_SET);
		do
		{
			done=fread(&r1,sizeof(inf),1,f)+fread(&r2,sizeof(inf),1,f);
			j=strcmp(r1.tname,r2.tname);
			if ((done>1)&&(j>0))
			{
				fseek(f,ftell(f)-2*sizeof(inf),SEEK_SET);
				fwrite(&r2,sizeof(inf),1,f);
				fwrite(&r1,sizeof(inf),1,f);
				changed=1;
			};
			fseek(f,ftell(f)-sizeof(inf),SEEK_SET);
		}
		while (done>1);
	}
	while (changed==1);
	fclose(f);
}
void sortbycost(char* path) 
{
	FILE *f;
	inf r1,r2,buf;
	int done,changed;
	f=fopen(path,"r+b");
	do
	{
		changed=0;
		fseek(f,0,SEEK_SET);
		do
		{
			done=fread(&r1,sizeof(inf),1,f)+fread(&r2,sizeof(inf),1,f);
			if ((done>1)&&(r1.cost>r2.cost))
			{
				fseek(f,ftell(f)-2*sizeof(inf),SEEK_SET);
				fwrite(&r2,sizeof(inf),1,f);
				fwrite(&r1,sizeof(inf),1,f);
				changed=1;
			};
			fseek(f,ftell(f)-sizeof(inf),SEEK_SET);
		}
		while (done>1);
	}
	while (changed==1);
	fclose(f);
}

void pickdata(char* path)
{
	FILE *f,*l;
	char *dump;
	char *dp;
	int endf;
	inf r;
	f=fopen(path,"r+b");
	l=fopen("pick.txt","wt");
	dump="Name            Country        Cost Length Transport\n";
	fputs(dump,l);
	do
	{
		endf=fread(&r,sizeof(inf),1,f);
		if ((endf!=0)&&(r.cost>500)&&(r.dlength<10))
		{
			fprintf(l,"%-15s %-15s %-4i %-5i %-10s\n",r.tname,r.country,r.cost,r.dlength,r.transport);
		}
	}
	while (endf!=0);
	fclose(f);
	fclose(l);
}

int requestopt()
{
	int sitem;
	window(2,5,25,24);
	clrscr();
	cout <<"Select action:\n";
	cout <<"1) Add data\n";
	cout <<"2) View file\n";
	cout <<"3) Sort by name\n";
	cout <<"4) Sort by cost\n";
	cout <<"5) Pick data\n";
	cout <<"6) Exit\n\n";
	cin >>sitem;
	return sitem;
}
int processopt(int option,char* path)
{
	switch(option)
	{
		case 1: inputfile(path);break;
		case 2: {
				window(27,14,79,24);
				clrscr();
				window(27,2,79,12);
				clrscr();
				viewfile(path);
				break;
			}
		case 3: {
				window(27,2,79,12);
				clrscr();
				viewfile(path);
				window(27,14,79,24);
				clrscr();
				sortbyname(path);
				viewfile(path);
				break;
			}
		case 4: {
				window(27,2,79,12);
				clrscr();
				viewfile(path);
				window(27,14,79,24);
				clrscr();
				sortbycost(path);
				viewfile(path);
				break;
			}
		case 5: {
				window(27,14,79,24);
				clrscr();
				pickdata(path);
				window(27,2,79,12);
				clrscr();
				cout <<"Dump finished!";
				break;
			}
	}
	if (option==6) return 1;
	return 0;
}

Последний раз редактировалось Ronk; 27.02.2010 в 23:23.
Ronk вне форума Ответить с цитированием
Старый 27.02.2010, 23:12   #2
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Форматировать и выделять код в тег кто за тебя будет?

Если можно использовать STL, то используешь функцию sort и в структуре перегружаешь оператор <
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 27.02.2010, 23:12   #3
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Форматировать и выделять код в тег кто за тебя будет?

Если можно использовать STL, то используешь функцию sort и в структуре перегружаешь оператор <

Модер, delete please
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 27.02.2010, 23:16   #4
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Сравнивайте не сами строки, а строки, приведённые к верхнему (или нижнему) регистру
Код:
strcmp(toupper(str1), toupper(str2));
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 28.02.2010, 00:09   #5
Ronk
 
Регистрация: 12.01.2009
Сообщений: 6
По умолчанию

Вылетает куча ошибок, типа что int в char не перевести. Так как r.tname является адресом, а не строкой.
А как использовать именно саму строку, чтобы была возможность изменить ее?

Код:
j=strcmp((toupper(r1.tname), toupper(r2.tname));
Ronk вне форума Ответить с цитированием
Старый 28.02.2010, 00:18   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Ronk
функции toupper и tolower приводят не строку, а символ к нижнему/верхнему регистру. Greblin имел ввиду (я думаю) написать свою функцию, которая проверит строку, не обращая внимания на регистр
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 03.03.2010, 19:44   #7
Ronk
 
Регистрация: 12.01.2009
Сообщений: 6
По умолчанию

Всем спасибо, кто помогал. Проблему решил.
Всего-то навсего нужно было добавить функцию
Код:
j=strcmp (strupr(r1.tname),strupr(r2.tname));
Можно закрывать)
Ronk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование латинских заглавных букв в строчные на assembler lastochka Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 19.05.2013 11:58
перевод заглавных букв в строчные в вба peq Microsoft Office Excel 4 29.09.2009 23:31
Дан текст из строчных латинских букв и других знаков. Вычеркнуть из текста все гласные буквы." XeRoX Помощь студентам 6 15.06.2008 09:41
Перебор заглавных букв в слове =LeonZone= Общие вопросы Delphi 8 02.11.2007 14:59