Otra ayudita practica C

Aun a riesgo de parecer pesado, necesito que me volváis a echar una mano con una pequeña práctica en C:
El enunciado de la práctica es el siguiente:
Se dispone de dos vectores paralelos de 5 elementos, el primer vector contiene cadenas de caracteres (nombre de un articulo, máximo 20 caracteres), el segundo vector contiene números enteros (unidades disponibles, se admite el valor 0).
Proceso a realizar:
Desde teclado se introducirá el nombre de un artículo y las unidades disponibles, estos datos se ubicaran en los respectivos vectores, teniendo en cuenta lo siguiente:
Si el nombre de artículo no existe en el vector de nombres, se ubicara en la siguiente posición libre en el vector de nombres, y las unidades correspondientes se ubicaran en posición homologa en el vector de unidades).
Si el nombre de artículo ya existe en el vector de nombres, las unidades correspondientes se sumara a la cantidad existente en la posición homologa en el vector de unidades).
Al final del programa se mostraran los datos introducidos
Controlar que no se admitan más de cinco nombres diferentes, no obstante la entrada de datos debe poderse terminar antes de completar los cinco nombres.

y lo que yo he hecho ha sido:

#include <stdio.h>
#include <string.h>
typedef char Tarticulo [5][21];
typedef int Tunidades [5];
int main(){
Tarticulo articulos;
Tunidades unidades;
char art[21];
int i, j, uds, repetido = 0;
for(i=0; i<5; i++){
printf("Introduzca el nombre del articulo y las unidades");
gets(art);
scanf("%i", uds);
for(j=0; j<5; j++){
if(art == articulos[j]){
unidades[j] = unidades[j] + uds;
repetido = 1;
}
}
if(repetido==0){
for(j=0; j<5; j++){
if (articulos[j] == ' '){
articulos[j] = art;
unidades[j] = uds;
}
}
}
}
for(i=0; i<5; i++){
printf("El articulo %s tiene %i unidades", articulos[i], unidades[i]);
}

}


Lo cierto es que no entiendo del todo por qué no me funciona, a ver si no os importa echarme una manilla!
Gracias!!
asi rapido sin mirar mucho ^^U:
no puedes comparar cadenas con ==, usa strcmp()
ademas, yo q tu no usaria gets(), usa mejor fgets()
ElChabaldelPc escribió:asi rapido sin mirar mucho ^^U:
no puedes comparar cadenas con ==, usa strcmp()
ademas, yo q tu no usaria gets(), usa mejor fgets()


entonces puedo sustituir el
if (articulos[j] == ' '){

por
if (strcmp(articulos[j], ){
??
no, la cosa quedaria mas bien asi:

#include <string.h>


if((strcmp(articulos[j],arts))==0)
{
....
ya que strcmp devuelve un 0 si ambas cadenas son iguales, >0 si la segunda va antes alfabéticamente y <0 si la primera va antes



ademas, para copiar 1 cadena a otra debes usar:
strcpy(destino, origen);
ElChabaldelPc escribió:no, la cosa quedaria mas bien asi:

#include <string.h>


if((strcmp(articulos[j],arts))==0)
{
....
ya que strcmp devuelve un 0 si ambas cadenas son iguales, >0 si la segunda va antes alfabéticamente y <0 si la primera va antes



ademas, para copiar 1 cadena a otra debes usar:
strcpy(destino, origen);


muchas gracias!!
Creo que lo he mejorado, pero me sigue fallando. Al introducir el primer producto y las primeras unidades, el programa choca...
#include <stdio.h>
#include <string.h>
typedef char Tarticulo [5][21];
typedef int Tunidades [5];
int main(){
Tarticulo articulos;
Tunidades unidades;
char art[21];
int i, j, uds, repetido = 0;
for(i=0; i<5; i++){
printf("Introduzca el nombre del articulo y las unidades\n");
fgets(art);
scanf("%i", uds);
for(j=0; j<5; j++){
if((strcmp(art, articulos[j])) == 0){
unidades[j] = unidades[j] + uds;
repetido = 1;
}
}
if(repetido == 0){
for(j=0; j<5; j++){
if (articulos[j][1] == EOF ){
strcpy (articulos[j], art);
unidades[j] = uds;
}
}
}
}
for(i=0; i<5; i++){
printf("El articulo %s tiene %i unidades", articulos[i], unidades[i]);
}

}


EDIT: Era por el & de scanf.... lo que pasa es que ahora el programa me pide una vez el producto y unidades, y luego solo pide el producto cada vez, y no las unidaes... voy a ver si consigo encontrar el fallo!
estas usando mal fgets, la sintaxis seria asi:
fgets(destino,tamaño_maximo,origen)
en tu caso seria asi:
fgets(art,21,stdin)

con esto evitas intentar meter de mas en el destino, que probocaria un fallo
¿Estás seguro de que puedes usar EOF ahí? Yo que tú inicializaría la variable unidades de algún modo(-1, por ejemplo) para poder usarla como comprobador, de modo que si unidades[j] == -1 es que articulo[j] no se ha usado aún...Yo es que no uso nunca EOF, pero no me suena que puedas usarlo así...

Ah, y si usas fgets como te dice ElCHabaldelPc(que a mi también me parece más fácil) te coge la línea entera, así que luego tendrias que usar sscanf(destino del fgets, "%s %d", destino(las variables articulo y unidades))...
ahora q lo dices... no recuerdo si se qdaban a \0 o se inicializaban con datos aleatorios (esto me pasa por tener tan abandonado c [+risas] )
siempre puedes hacer que se inicialicen todas como una combinación (ej: **##**##) y si encuentra eso, esq esta vacía
Hombre grifo escribió:¿Estás seguro de que puedes usar EOF ahí? Yo que tú inicializaría la variable unidades de algún modo(-1, por ejemplo) para poder usarla como comprobador, de modo que si unidades[j] == -1 es que articulo[j] no se ha usado aún...Yo es que no uso nunca EOF, pero no me suena que puedas usarlo así...

Ah, y si usas fgets como te dice ElCHabaldelPc(que a mi también me parece más fácil) te coge la línea entera, así que luego tendrias que usar sscanf(destino del fgets, "%s %d", destino(las variables articulo y unidades))...


Muchas gracias, no estaba seguro de si se podía usar, y no sabía como comprobar si la posición del array estaba vacia, y la verdad es que inicializar unidades a -1 es mucho mejor!!
Gracias a todos!
8 respuestas