2016-11-19 3 views
-2

Ну, я только научился программированию на 2 месяца. Код, который я получил здесь, - это решение кассовой системы. У меня есть номер штрих-кода, название и цена. После типов кассиров в количестве штрих-кодов и заканчивая F, должна быть показана квитанция с номером товара, кодом и ценой. Это коды, которые я скомпилировал. Тем не менее, я могу набрать только один штрих-код и программа разбилась.C программа кассовая система

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
typedef struct goods 
{ 
    char goods_code[6]; 
    char goods_descrip[20]; 
    float price; 
}goodtype; 

goodtype goods[13]; 
strcpy(goods[0].goods_descrip, "Chicken"); 
strcpy(goods[0].goods_code, "00310"); 
goods[0].price = 35.00; 

strcpy(goods[1].goods_descrip, "Pork"); 
strcpy(goods[1].goods_code, "00311"); 
goods[1].price = 20.50; 

strcpy(goods[2].goods_descrip, "Beef"); 
strcpy(goods[2].goods_code, "00322"); 
goods[2].price = 45.00; 

strcpy(goods[3].goods_descrip, "Fish"); 
strcpy(goods[3].goods_code, "00323"); 
goods[3].price = 40.00; 

strcpy(goods[4].goods_descrip, "Walmart T Shirt"); 
strcpy(goods[4].goods_code, "00510"); 
goods[4].price = 75.00; 

strcpy(goods[5].goods_descrip, "Walmart Trousers"); 
strcpy(goods[5].goods_code, "00511"); 
goods[5].price = 120.00; 

strcpy(goods[6].goods_descrip, "Walmart Coat"); 
strcpy(goods[6].goods_code, "00512"); 
goods[6].price = 100.00; 

strcpy(goods[7].goods_descrip, "Walmart Jumper"); 
strcpy(goods[7].goods_code, "00513"); 
goods[7].price = 85.00; 

strcpy(goods[8].goods_descrip, "Mug"); 
strcpy(goods[8].goods_code, "00710"); 
goods[8].price = 15.50; 

strcpy(goods[9].goods_descrip, "Fry Pan"); 
strcpy(goods[9].goods_code, "00711"); 
goods[9].price = 200.00; 

strcpy(goods[10].goods_descrip, "Bowl"); 
strcpy(goods[10].goods_code, "00712"); 
goods[10].price = 25.00; 

strcpy(goods[11].goods_descrip, "Dish"); 
strcpy(goods[11].goods_code, "00713"); 
goods[11].price = 25.00; 

char tempCode[6]; 
char receiptNM[20], receiptCD[6]; 
char stop[2] = {"F"}; 
float receiptPC, ttlcost = 0; 
unsigned int i; 

printf("Please enter the item code. Type F to finish"); 
scanf("%s", &tempCode); 

while (strcmp(tempCode, stop)){ 
    for (i = 0; i <= 12; ++i){ 
     if (strcmp(tempCode, goods[i].goods_code) == 0){ 
      strcpy(receiptNM, goods[i].goods_descrip); 
      strcpy(receiptCD, goods[i].goods_code); 
      receiptPC = goods[i].price; 
      ttlcost += goods[i].price; 
     } 
     else{ 
      printf("This item code does not exist! Try again!\n"); 
    } 
printf("Please enter the item code. Type F to finish"); 
scanf("%s", &tempCode); 
} 
printf("_____________________________________\n\n"); 
printf("  THANK YOU FOR VISITING US!  \n"); 
printf("_____________________________________\n"); 
printf("   Here is your receipt:  \n\n"); 
printf("%10s%20s%10s", "Item", "Code", "Price"); 
printf("%10s%20s%10.2f\n", receiptNM, receiptCD, receiptPC); 
printf("\n_____________________________________\n"); 
printf("   TOTAL COST:%.2f   \n", ttlcost); 
} 

Я борюсь с этим в течение нескольких часов и не могу это исправить. Пример вывода должен быть Sample receipt

Когда я печатаю 00310, программа не может его распознать. Хотя по мере ввода 310 он может.

Кроме того, когда введенный код не существует, сообщение об ошибке должно отображаться только один раз. Но в моей программе это делает 12 раз.

+0

'scanf ("% c ", & tempCode);' Это сканирование одного символа, а не строки. То есть 'tempCode' не будет ничейной завершенной строкой. Поэтому вы не можете использовать на нем какую-либо строковую функцию. – kaylum

+0

Каков ваш вывод и как вы думаете, объясните это. @ Sam.W – PassionInfinite

