2016-03-03 64 views
-2

因此我必须制作一台自动售货机。我第一次做到了在Python和它的工作就像我想(这里的代码,抱歉,但有些事情是葡萄牙语):“下标值既不是数组也不是指针也不是矢量”将Python代码转换为C

def cadastro(matriz_cadastro): 
     quant = int(input("Quantidade do produto:")) 
     local = input("Código de localização do produto:") 
     preco = float(input("Preço do produto:")) 
     control = True 
     for x in matriz_cadastro: 
      if x[1] == local: 
       x[0]+= quant 
       x[2] = preco 
       control = False 
     if control: 
     matriz_cadastro.append([quant,local,preco])  
def carga_moedas(troco, moeda, quant_moeda): 
     if moeda == 5: 
      troco[0] += quant_moeda 
     if moeda == 10: 
      troco[1] += quant_moeda 
     if moeda == 25: 
      troco[2] += quant_moeda 
     if moeda == 50: 
      troco[3] += quant_moeda 
def deposito(valor_depositado): 
     char_add = input() 
     while(char_add == '+'): 
      valor_depositado += 0.1 
      print("Valor depositado: R$", "%.2f"%valor_depositado) 
      char_add = input() 
      if char_add == 'x': 
       print('Cancelando a compra e devolvendo o valor de R$',"%.2f"%valor_depositado) 
       valor_depositado = 0 
     return valor_depositado 
def moedas_troco(troco_venda): 
       troco_50 = troco_venda//0.5 
       if troco_50 > troco[3]: 
        troco_50 = troco[3]      
       troco_venda -= troco_50*0.5 
       troco_25 = troco_venda//0.25 
       if troco_25 > troco[2]: 
        troco_25 = troco[2] 
       troco_venda -= troco_25*0.25 
       troco_10 = troco_venda//0.1 
       if troco_10 > troco[1]: 
        troco_10 = troco[1] 
       troco_venda -= troco_10*0.1 
       troco_5 = troco_venda//0.05 
       if troco_5 > troco[0]: 
        troco_5 = troco[0] 
       troco_venda -= troco_5*0.05 
       return troco_5, troco_10, troco_25, troco_50, troco_venda     
def compra(valor_depositado, matriz_cadastro,prod, troco): 
     for x in matriz_cadastro: 
      if x[1] == prod and x[2] <= valor_depositado and x[0]>0: 
       troco_venda = valor_depositado-x[2] 
       troco_5, troco_10, troco_25, troco_50, troco_venda = moedas_troco(troco_venda) 
       if troco_venda >= 0.05: 
        print('Desculpe, não há troco suficiente') 
        print('Cancelando a compra e devolvendo o valor de R$',"%.2f"%valor_depositado) 
        break 
       else: 
        x[0]-=1 
        print('Finalizando compra') 
        if troco_50>0 or troco_25>0 or troco_10>0 or troco_5>0: 
          print('Liberando troco') 
        if troco_50>0: 
         if troco_50 == 1: 
           print(troco_50, 'moeda de 50 centavos') 
         else: 
           print(troco_50, 'moedas de 50 centavos') 
         carga_moedas(troco,50,-troco_50) 
        if troco_25>0: 
         if troco_25 == 1: 
           print(troco_25, 'moeda de 25 centavos') 
         else: 
           print(troco_25, 'moedas de 25 centavos') 
         carga_moedas(troco,25,-troco_25) 
        if troco_10>0: 
         if troco_10 == 1: 
           print(troco_10, 'moeda de 10 centavos') 
         else: 
           print(troco_10, 'moedas de 10 centavos') 
         carga_moedas(troco,10,-troco_10) 
        if troco_5>0: 
         if troco_5 == 1: 
           print(troco_5, 'moeda de 5 centavos') 
         else: 
           print(troco_5, 'moedas de 5 centavos') 
         carga_moedas(troco,5,-troco_5) 
        print('Retire seu produto') 
        break 
      elif x[1] == prod and x[0] == 0: 
       print('Produto indisponível, por favor escolha outro produto') 
       prod = input('Código do produto desejado:') 
       compra(valor_depositado, matriz_cadastro,prod, troco) 
       break 
      elif x[1] == prod and x[2] > valor_depositado: 
       print('Valor depositado insuficiente, por favor depositar mais.') 
       valor_depositado = deposito(valor_depositado) 
       compra(valor_depositado, matriz_cadastro,prod, troco) 
       break 
      elif prod == 'x': 
        print('Cancelando a compra e devolvendo o valor de R$',"%.2f"%valor_depositado) 
        break 
