Доброе время суток! В программировании понимаю слабо, надо хоть как-то сдавать курсовую. Задание - Составить программу на Си для сортировки таблицы заданным методом и двоичного поиска по ключу в таблице. Метод простой вставки. Таблица - Целое число | Вещественное число . Подобная проблема разбиралась здесь -
http://programmersforum.ru/showthread.php?t=53542 .
Есть рабочий код, но не совсем моё задание - здесь идёт работа с текстом. Помогите исправить код :<
Код:
#include<stdio.h>
#include<string.h>
#define MAXSTRING 100
#define MAXELEM 100
#define SIZE 2
typedef struct ln{
double key;
char str[MAXSTRING];
int size;
}line;
//не, всмысле если отдельно, то ключи в одном файле,данные в другом,
//вместе, то примерно так : ключ1 X
//------------------------------file read
void readf(FILE *fl,line **st){
int a=1;
while ( fscanf(fl,"%lf",&st[st[a]->size]->key)!=EOF ){
fscanf(fl,"%lf",&st[st[a]->size]->key);
fgets(st[st[a]->size]->str,MAXSTRING,fl);
st[a]->size++;
}
st[a]->size--;
}
//------------------------------Сортировка по возрастанию (метод простых вставок).
void ssort(line **st){
int l=0,a=1,r,k,i,j;
double temp;
char stemp[MAXSTRING];
r=st[a]->size;
for( i = 0; i<r; i++ )
for (j=i+1;j<r+1;j++)
if(st[i]->key>st[j]->key){
temp=st[i]->key;
strcpy(stemp,st[i]->str);
st[i]->key=st[j]->key;
strcpy(st[i]->str,st[j]->str);
st[j]->key=temp;
strcpy(st[j]->str,stemp);
l++;
}
if (l==0)
printf("File was already sorted!n");
}
//------------------------------Двоичный поиск
void bsearch (line **st){
int m,a=1;
int left=0,right=st[a]->size;
double key;
printf("Enter key: ");
scanf("%lf",&key);
for(;;){
m=(left+right)/2;
if (key<st[m]->key)
right=m - 1;
else if ( key>st[m]->key)
left=m + 1;
else {
printf("Key is found:n%lft%sn",st[m]->key,st[m]->str);return;
}
if ( left > right ){printf("Key not foundn"); return;}
}
}
//------------------------------unsorted print(вывод содержимогого файла на экран)
void unsprint(FILE *fl,line **st){
int a=0;
int i=1;
char c[MAXSTRING];
//float k;
printf("Key Elementn");
fseek(fl,0,SEEK_SET);
while ( a <= st[i]->size ){
//fscanf(fl,"%f",&k);
fgets(c,MAXSTRING,fl);
printf("%s",c);
a++;
}
}
//------------------------------file print(печать после действия - сортировка или рассеивание)
void sprint(line **st){
int i,a=1;
if ( st[a]->size > 0 ){
printf("KeyttElementn");
for(i=0;i<=st[a]->size;i++)printf("%lft%s",st[i]->key,st[i]->str);
}
else{printf("Struct is emptyn");return;}
}
//-----------------рассеивание (перераспределяет строки)
void revers(line **st){
int l=0,a=1,r,k,i,j;
int temp;
char stemp[MAXSTRING];
r=st[a]->size;
while(l<r){
int i;
for(i=0; i<=r/2-1; i++){
temp=st[i]->key;
strcpy(stemp,st[i]->str);
st[i]->key=st[r-1-i]->key;
strcpy(st[i]->str,st[r-1-i]->str);
st[r-1-i]->key=temp;
strcpy(st[r-1-i]->str,stemp);
}
--r;
}
}
//------------------------------menu
int menu(){
int m;
printf("Program menu:n");
printf("1 - Sortn");
printf("2 - Unsortn");
printf("3 - Line searchn");
printf("4 - Print filen");
printf("5 - Print resultn");
printf("6 - Exitn");
printf("nEnter action: ");
scanf("%d",&m);
return m;
}
//=======================================main
int main(int argc,char *argv[]){
char *fn;
FILE *f;
int i;
int m;
int z=0;
line st[MAXELEM],*stadr[MAXELEM];
for(i = 0;i < MAXELEM; ++i)stadr[i] = &st[i];
//if ( argc < 2 ) {printf("Invalid argumentsn"); return 1;} else
fn=argv[1];
if( (f=fopen(argv[1],"r")) == NULL ) {printf("File doesn't existsn"); return 1;}
readf(f,stadr);
while(1){
m=menu();
switch(m){
case 1:{ssort(stadr);z=1;break;}
case 2:{revers(stadr);z=1;break;}
case 3:{if ( z )bsearch(stadr);else printf("You should sort firstn");break;}
case 4:{unsprint(f,stadr);break;}
case 5:{if ( z ) sprint(stadr);else printf("You should sort firstn");break;}
case 6:{fclose(f);return 0;}
default:{printf("nInvalide menu actionn");return 0;}
}
}
}