+1

Также предложите вам научиться использовать отладчик (если вы еще этого не сделали). Это сэкономит вам много времени. – kaylum

ответ

1

Вы сделали пару ошибок. Позвольте мне указать на них: - Первый указатель Keine Lust: https://stackoverflow.com/a/40690102/3959321, где вы получаете доступ к памяти за пределами массива, итерацией до 12 (включительно). Если вы объявили массив из 12 элементов, индексы в диапазоне от 0 до 11, а не от 0 до 12

for (i = 0; i <= 12; ++i){ //wrong iterations (< 12 should be here) 
    if (strcmp(tempCode, goods[i].goods_code) == 0) { 
     strcpy(receiptNM, goods[i].goods_descrip); 
     strcpy(receiptCD, goods[i].goods_code); 
     receiptPC = goods[i].price; 
     ttlcost += goods[i].price; 
    } 
    else { 
     printf("This item code does not exist! Try again!\n"); 
    } 
    printf("Please enter the item code. Type F to finish"); 
    scanf("%s", &tempCode); 
} 

Вашей программа обязательно будет печатать «Этот код элемента не существует! ...» 12 раз , так как часть else связана с if и вложенным внутри цикла for. Таким образом, он будет вызываться каждый раз, когда элемент не найден для 12 итераций цикла.

Правильная программа: -

---- //Rest above is same 
unsigned int i; 
printf("Please enter the item code. Type F to finish"); 
scanf("%s", tempCode); 

while (strcmp(tempCode, stop)) { 
    for (i = 0; i < 12; ++i){ 
     if (strcmp(tempCode, goods[i].goods_code) == 0){ 
      strcpy(receiptNM, goods[i].goods_descrip); 
      strcpy(receiptCD, goods[i].goods_code); 
      receiptPC = goods[i].price; 
      ttlcost += goods[i].price; 
      break; 
     } 
    } 
    if (i==12) //The loop iteration is complete, and i becomes 12 only when the for above hasn't been breaked (same as item found) 
     printf("This item code does not exist! Try again!\n"); 
    printf("Please enter the item code. Type F to finish"); 
    memset(tempCode,'\0',sizeof(tempCode)); 
    scanf("%s", tempCode); 
} 

Вы также делаете ошибку в заключительной части reciept: -

printf("%10s%20s%10s", "Item", "Code", "Price"); 
printf("%10s%20s%10.2f\n", receiptNM, receiptCD, receiptPC); //receiptNM, receiptCD and receiptPC are only single character arrays. 

Они будут хранить только один строку в отличие от ваших ожиданий. Чтобы сохранить их все, вы создаете массив структуры (который содержит код элемента, имя элемента и цену). Следуйте за ответом GumBoy: - https://stackoverflow.com/a/40690211/3959321

+0

Большое спасибо :) Теперь моя программа работает отлично. –

1

Здесь

