Intereting Posts
Внедрение функции задержки времени в C Понимание cairo_rotate Указатели файлов после возврата из раздвоенного дочернего процесса isalpha () дает утверждение Инструкция SSE MOVSD (расширенная: скалярные и плавающие операции с плавающей запятой на x86, x86-64) Должен ли я использовать Helgrind или DRD для обнаружения ошибок streamа? gdb не запускает 64-битную программу ELF с «Недопустимым форматом файла», Вычислить подписанное длинное максимальное значение в C с использованием сдвига бит Как напечатать символ gradleуса в окне с помощью qt5 (QtQuick 2.1) и выше Прерывание вместо segfault с явным нарушением памяти C, Чтение двойных значений из текстового файла Как создать C-программу, которая может запускать шестнадцатеричные коды x86 Сделать C плавающей запятой букв плавать (а не удваивать) Цикл с плавающей точкой запускает больше итераций, чем должно быть Добавление двух указателей в c или c ++ не поддерживается. Зачем?

Чтение и отображение файлов данных, Корректные результаты, но код неосуществим

У меня есть программа в classе, которая читает файл данных для магазина, а затем выводит их в командной строке.

1 Suits 300 100 92 1 Coats 200 60 65 1 Shirts 1000 12 13 2 Dresses 400 60 65 2 Coats 185 184 200 2 Shoes 600 40 30 3 Jeans 200 40 35 3 Shoes 200 30 34 4 Jeans 300 42 43 

Цифры – это отдел, название, количество, стоимость покупки и стоимость продажи.

 #include  #include  #ifndef min #define min(a,b) ((a) < (b) ? (a) : (b)) #endif int main() { FILE *in; char item[8]; int department, quantity, prev = 1,k=0; float cost, market, cost2, mark2, total, totcost, totmark = 0, lowest; if((in = fopen("blinn.dat", "r")) == NULL) { printf ("Can't open file blinn.dat\n"); system("pause"); exit(1); } else { printf ("\n\n\t\t\t\t Blinn Apparel Store"); printf ("\n\n\n\t\t Unit Cost Extended"); printf ("\n Quantity Cost Market Cost Market Lower Cost\n"); printf ("\nMens Dept"); int m=0; while(fscanf(in, "%d %s %d %f %f", &department, item, &quantity, &cost, &market) != EOF) { if(department != prev) { lowest = min(totcost, totmark); printf ("\n Total\t\t\t\t $%8.2f $%8.2f $%8.2f", totcost, totmark, lowest); totcost = 0; totmark = 0; prev = department; total += lowest; switch (m) { case 0: printf("\nLadies Dept"); break; case 1: printf("\nGirls Dept"); break; case 2: printf("\nBoys Dept"); break; } m++; } if (department == 1) { cost2 = cost * quantity; mark2 = market * quantity; printf ("\n%8s %4d %8.2f %4.2f %8.2f %8.2f ", item, quantity, cost, market, cost2, mark2); totcost = totcost + cost2; totmark = totmark + mark2; } if (department == 2) { cost2 = cost * quantity; mark2 = market * quantity; printf ("\n%8s %4d %8.2f%8.2f %8.2f %8.2f ", item, quantity, cost, market, cost2, mark2); totcost = totcost + cost2; totmark = totmark + mark2; } if (department == 3) { cost2 = cost * quantity; mark2 = market * quantity; printf ("\n%8s %4d %8.2f %5.2f %8.2f %8.2f ", item, quantity, cost, market, cost2, mark2); totcost = totcost + cost2; totmark = totmark + mark2; } if (department == 4) { cost2 = cost * quantity; mark2 = market * quantity; printf ("\n%8s %4d %8.2f %5.2f %8.2f %8.2f ", item, quantity, cost, market, cost2, mark2); totcost = totcost + cost2; totmark = totmark + mark2; lowest = min(totcost, totmark); printf ("\nTotal\t\t\t\t\t $%8.2f $%8.2f $%8.2f\n", totcost, totmark, lowest); total += lowest; } } } printf("Inventory at lower cost\t\t\t\t\t $%8.2f\n", total); system ("pause"); }a 

Пренебречь неравномерным интервалом для каждой линии; Я искал множество вопросов, которые я необъяснимо получал. У меня код хороший и денди, и все это проверяется, но мой профессор дал мне половину кредита из-за утверждений if, говоря, что если бы было большое количество отделов, мой код был бы невозможен. Он сказал, что я могу заменить его одним заявлением, и это отбросило меня, потому что я пытался использовать его в инструкции switch, но это явно не работает, потому что некоторые предметы одежды не появляются.

Я просто не могу изменить ситуацию, если математика не сходит с ума. Моя первая мысль заключалась в том, чтобы сделать функцию для множественных добавлений и умножений для тотальных, totcost, cost2 и mark2, но в любое время, когда я нарушаю ее, все разваливается, и я не могу свести его обратно.

Это должно быть легко исправить, но я ценю любую помощь.

Я думаю, они ожидают, что вы воспользуетесь функцией .
Вы также можете использовать Структуры.

 /* Structure Definition */ typedef struct goods { int dept; char item[64]; int quantity; int sell_price; int cost_price; } goods_t; 

и создать массив структур (в main() ), как это

 /* Array of Structure */ #define NO_ENTRIES 10 /* No of entries in your file */ goods_t arr[NO_ENTRIES]; for(i = 0; i< TOTAL_DEPT; i++) { fscanf(fp, "%d %s %d %d %d", &arr[i].dept, arr[i].item, &arr[i].quantity, &arr[i].sell_price, &arr[i].cost_price); cal(arr[i].dept, arr[i].item, arr[i].quantity, arr[i].sell_price ,arr[i].cost_price); } 

