Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - andie13

#11
Si elimino m=(Matriz*)malloc(sizeof(Matriz));
me funciona correctamente. ¿Debería de ejecutar algún bucle para guardar memoria o quitando eso llegaría? así no me da problema ninguno.
gracias por responder!
#12
Hola!
Necesito calcular la suma de cada fila de una matriz cuadrada tal que así, mediante punteros, pero la suma de las filas no funciona correctamente (me da un valor de más) y las columnas no las suma directamente.

     1       1       1   | 3
     1       1       1   | 3
     1       1       1   | 3
------- ------- -------
     3       3       3 

La matriz está declarada como una estructura con
typedef struct{
int filas;
int columnas;
int *datos;
}Matriz;

El código es el siguiente:
int sumarfilas(Matriz *m)
{
    int i,j,a,b,suma,vertical[i];
    a=m->filas;
    b=m->columnas;
for(i=0;i<a;i++)
    {
    suma=0;
        for(j=0;j<b;j++)
        {
            suma+=*(m->datos+i*b+j);
        }
        vertical[i]=suma;
    }
return vertical[i];
}
int sumarcolumnas(Matriz *m){
    int c,f,a,b,vector[c];
    a=m->filas;
    b=m->columnas;
    for(c=0;c<b;c++){ // por cada columna
        for( f=0;f<a;f++) // por cada elemento de la columna
        vector[c]+=*(m->datos+f*b+c);
       
    }
    return vector[c];
}


Gracias!
#13
Gracias por la aportación  ;).
Aún así, he declarado el campo de la estructura con un vector de punteros **datos, y he cambiado el scanf que me has dicho, pero me da error justo al llegar a esa línea de código. No sé si es que te he entendido mal y no lo puse como me dijiste, o si se debe a otra cosa.
Muchas gracias!

void LeerMatriz(Matriz *m)
{
    int i=0,j=0;
    for(i=0; i<m->filas; i++)
    {
        for(j=0; j<m->columnas; j++)
        {               
            printf("Escriba o valor para M(%d,%d) = ",i+1,j+1);
            scanf("%d", m->datos[i][j]);
        }
    }
}
#14
Perdón, me expresé mal.
Sí que me compila, lo que hace es que no funciona correctamente. Perdón por la mala expresión.
Yo creo que el error está en los scanf o algo parecido, porque el programa al ejecutarlo sí que me deja indicarle el número de filas y columnas y me pide una matriz del correspondiente tamaño.

Gracias por tomarte tu tiempo respondiéndome.
#15
Hola!
Quiero crear una matriz dinámica con funciones básicas.
Aquí solo hay una porción de código para guardar espacio, leer y escribir la matriz (soy consciente de que falta liberar la memoria y más cosas).
El caso es que no me funciona y creo que el fallo está en el modo de uso de punteros, pero no entiendo por qué. Si alguien me puede explicar por qué está mal, se lo agradezco mucho.
Gracias!

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

typedef struct{
   int filas;
   int columnas;
   int *datos;
}Matriz;

void CrearMatriz (Matriz *m, int f, int c){
   m=(Matriz*)malloc(sizeof(Matriz));
   
   f=m->filas;
   c=m->columnas;
   m->datos=(int*)malloc(f*c*sizeof(int));
   
   if (m==NULL || m->datos==NULL){    
       printf("Memoria insuficiente.\n");
       exit(1);
   }
}
void LeerMatriz(Matriz *m){
   int i=0,j=0;
   for(i=0; i<m->filas; i++)
   {
       for(j=0; j<m->columnas; j++)
       {              
           printf("Escriba o valor para M(%d,%d) = ",i+1,j+1);
           scanf("%d",*(m->datos + i+j));
       }
   }
}

void EscribirMatriz(Matriz *m){
   int i=0,j=0;
   
   printf("\n\tLa matriz es: "); /*RUTINA PARA IMPRIMIR*/
   for(i=0;i<m->filas;i++){
       printf("\n\t");
       for(j=0;j<m->columnas;j++){
           printf("  %d  ", *(m->datos+i)+j); //M[i][j]
           }
   }
}

