“下标值既不是数组也不是指针,也不是矢量”将Python代码转换为C语言

时间:2016-03-03 17:51:50

标签: c multidimensional-array code-conversion

所以我不得不制作一台自动售货机。我首先在Python中做到了它并且它像我想要的那样工作(这是代码,抱歉,但有些东西是葡萄牙语):

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 个答案:

答案 0 :(得分:1)

从Python到C的转换有很多问题。

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

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