for (i = 0; i <= 12; ++i){ 
    if (strcmp(tempCode, goods[i].goods_code) == 0){ 

Вы получаете доступ к неинициализированным значениям в последней итерации (неопределенное поведение), потому что вы просто заполнить от goods[0] до goods[11]:

strcpy(goods[11].goods_descrip, "Dish"); 
strcpy(goods[11].goods_code, "00713"); 
goods[11].price = 25.00; 
0

Глядя на ваше выходное изображение. Для печати значений вам понадобится цикл for. В вашей текущей программе значение receiveCD, reciptNM и recieptPC заменяется каждый раз, когда выполняется условие в вашей инструкции if. Я думаю, вам нужно добавить еще одну структуру typedef для ваших квитанций.

Я исправил несколько проблем, но вы почти там. Последнее состоит в обосновании текста.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
typedef struct goods 
{ 
char goods_code[6]; 
char goods_descrip[20]; 
float price; 
}goodtype; 

goodtype goods[13]; 
strcpy(goods[0].goods_descrip, "Chicken"); 
strcpy(goods[0].goods_code, "00310"); 
goods[0].price = 35.00; 

strcpy(goods[1].goods_descrip, "Pork"); 
strcpy(goods[1].goods_code, "00311"); 
goods[1].price = 20.50; 

strcpy(goods[2].goods_descrip, "Beef"); 
strcpy(goods[2].goods_code, "00322"); 
goods[2].price = 45.00; 

strcpy(goods[3].goods_descrip, "Fish"); 
strcpy(goods[3].goods_code, "00323"); 
goods[3].price = 40.00; 

strcpy(goods[4].goods_descrip, "Walmart T Shirt"); 
strcpy(goods[4].goods_code, "00510"); 
goods[4].price = 75.00; 

strcpy(goods[5].goods_descrip, "Walmart Trousers"); 
strcpy(goods[5].goods_code, "00511"); 
goods[5].price = 120.00; 

strcpy(goods[6].goods_descrip, "Walmart Coat"); 
strcpy(goods[6].goods_code, "00512"); 
goods[6].price = 100.00; 

strcpy(goods[7].goods_descrip, "Walmart Jumper"); 
strcpy(goods[7].goods_code, "00513"); 
goods[7].price = 85.00; 

strcpy(goods[8].goods_descrip, "Mug"); 
strcpy(goods[8].goods_code, "00710"); 
goods[8].price = 15.50; 

strcpy(goods[9].goods_descrip, "Fry Pan"); 
strcpy(goods[9].goods_code, "00711"); 
goods[9].price = 200.00; 

strcpy(goods[10].goods_descrip, "Bowl"); 
strcpy(goods[10].goods_code, "00712"); 
goods[10].price = 25.00; 

strcpy(goods[11].goods_descrip, "Dish"); 
strcpy(goods[11].goods_code, "00713"); 
goods[11].price = 25.00; 

char tempCode[6]; 
typedef struct receipt 
{ 
char receiptNM[20], receiptCD[6]; 
float receiptPC; 
}receipttype; 
receipttype receipt[13]; 
char stop[2] = {"F"}; 
float ttlcost = 0; 
unsigned int i; 
unsigned int count = 0; 



while (strcmp(tempCode, stop)){ 
printf("Please enter the item code. Type F to finish: "); 
scanf("%s", tempCode); 
for (i = 0; i <= 12; ++i){ 
    if (strcmp(tempCode, goods[i].goods_code) == 0){ 
     strcpy(receipt[count].receiptNM, goods[i].goods_descrip); 
     strcpy(receipt[count].receiptCD, goods[i].goods_code); 
     receipt[count].receiptPC = goods[i].price; 
     ttlcost += goods[i].price; 
     count++; 
    } 

} 

} 
printf("_____________________________________\n\n"); 
printf("  THANK YOU FOR VISITING US!  \n"); 
printf("_____________________________________\n"); 
printf("   Here is your receipt:  \n\n"); 
printf("%10s%20s%10s", "Item", "Code", "Price\n"); 
for (int j= 0; j < count; ++j){ 
printf("%10s%20s%10.2f\n", receipt[j].receiptNM, receipt[j].receiptCD, receipt[j].receiptPC); 
} 
printf("\n_____________________________________\n"); 
printf("   TOTAL COST:%.2f   \n", ttlcost); 
} 
+0

Это работает! Большое спасибо! –

0

Поскольку никто не упомянул об этом, вот лучший способ заполнить массив структур.

typedef struct 
{ 
    char *code; 
    char *description; 
    float price; 
}goodtype; 

static goodtype goods[] = 
{ 
    { "00310", "Chicken" , 35.00 }, 
    { "00311", "Pork" , 20.50 }, 
    { "00322", "Beef" , 45.00 }, 
    { "00323", "Fish" , 40.00 }, 
    { "00510", "T Shirt" , 75.00 }, 
    { "00511", "Trousers", 120.00 }, 
    { "00512", "Coat" , 100.00 }, 
    { "00513", "Jumper" , 85.00 }, 
    { "00710", "Mug"  , 15.50 }, 
    { "00711", "Fry Pan" , 200.00 }, 
    { "00712", "Bowl" , 25.00 }, 
    { "00713", "Dish" , 25.00 } 
}; 
static int goodscount = sizeof(goods)/sizeof(goods[0]); 

int main(void) 
{ 
    for (int i = 0; i < goodscount; i++) 
     printf("%3d %s %s\n", i, goods[i].code, goods[i].description); 
    printf("Number of items: %d\n", goodscount); 
} 

Есть несколько преимуществ делать это таким образом:

  • Это занимает меньше типизации, уменьшая вероятность человеческой ошибки
  • Сохраняет мало памяти, так как вам не нужно угадать насколько велики должны быть массивы code и description.
  • Избегает возможности переполнения буфера (например, если вы ошибались в отношении длины строк).
  • Экономит немного времени, так как вам не нужно делать все это strcpy s.
  • Автоматически подсчитывает количество записей в массиве, поэтому вы не можете ошибиться.
+1

Я скорректировал свою программу, и теперь она выглядит более аккуратно :) –