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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2009, 08:26   #1
Petruha-nsk
Пользователь
 
Аватар для Petruha-nsk
 
Регистрация: 10.04.2009
Сообщений: 69
По умолчанию не могу найти ошибку в бинарном поиске элемента для таблицы

У меня вот такое условие задачи:
"В файле содержатся результаты работы цеха за день. Элемент файла
включает: шифр изделия ( 8 - символьный код ), наименование изделия,
количество (штук). Построить таблицу из этих данных, считая ключом шифр изделия. Содержащаяся в файле информация с равными ключами должны быть помещена в таблицу один раз с общим количеством штук изделия. Организовать таблицу как: упорядоченную.
Затем построенную таблицу дополнить информацией о цене изделия. Цену изделия брать из таблицы – прейскурант, элемент которой содержит: шифр изделия, цена. Эта таблица упорядочена по возрастанию шифров изделий. Упорядочить преобразованную таблицу по новому ключу – количество изделий методом:прямого включения; для поиска элементов в таблице использовать: бинарный поиск."

из всего этого я написал порграмму

Код:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define N 10
#define K 20
#define M 9

struct pole  {char shifr[M]; char name_product[K]; int kol_vo;}; //1-st table
struct table {pole elem[N]; int n;};

struct zeny{char shifr[M]; int stoimost;}; // table with shifr & stoimost'ju
struct zeny_tabl{zeny mass[N]; int z;};

struct pole_for_new_table{char shifr[M]; char name_product[K]; int kol_vo; int stoimost;}; // 2-nd table
struct new_table {pole_for_new_table data[N]; int k;};

///////////POLOZHIT///////////////
int polozhit (table *p, pole *isdelie)
{ int t,k;

  t=0;
  while( (t < p->n)&&(strcmp(p->elem[t].shifr, isdelie->shifr)<0) )
  {
	t++;
  }

  if (t == p->n)
  {
  }
  else
  {
	if ( strcmp(p->elem[t].shifr, isdelie->shifr)==0 )
	{
		p->elem[t].kol_vo += isdelie->kol_vo;
		return 1;
	}
  }

			if (p->n < N)
			{
				k=p->n;
				while(k>t)
				{
					p->elem[k]=p->elem[k-1];
					k--;
				}
				p->elem[t]= *isdelie;
				p->n++;
				return 1;
			}
		  return 0;
}
///////////VYVOD////////////////////
void vyvod(new_table *p, FILE *out)
{
	fprintf(out, "Max kol-vo elementov=%d \n", p->k);

	fprintf (out, "Shifr    Name   Kol-vo  Stoimost'\n ");
    for(int i=0; i<p->k; i++)
    {
	fprintf (out, "%s", p->data[i].shifr);
	fprintf (out, " %s", p->data[i].name_product);
	fprintf (out, " %d", p->data[i].kol_vo);
	fprintf (out, " %d\n", p->data[i].stoimost);
    }
}
/////////BINARNIY POISK///////////////
int binarniy_poisk(zeny_tabl *R, char *x)
{
	int niz,sred,verh,P;

	P=1; verh=0; niz = R->z - 1;
	do
	{
		sred = (niz - verh)/2;
		if(strcmp(x, R->mass[sred].shifr)==0)P=0;
		else    {
				if ( strcmp(x, R->mass[sred].shifr)<0 )
				niz=sred-1;
					else verh = sred + 1;

			}
	} while(verh<niz && P);

	if(!P) return 0;
	else return R->mass[sred].stoimost;
}
////////DOPOLNENIE/////////////
void dopolnenie(new_table *T, table *s, zeny_tabl *R, FILE *nw)
{
  int i;
  char *x;
  x = T->data[0].shifr;

  T->k=0;
  for(i=0; i< s->n; i++) // in new table create polya from old table
  {
	  strcpy(T->data[i].shifr, s->elem[i].shifr);
	  strcpy(T->data[i].name_product, s->elem[i].name_product);
	  T->data[i].kol_vo = s->elem[i].kol_vo;
	  T->data[i].stoimost = 0;

	  T->k++;
  }

  i=0; R->z=0;
  while(!feof(nw) && i<T->k) // create new table with stoimost
  {
		  fscanf(nw, "%s", &R->mass[i].shifr);
		  fscanf(nw, "%d", &R->mass[i].stoimost);

		  R->z++;
		  i++;
  }

	for(i=0; i<T->k; i++)
	{
		strcpy(x, T->data[i].shifr);
		T->data[i].stoimost = binarniy_poisk(R, x);
	}
}
///////SORTIROVKA//////////
void sortirovka(new_table *T)
{
   int i,j,C;
   pole_for_new_table x;

   for(i=1; i<T->k; i++)
   {
		x = T->data[i];
		C = T->data[i].kol_vo;

		j=i-1;
		while( (j>=0)&&(T->data[j].kol_vo > C) )
		{
			T->data[j+1]=T->data[j];
			j--;
		}
		T->data[j+1] = x;
   }
}
////////MAIN/////////
void main()
{
  int v;
  pole isdelie;
  table s;
  new_table T;
  zeny_tabl R;

  FILE *in,*out,*nw;
  in = fopen("d:\\input.txt", "r");
  out = fopen("d:\\output.txt", "w");
  nw = fopen("d:\\begin.txt", "r");

	fscanf(in, "%s", &isdelie.shifr);
	fscanf(in, "%s", &isdelie.name_product);
	fscanf(in, "%d", &isdelie.kol_vo);

  s.n=1; s.elem[0]=isdelie; v=1;
  while(!feof(in)&&v!=0)
  {
	fscanf(in, "%s", &isdelie.shifr);
	fscanf(in, "%s", &isdelie.name_product);
	fscanf(in, "%d", &isdelie.kol_vo);

	v=polozhit (&s, &isdelie);
  }

  if(v==0) printf("\n Warning! V rezultate vypolneniya programmy \nkol-vo facticheskih elementov prevysilo kol-vo maximalnyh!!!\n");

  dopolnenie(&T, &s, &R, nw);
  sortirovka(&T);
  vyvod (&T, out);


  fclose(in);
  fclose(nw);
  fclose(out);

  printf("\n Press any key. \n Results in output.txt");
  getch();
}
но она не заработала, точнее она работает и упорядычивает по НОВОМУ ключу,но данные "стоимость за штуку" не выводит. мне кажется это проблема с подпрограммой int binarniy_poisk, но разобраться в чем там дело я не смог. Кому не трудно, помогите пожалуйста!
Petruha-nsk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку Tesmont Помощь студентам 2 20.05.2009 21:00
Не могу найти ошибку(С++) Yura_n Помощь студентам 8 20.01.2009 12:36
Не могу найти ошибку. Picaso18 Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 17:05
Не могу найти ошибку . KVANTOM Общие вопросы Delphi 2 08.01.2009 17:15
Не могу найти ошибку! Эдуард Общие вопросы C/C++ 7 27.02.2008 16:34