PDA

View Full Version : Прогромированние: поможите с кодом



Archy
1.12.2008, 09:56
Народ помогите кто у нас програмист то а? плиз! у нас в универе типо сессия, надо работу здавать... не пойму где ошибка... идет потеря данных на уровне 0.0000001(+-)

вот сам код... скомпольте посмотрите... все как бы работает только ответы не 100% четкие! данные искажайоутся в с сотых или в тысячных даже... хз...


#include<stdio.h>
#include<conio.h>
#define SIZE 10

void main()
{



int units[SIZE], index, seller_nr=1;
float rate[SIZE], rate1=3.8, rate2=5.4, rate3=8.6, rate4=15.2;
float b_salary[SIZE]={158, 147.75, 315, 162.25, 220, 181.6, 176.9, 168.7, 293, 214.3};
float total_wages=0, b, big, low, a;

printf("This program for calculating wages for all sellers:\n\n");
//for loop//
for (index=0; index<SIZE; index++)
{
printf("Please enter how many units sell %2d seller ", seller_nr);
scanf("%d", &units[index]); //feelling aray with data//
fflush(stdin);
if (units[index]<0)
{
printf("\nPLEASE ENTER POSITIVE NUMBER!!!\n\n"); //checking if entered number is positive//
index=index-1;
seller_nr=seller_nr-1;
}
seller_nr++;
}
seller_nr=1; //return seller_nr//
//calculating rate//
for (index=0; index<SIZE; index++)
{
if (units[index]<5)
rate[index]=units[index]*rate1;
else
if (units[index]<10)
rate[index]=units[index]*rate2;
else
if (units[index]<15)
rate[index]=units[index]*rate3;
else
if (units[index]>15)
rate[index]=units[index]*rate4;
}
printf("\n");

//printing table with results//
printf("\n\nEmp.No. Commission Salary Unit Sold\n");
printf("***************(Euro)*************(Euro)********** ******\n\n");

for (index=0; index<SIZE; index++)
{
printf("%4d %18f %18f %8d", seller_nr, rate[index], rate[index]+b_salary[index], units[index]);
seller_nr++;
printf("\n");
}
printf("\n\n");

//find average Salary//
for (index=0; index<SIZE; index++)
{
total_wages=total_wages+b_salary[index]+rate[index];
}
printf("Average salary for the Sale Team is %f\n\n", total_wages/SIZE);

//find bigest salary//
for (index=0; index<1; index++)
{
big=rate[index]+b_salary[index];
for (index=1; index<SIZE; index++)
{
b=rate[index]+b_salary[index];
if (big<b)
{
big=0;
big=b;
}
}
printf("The biggest number is: %f", big);
}

//find lowest salaray//
for (index=0; index<1; index++)
{
low=rate[index]+b_salary[index];
for (index=1; index<SIZE; index++)
{
a=rate[index]+b_salary[index];
if (low>a)
{
low=0;
low=a;
}
}
printf("\nThe biggest number is: %f", low);
}

getch();
}

Friske
1.12.2008, 12:42
Арчи, ну я вообще ни разу не программист, конечно. Я просто у тебя хотела поинтересоваться... а ты форумом не ошибся случайно? :P

Archy
1.12.2008, 12:54
а что ошибся да? ну я не знаю ни каких других програмистских форумов! и учюсь только первый год! по этому еще не знаю где ресурсы копать! учитывая то что это игровой форум... как опыт подсказывает тут сидит куча програмеров! уверен на 100 что тут они есть! поэтому и написал сюда... авось кто поможет :)
наш русский брат умный! и разносторонне развит! куча народу которые ломают игры и модифицыруют их! и даже держут свои сервера, по этому многие имеют скилл програмирования!
вот я и написал...

Valen
1.12.2008, 13:49
Код смотреть лень, но если расхождение с твоими ожиданиями на "0.0000001" то ето разрядность переменных и округление. Замени флоат на дабл и будет расхождение так далеко что такая точность тебе в жизни не понадобится. Ну можеш раундом результируюшии дабл до 15го знака закруглить. И помни копиляторы с гигантскими персижинами работают по разному, случалось видеть как
double aaa = 1;
if(aaa != 1)
//to do something
И ОНО ВЫПОЛНЯЛОС! потому как компилер ааа превратил в 1.(9) в периоде. округлил гдето не туда. вот если отрауnдидть ааа перед проверкои на конечное число знаков, то будет 1 :)


давно на С не писал, лет 10, но с первого взгляда странно написано, разбирать усе лень, но сразу бросается в глаза в первых строках:
float b_salary[SIZE]={158, 147.75, 315, 162.25, 220, 181.6, 176.9, 168.7, 293, 214.3};
массив флоатов у тебя динамическии, а вот инитиш ты их строго ограниченым набором чисел. Тоесть если дефаин САИЗ будет 11, то 11тое значение будет не определено.

будет время - посмотрю что там у тебя, а тебе обязательно ANSI C надо?

Sioda
1.12.2008, 14:03
в РНР такая же фигня с округлениями - для точных вычислений нужно использовать библиотеку BCMath (в РНР), может и в С такая же фигня есть, давно не программил, да и то в институте

ЗЫ: кстати, была у нас как-то хохма с виндовым калькулятором, когда лабу считали - на обычном карманном калькуляторе получались числа с правильным ответом, а на виндовом - другие значения :)

X-root
1.12.2008, 23:34
Leon програмист по профессии иногда на ТС даже заходит.

Archy
2.12.2008, 01:12
посибки рут, обращюсь если сам не справлюсь! я еще правдо не попробывал в дабл флоат переделать! времени небыло! Спасибо Valen за идею! кка оказалось блин надо там еще доделать чтоб в конце довал не только максимальную и минимальную зарплату но и показывал какому продавцу она пренадлежит... и еще чтоб количество проданного товара отображалось не цифрой а количеством "*"... кароче бред... сидеть мне еще и сидеть! но не сегодня!