valor_depositado = 0 
matriz_cadastro = [[10,'00',1.5],[5,'01',3],[1,'02',1.85],[0,'03',1]] 
troco = [100,1,1,1] 
while True: 
    print('Digite:') 
    print('[A] para cadastro de produto') 
    print('[B] para carga de moedas') 
    print('[C] para depósito de dinheiro') 
    print('[D] para compra') 
    print('[X] para cancelar') 
    char=input() 
    char = char.upper() 
    if char == 'A': 
     cadastro(matriz_cadastro) 
    elif char == 'B': 
     moeda = int(input('Qual moeda terá carga?')) 
     quant_moeda = int(input('Quantidade de moedas:')) 
     carga_moedas(troco, moeda, quant_moeda) 
    elif char == 'C': 
     valor_depositado = deposito(valor_depositado) 
    elif char == 'D': 
     prod = input('Código do produto desejado:') 
     compra(valor_depositado, matriz_cadastro,prod, troco) 
     valor_depositado = 0 
    else: 
     print("Cancelando compra") 
     if valor_depositado > 0: 
       print('Devolvendo o valor de R$',"%.2f"%valor_depositado) 

但事情是我应该做它在C,我知道很少。我试着将它传递给C,而得到这个代码:

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

int i; 
int j; 
int control; 
int quant; 
char local[50]; 
float preco; 
#define true 1; 
#define false 0; 
int matriz_cadastro[4][3] = {{10,00,1.5},{5,01,3},{1,02,1.85},{0,03,1}}; 
int troco[4]= {100,100,100,100}; 
int moeda; 
int quant_moeda; 
float valor_depositado; 
char char_add; 
float troco_venda; 
int troco_5; 
int troco_10; 
int troco_25; 
int troco_50; 
char prod[50]; 
char resp; 

int carga_moedas(int troco[4], int moeda,int quant_moeda){ 
     if (moeda == 5){ 
      troco[0] = troco[0] + quant_moeda; 
     } 
     if (moeda == 10){ 
      troco[1] =troco[1]+ quant_moeda; 
     } 
     if (moeda == 25){ 
      troco[2] =troco[2]+ quant_moeda; 
     } 
     if (moeda == 50){ 
      troco[3] = troco[3]+ quant_moeda; 
     } 
     return 0; 
} 
float deposito(float valor_depositado){ 
     char_add = getchar(); 
     while(char_add == '+'){ 
      valor_depositado += 0.1; 
      printf("Valor depositado: R$%.2f\n",valor_depositado); 
      char_add = getchar(); 
      if (char_add == 'x'){ 
       printf('Cancelando a compra e devolvendo o valor de   R$%.2f\n',valor_depositado); 
       valor_depositado = 0; 
      } 
     } 
     return valor_depositado; 
} 
float moedas_troco(troco_venda){ 
       troco_50 = troco_venda/0.5; 
       if (troco_50 > troco[3]){ 
        troco_50 = troco[3]; 
       } 
       troco_venda -= troco_50*0.5; 
       troco_25 = troco_venda/0.25; 
       if (troco_25 > troco[2]){ 
        troco_25 = troco[2]; 
       } 
       troco_venda -= troco_25*0.25; 
       troco_10 = troco_venda/0.1; 
       if (troco_10 > troco[1]){ 
        troco_10 = troco[1]; 
       } 
       troco_venda -= troco_10*0.1; 
       troco_5 = troco_venda/0.05; 
       if (troco_5 > troco[0]){ 
        troco_5 = troco[0]; 
       } 
       troco_venda -= troco_5*0.05; 
       return troco_5, troco_10, troco_25, troco_50, troco_venda; 
} 

