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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2012, 02:25   #1
omg_fap_fap
Новичок
Джуниор
 
Регистрация: 20.06.2012
Сообщений: 4
По умолчанию Сортировки и поиск (Си)

Доброе время суток! В программировании понимаю слабо, надо хоть как-то сдавать курсовую. Задание - Составить программу на Си для сортировки таблицы заданным методом и двоичного поиска по ключу в таблице. Метод простой вставки. Таблица - Целое число | Вещественное число . Подобная проблема разбиралась здесь - 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;}

    }

  }

}
omg_fap_fap вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
Сортировки SVing Паскаль, Turbo Pascal, PascalABC.NET 3 06.04.2012 10:31
Сортировки Sunless Помощь студентам 0 04.04.2011 17:42
Сортировки и поиск (таблица) (Си) Many Помощь студентам 3 12.06.2009 21:27
поиск кратчайшей сортировки, с минимальным кол-вом перестановок sad8c Помощь студентам 9 14.12.2007 10:23