Ellestar
2.12.2008, 10:59
Насчет переделки Float в Double верно сказали, разве что стоит сказать, что это фича не C/PHP, а железа. И именно по этой причине для операций с деньгами всегда используют числа с фиксированной запятой (тот же integer, только подразумевают, что скажем 156 = 1.56), а не числа с плавающей запятой. Но для учебной программы это, наверное, необязательно.






//find bigest salary//
for (index=0; index<1; index++)
{
big=rate[index]+b_salary[index];
for (index=1; index<SIZE; index++)
{
b=rate[index]+b_salary[index];
if (big<b)
{
big=0;
big=b;
}
}

Вот это я не понял. Какой смысл во внешнем For? И кстати можно объединить поиск максимальной и минимальной зарплаты в один цикл.

Archy
2.12.2008, 21:27
да я так уже их обьеденил! и наверно первое где заполняем базу, можно обьеденить с Rate...
по пободу For:
как какой смысл? я беру из внешнего For число с индехом ноль, записываю его в переменную Big, а во внутреннем For я сравниваю переменную Big из (внешнего) с остальным индехом начиная с 1 а не с нуля(как во внешнем) и до SIZE...

LionbI4
2.12.2008, 23:42
как какой смысл? я беру из внешнего For число с индехом ноль, записываю его в переменную Big, а во внутреннем For я сравниваю переменную Big из (внешнего) с остальным индехом начиная с 1 а не с нуля(как во внешнем) и до SIZE...
А зачем тебе цикл для того, чтобы взять число с индексом ноль ? У тебя этот цикл всегда будет отрабатывать только один раз

Archy
3.12.2008, 00:24
потому что я не знаю как как выбрать определенний индекс! мы не проходили! а брать материал который мы не проходили означает минус к оценке! хотя лично мне интересно! если знаеш как то расскажи!
кстате вот дописал код полностью! готовая работа на здачу!


#include<stdio.h>
#include<conio.h>
#define SIZE 10

void main()
{



int units[SIZE], index, seller_nr=1, c=1, d=1, i=1;
float rate[SIZE], rate1=3.8, rate2=5.4, rate3=8.6, rate4=15.2;
float b_salary[SIZE]={158, 147.75, 315, 162.25, 220, 181.6, 176.9, 168.7, 293, 214.3};
float total_wages=0, b, big, low, a;



printf("This program for calculating wages for all sellers:\n\n");
//for loop//
for (index=0; index<SIZE; index++)
{
printf("Please enter how many units sell %2d seller ", seller_nr);
scanf("%d", &units[index]); //feelling aray with data//
fflush(stdin);
if (units[index]<0)
{
printf("\nPLEASE ENTER POSITIVE NUMBER!!!\n\n"); //checking if entered number is positive//
index=index-1;
seller_nr=seller_nr-1;
}
{
if (units[index]<5)
rate[index]=units[index]*rate1;
else
if (units[index]<10)
rate[index]=units[index]*rate2;
else
if (units[index]<15)
rate[index]=units[index]*rate3;
else
if (units[index]>15)
rate[index]=units[index]*rate4;
}
seller_nr++;
}
seller_nr=1; //return seller_nr//
printf("\n");

//printing table with results//
printf("\n\nEmp.No. Commission Salary Unit Sold\n");
printf("***************(Euro)*************(Euro)********** ******\n\n");

for (index=0; index<SIZE; index++)
{
printf("%4d %16.2f %18.2f %10d) ", seller_nr, rate[index], rate[index]+b_salary[index], units[index]);
//prints "*"//
while (i<=units[index])
{
printf("*");
i++;
}
i=1;
seller_nr++;
printf("\n");
}
printf("\n\n");

//find average Salary//
for (index=0; index<SIZE; index++)
{
total_wages=total_wages+b_salary[index]+rate[index];
}
printf("Average salary for the Sale Team is %.2f\n\n", total_wages/SIZE);

//find bigest salary// //find lowest salaray//
for (index=0; index<1; index++)
{
big=rate[index]+b_salary[index];
low=rate[index]+b_salary[index];
for (index=1; index<SIZE; index++)
{
a=rate[index]+b_salary[index];
b=rate[index]+b_salary[index];
if (big<b)
{
big=0;
big=b;
c=index;
c++;
}
if (low>a)
{
low=0;
low=a;
d=index;
d++;
}

}
printf("The Biggest Salary is: %.2f and belong to Seller Nr:%d", big, c);
printf("\nThe Lowest Salary is: %.2f and belong to Seller Nr:%d", low, d);

}

getch();
}

кому лень компелировать вот вам *.ехе (http://rapidshare.com/files/169615101/Assignment1.exe)

Ellestar
8.12.2008, 11:07
потому что я не знаю как как выбрать определенний индекс! мы не проходили! а брать материал который мы не проходили означает минус к оценке! хотя лично мне интересно! если знаеш как то расскажи!
кстате вот дописал код полностью! готовая работа на здачу!
или "index = 0;" вместо "for (index=0; index<1; index++)"

или просто обойтись без строчки "for (index=0; index<1; index++)" и первый "big=rate[index]+b_salary[index]; low=rate[index]+b_salary[index];" заменить на "big=rate[0]+b_salary[0]; low=rate[0]+b_salary[0];"

Вообще, как-то странно ты программируешь, если тебе это неочевидно.

Archy
11.12.2008, 22:51
а вот видеш тепер то я уже знаю спустя неделю... потому что сам спросил лектора как взят конкретный индекс... а так он нам этого не говорил! я не знал как обратится к конкретному индексу... оказалось [номер] и все :) но посибки тем немение!