У меня вот такое условие задачи:
"В файле содержатся результаты работы цеха за день. Элемент файла
включает: шифр изделия ( 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, но разобраться в чем там дело я не смог. Кому не трудно, помогите пожалуйста!