int compra(valor_depositado, matriz_cadastro,prod, troco){ 
    for (i=0;i<sizeof(matriz_cadastro); i++){ 
     if (matriz_cadastro[i][1] == prod && matriz_cadastro[i][2] <=   valor_depositado && matriz_cadastro[i][0]>0){ 
      troco_venda = valor_depositado-matriz_cadastro[i][2]; 
      troco_5, troco_10, troco_25, troco_50, troco_venda = moedas_troco(troco_venda); 
      if (troco_venda >= 0.05){ 
       printf('Desculpe, não há troco suficiente\n'); 
       printf('Cancelando a compra e devolvendo o valor de R$%f\n',valor_depositado); 
       break; 
      } 
      else{ 
       matriz_cadastro[i][0]--; 
       printf('Finalizando compra\n'); 
       if (troco_50>0 || troco_25>0 || troco_10>0 || troco_5>0){ 
        printf('Liberando troco\n'); 
       } 
       if (troco_50>0){ 
        if (troco_50 == 1) 
         printf(troco_50, 'moeda de 50 centavos\n'); 
        else 
         printf(troco_50, 'moedas de 50 centavos\n'); 
        j = carga_moedas(troco,50,-troco_50); 
       } 
       if(troco_25>0){ 
        if (troco_25 == 1) 
         printf(troco_25, 'moeda de 25 centavos\n'); 
        else 
         printf(troco_25, 'moedas de 25 centavos\n'); 
        j = carga_moedas(troco,25,-troco_25); 
       } 
       if (troco_10>0){ 
        if (troco_10 == 1) 
           printf(troco_10, 'moeda de 10 centavos\n');      
        else 
           printf(troco_10, 'moedas de 10 centavos\n'); 
        j = carga_moedas(troco,10,-troco_10); 
       } 
       if (troco_5>0){ 
        if (troco_5 == 1) 
           printf(troco_5, 'moeda de 5 centavos\n'); 
        else 
           printf(troco_5, 'moedas de 5 centavos\n'); 
        j = carga_moedas(troco,5,-troco_5); 
       } 
       printf('Retire seu produto\n'); 
       break; 
      } 
     } 
     else if (matriz_cadastro[i][1] == prod && matriz_cadastro[i][0] == 0){ 
       printf('Produto indisponível, por favor escolha outro produto\n'); 
       printf('Código do produto desejado:\n'); 
       gets(prod); 
       compra(valor_depositado, matriz_cadastro,prod, troco); 
       break; 
     } 
     else if (matriz_cadastro[i][1] == prod && matriz_cadastro[i][2] > valor_depositado){ 
       printf('Valor depositado insuficiente, por favor depositar mais.\n'); 
       valor_depositado = deposito(valor_depositado); 
       compra(valor_depositado, matriz_cadastro,prod, troco); 
       break; 
     } 
     else if (prod == 'x'){ 
        printf('Cancelando a compra e devolvendo o valor de R$%.2f\n',valor_depositado); 
        break; 
     } 
    } 
} 
int main() { 
     valor_depositado = 0; 
     while(1>0){ 
     printf("Digite:\n"); 
     printf("[A] para cadastro de produto\n"); 
     printf("[B] para carga de moedas\n"); 
     printf("[C] para depósito de dinheiro\n"); 
     printf("[D] para compra\n"); 
     printf("[X] para cancelar\n"); 
     resp = getchar(); 
     if (resp == 'A') 
      printf('Função indisponível no momento'); 
     else if(resp == 'B'){ 
      printf('Qual moeda terá carga?\n'); 
      gets(moeda); 
      printf('Quantidade de moedas:\n'); 
      gets(quant); 
      carga_moedas(troco, moeda, quant_moeda); 
     } 
     else if (resp == 'C') 
      valor_depositado = deposito(valor_depositado); 
     else if (resp == 'D'){ 
      printf('Código do produto desejado:\n'); 
      gets(prod); 
      compra(valor_depositado, matriz_cadastro,prod, troco); 
      valor_depositado = 0; 
     } 
     else{ 
      printf("Cancelando compra\n"); 
      if (valor_depositado > 0) 
       printf('Devolvendo o valor de R$%.2f\n',valor_depositado); 
     } 
     } 
     return 0; 
}` 

但它一直得到同样的错误(下标值既不是数组,也不指针也不向量),而这是行不通的。有人能帮助我吗?

+1

你调试了你的代码吗? – MSeifert

+1

在尝试将它翻译为C之前清理Python代码可能是一个好主意。原始代码太重复了,大多数if可以重写为字典查找。 –

+0

完整的错误信息会有帮助,例如行号,错误代码等... –

回答

1

有很多事情错在Python这种转换到C.

  • 使用单引号',而不是字符串双引号"(如参数要传递到printf
  • 的函数moedas_troco的多个返回值。你不能在C中返回多个值,并且没有像在Python中那样的隐式元组构造。
  • C期望每个函数的每个参数的类型定义。它将默认为int,但这是非常糟糕的做法,您应该指定类型。
  • 您正在使用参数名称映射全局变量名称。这也是一种不好的做法,只会让你误解你所引用的变量。
  • gets功能是危险的,不应该使用。考虑使用fgets来代替。
  • printf需要一个字符串作为第一个参数传递。你在多个地方传递整数。

您的具体错误“下标值既不是数组也不是指针也不是矢量”,因为您没有定义参数类型matriz_cadastro(即映射同名全局变量),因此C编译器假定它是一个整数,而不是全局数组。

相关问题