Также вы можете написать общую функцию для вычисления:

 void calculate (int dept, char *item, int quantity, int sp, int cp) { int total_cost = 0, total_market = 0; total_cost += quantity * cp; total_sell += quantity * sp; ... printf("%s\t%d\t%d\t%d\n", item, quantity, sp, cp); printf("Total : %d\t %d\n", total_cost, total_sell); ... return; } 

Примечание:
Вы можете использовать enum

 enum type{ mens = 0, ladies, boys, girls, }; 

и добавьте следующее для calculate функции

 if(dept == mens) printf("Mens Dept"); else if(dept == ladies) printf("Ladies Dept"); else if(dept == boys) printf("Boys Dept"); else printf("Girls Dept"); 

возможно, вы можете попробовать использовать такие массивы;

  int department[ k] string itemname[ ] Float quantity[ ] , cost_to_buy[ ], cost_to_sale[ ] 

Попросите пользователя указать количество отделов, если это необходимо для выполнимости. После этого вы можете применить оператор switch или if, чтобы присвоить каждому массиву его эквивалент, а затем отобразить с помощью цикла for для каждого. С массивами вы можете работать с большим количеством отделов Удачи

 the following compiles with no warnings/errors it implements the logic needed however, certain printf statements and certain calcuations are left for the OP #include  #include  #include  static const char * departmentNames[] = { "Mens Department", "Womens Department", "Girls Department", "Boys Department" }; int main() { int firstRecord = 1; FILE *in; char item[20]; int departmentNum = 0; int quantity = 0; int prevDepartmentNum = 0; float cost = 0.0f; // store cost of one item float market = 0.0f; // customer cost of one item float cost2 = 0.0f; // cost * quantity float mark2 = 0.0f; // narket * quantity float totcost = 0.0f; // sum of product cost for one department float totmark = 0.0f; // sum of product sales for one department if((in = fopen("blinn.dat", "r")) == NULL) { perror( "fopen for reading blinn.data failed" ); printf ("Can't open file blinn.dat\n"); system("pause"); exit( EXIT_FAILURE ); } // implied else, fopen successful // display the report header printf ("\n\n\t\t\t\t Blinn Apparel Store"); printf ("\n\n\n\t\t Unit Cost Extended"); printf ("\n Quantity Cost Market Cost Market\n"); while(1) { memset(item, 0x00, sizeof(item) ); if( 5 != fscanf(in, " %d %19s %d %f %f", &departmentNum, item, &quantity, &cost, &market) ) { // fscanf failed perror( "fscanf failed" ); exit( EXIT_FAILURE ); } // implied else, fscanf successful if( firstRecord ) { firstRecord = 0; prevDepartmentNum = departmentNum; totcost = 0.0f; totmark = 0.0f; } // end if if(departmentNum != prevDepartmentNum) { // then output previous department totals printf( "\n%s", departmentNames[prevDepartmentNum]); printf ("\n Total\t\t\t\t $%8.2f $%8.2f", totcost, totmark ); // re-initialize for new department totcost = 0.0f; totmark = 0.0f; prevDepartmentNum = departmentNum; // prep for next itteration } // end if cost2 = cost * quantity; mark2 = market * quantity; printf ("\n%8s %4d %8.2f %4.2f %8.2f %8.2f ", item, quantity, cost, market, cost2, mark2); totcost = totcost + cost2; totmark = totmark + mark2; } // end while system ("pause"); return(0); } // end function: main в the following compiles with no warnings/errors it implements the logic needed however, certain printf statements and certain calcuations are left for the OP #include  #include  #include  static const char * departmentNames[] = { "Mens Department", "Womens Department", "Girls Department", "Boys Department" }; int main() { int firstRecord = 1; FILE *in; char item[20]; int departmentNum = 0; int quantity = 0; int prevDepartmentNum = 0; float cost = 0.0f; // store cost of one item float market = 0.0f; // customer cost of one item float cost2 = 0.0f; // cost * quantity float mark2 = 0.0f; // narket * quantity float totcost = 0.0f; // sum of product cost for one department float totmark = 0.0f; // sum of product sales for one department if((in = fopen("blinn.dat", "r")) == NULL) { perror( "fopen for reading blinn.data failed" ); printf ("Can't open file blinn.dat\n"); system("pause"); exit( EXIT_FAILURE ); } // implied else, fopen successful // display the report header printf ("\n\n\t\t\t\t Blinn Apparel Store"); printf ("\n\n\n\t\t Unit Cost Extended"); printf ("\n Quantity Cost Market Cost Market\n"); while(1) { memset(item, 0x00, sizeof(item) ); if( 5 != fscanf(in, " %d %19s %d %f %f", &departmentNum, item, &quantity, &cost, &market) ) { // fscanf failed perror( "fscanf failed" ); exit( EXIT_FAILURE ); } // implied else, fscanf successful if( firstRecord ) { firstRecord = 0; prevDepartmentNum = departmentNum; totcost = 0.0f; totmark = 0.0f; } // end if if(departmentNum != prevDepartmentNum) { // then output previous department totals printf( "\n%s", departmentNames[prevDepartmentNum]); printf ("\n Total\t\t\t\t $%8.2f $%8.2f", totcost, totmark ); // re-initialize for new department totcost = 0.0f; totmark = 0.0f; prevDepartmentNum = departmentNum; // prep for next itteration } // end if cost2 = cost * quantity; mark2 = market * quantity; printf ("\n%8s %4d %8.2f %4.2f %8.2f %8.2f ", item, quantity, cost, market, cost2, mark2); totcost = totcost + cost2; totmark = totmark + mark2; } // end while system ("pause"); return(0); } // end function: main