void TransponerMatriz(Matriz *m){
   int i=0,j=0;
   
   printf("\n\n\tLa transpuesta es: ");/*IMPRIMIR MATRIZ TRANSPUESTA*/
   for(i=0;i<m->columnas;i++){
       printf("\n\t");
       for(j=0;j<m->filas;j++){
           printf("  %d  ", *(m->datos+i+j)); //M[j][i]
           }
   }
}
int main(){
   Matriz m;
     
   printf("Introduzca numero de filas: ");
   scanf("%d",&m.filas);
   printf("Introduzca numero de columnas: ");
   scanf("%d", &m.columnas);
   
   CrearMatriz(&m,m.filas,m.columnas);
   LerMatriz(&m);
   EscribirMatriz(&m);
   TransponerMatriz(&m);
   return 0;
}
#16
Hola,
tengo una matriz definida con estructuras tal que
typedef struct{
   int filas;
   int columnas;
   int *datos; //**
}Matriz;


El caso es que después necesito leer los datos de la matriz, y quiero escanearlos en lo que sería equivalente en un array bidimensional M[fila][columna].

El código sería este:
Mi duda es, en el scanf, para hacerlo correctamente con punteros (también teniendo en cuenta de que pedimos el valor para la posición i+1, aunque deberíamos escanearlo en la 0,0).

Gracias!

Posdata: alguien me puede explicar por qué en la estructura definimos el entero *datos, o sea, que uso se le da?

void LerMatriz(Matriz *m)
{
   int i=0,j=0;
   
   for(i=0; i<m->filas; i++)
   {
       for(j=0; j<m->columnas; j++)
      {              
           printf("Valor para M(%d,%d) = ",i+1,j+1);
           scanf("%d",*((m+i)+j)); //AQUI ES DONDE NO SE COMO PONERLO
      }
   }
}
#17
es que no compila directamente, entonces no puedo usar el debugger.
Muchas gracias por los consejos. Intentaré revisar todo hasta que me funcione para detectar los errores.
#18
Hola, me piden que indique el nombre de un archivo (será el nombre del mes) que contiene un formato así:
Mes
Ciudad
12 15 rojo (temperatura min, max y nivel de alerta).
El caso es que el programa debe determinar cuantos dias tiene el mes para saber si es correcto o no y trabajar haciendo la media, moda y tal a partir de ese dato, reservando memoria dinamica para tal. El caso es que no consigo hacerlo funcionar. Sé que tiene algun error suelto, pero no sé identificarlos, y me estoy estresando. Además, he oído que se debe de hacer teniendo en cuenta el argv y argc pero no sé implementarlos en el programa.
Muchas gracias por leer esto, se agradece.


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

/*FUNCION PARA CONTABILIZAR OS DIAS DO MES*/
int seleccionar(char *mes)  {
   int i=0,c;
   
   char meses[12][10] = {"xaneiro","febreiro","marzo","abril","maio","xunho","xullo","agosto","setembro","outubro","novembro","decembro"};
   int diasmes[12]= {31,28,31,30,31,30,31,31,30,31,30,31};
   
   for (i=0; i<12; i++) {
       c=strcmp(mes,diasmes[i]);
       if (c==0) {
           break;
       }
       else if (i==11 && c!=0) {
           printf("O mes e incorrecto, recorde que debe usar minusculas.\n");
           sleep(5);
           exit(0);
       }
   }
   return diasmes[i];
}

/*FUNCION CALCULO DA MEDIA*/
float media(int vector[]){
   float resultado;
   int media=0;
   int i;
   for(i=0;i<32;i++){
       media=vector[i]+media;
   }
   resultado=media/i;
   return(resultado);
}

/*FUNCION CALCULO DA MODA*/
char moda(int amar,int naran,int rojo){
   int res;
   
   if(amar>naran&&amar>rojo){
       res=1;
   }
   else if(naran>amar&&naran>rojo){
       res=2;
   }
   else if(rojo>amar&&rojo>naran){
       res=3;
   }
   else if(amar==naran&&amar!=rojo){
       res=4;
   }
   else if(amar==rojo&&amar!=naran){
       res=5;
   }
   else if(naran==rojo&&naran!=amar){
       res=6;
   }
   else if(amar==naran&&amar==rojo&&naran==rojo){
       res=7;
   }
   return(res);
}

int main(int argc, char** argv[]) {
   int i=0;
   int x;
   int amarillo,amarillo1=0,naranja,naranja1=0,rojo,rojo1=0;
   float minimo,maximo;
   int mod;    
   
   char mes[10];
   char cidade[10];
   float *minimadias;
   float *maximadias;
   char *riscodias;
   
   minimadias=(float*)malloc(sizeof(float));
   maximadias=(float*)malloc(sizeof(float));
   riscodias=(char*)malloc(sizeof(char));
   
   FILE *fp;
   char nombreOrg[50];
   printf("Indique o nome do arquivo que desea abrir (): ");
   scanf("%s",nombreOrg);
   if((fp=fopen(nombreOrg, "r"))==NULL){
       printf("O archivo non pode ser aberto.\n");
       exit(1);
   }
   x=nombreOrg(seleccionar);
   printf("%d",x);
   {
       fscanf(fp,"%s",&mes);
       fscanf(fp,"%s",&cidade);
       
       while(feof(fp)==0){
       //printf("%d\n",argc);
       fscanf(fp,"%d",(minimadias+i));
       fscanf(fp,"%d",(maximadias+i));
       fscanf(fp,"%s",(riscodias+i));
       }
   }
   {
           amarillo=strcmp(riscodias,"amarillo");
           naranja=strcmp(riscodias,"naranja");
           rojo=strcmp(riscodias,"rojo");
           if(amarillo==0){
               amarillo1++;
           }
           else if(naranja==0){
               naranja1++;
           }
           else if (rojo==0){
               rojo1++;
           }
           i++;
       }

   FILE *fp1;
   fp1=fopen("salida4.txt","w");  /*Abrimos o ficheiro salida9.txt*/
       if(fp1==NULL){
       printf("O archivo non pode ser aberto.\n");
       exit(1);
   }
   {  
       minimo=media(minimadias);
       maximo=media(maximadias);
       fprintf(fp1,"O mes e %s.\n",mes);
       fprintf(fp1,"A cidade e %s.\n",cidade);
       fprintf(fp1,"A media das temperaturas minimas e %.2f.\n",minimo);
       fprintf(fp1,"A media das temperaturas maximas e %.2f.\n",maximo);
       mod=moda(amarillo1,naranja1,rojo1);
       
       if(mod==1){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi amarillo.");
       }
       else if(mod==2){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi naranja.");
       }
       else if(mod==3){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi rojo.");
       }
       else if(mod=4){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi amarillo/naranja.");
       }
       else if(mod==5){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi amarillo/rojo.");
       }
       else if(mod==6){
           fprintf(fp1,"%s","O nivel de risco mais repetido foi naranja/rojo.");
       }
       else if(mod==7){
           fprintf(fp1,"%s","O nivel de risco mais repetido e indeterminado.");
       }
   }
   
   fclose(fp);
   fclose(fp1);
   free(maximodias);
   free(minimadias);
   free(riscodias);
}
#19
Muchas gracias a los dos por responder.
He areglado eso que me habéis dicho, y ahora el código queda así, pero me da unos valores aleatorios como respuesta. No sé si es que tengo algo mal declarado o algún error en el paso por referencia.


ACTUALIZACIÓN: lo que me daba error era "ip=IP(&a,&b,&c,&d);", que debería de ser  "ip=IP(a,b,c,d);".



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

char *IP(int d1, int d2, int d3, int d4){
   char *dir;
   
   dir=(char*)malloc(16*sizeof(char));
   
   sprintf(dir,"%d.%d.%d.%d",d1,d2,d3,d4);
   return *dir;
}


int main(){
   int a,b,c,d;
   char *ip;
   
   ip=(char*)malloc(sizeof(char));
   
   printf("Inserte primer campo: ");
   scanf("%d",&a);
   printf("Inserte segundo campo: ");
   scanf("%d",&b);
   printf("Inserte tercer campo: ");
   scanf("%d",&c);
   printf("Inserte cuarto campo: ");
   scanf("%d",&d);
   
   if (a>255 || b>255 || c>255 || d>255){
       printf("\nError: os datos introducidos son incorrectos");
       exit(1);
   }
   else{  
       ip=IP(&a,&b,&c,&d);
       puts(ip);
   }
   free(ip);
   return 0;
}
#20
Necesito introducir cuatro enteros y transformarlos en una IP normal que devuelva un puntero a char.
El caso es que no sé que falla en el programa.


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

char *IP(int d1, int d2, int d3, int d4){
    char *dir;
   
    dir=(char*)malloc(sizeof(char));
    if (d1>255 || d2>255 || d3>255 || d4>255){
        sprintf(*dir,"Error: os datos introducidos son incorrectos");
        exit(1);
    }
    else {
        sprintf(*dir,"%d.%d.%d.%d",d1,d2,d4,d4);
    }

    return dir;
}


main(){
    int a,b,c,d;
   
    printf("Inserte 1 campo: ");
    scanf("%d",&a);
    printf("Inserte 2 campo: ");
    scanf("%d",&b);
    printf("Inserte 3 campo: ");
    scanf("%d",&c);
    printf("Inserte 4 campo: ");
    scanf("%d",&d);
   
    *IP(a,b,c,d);
    puts(*IP);
   
    return(0);
}