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ú

Temas - andie13

#1
Hola,
me da este error:

error for object 0x7ff75ac027d8: pointer being freed was not allocated
* set a breakpoint in malloc_error_break to debug

El caso es que yo creo que es por culpa de esta matriz para la que reservo memoria:
int **matriz;
    matriz = (int **) malloc(n * sizeof(int *));
    for (i = 0; i < n; i++) {
        matriz[i] = (int *) malloc(n * sizeof(int *));
    }


pero hago un free(matriz); y no se por qué me sigue dando ese error.
Solo me da el error en mi Mac, pero si lo ejecuto en ubuntu no.

Gracias!

#2
Hola,
para un trabajo de clase me piden calcular el número de pasos de una función recursiva y su complejidad, todo en el propio programa, y no sé muy bien cómo determinar los pasos. Si alguien me pudiese echar un cable, se lo agradecería.

¡Gracias!

Pd: en este caso el programa es en C, pero me interesa más el método de calcularlos que el propio código.
#3
Hola a todxs,
debo realizar un ejercicio para clase y hay una cosa que no tengo clara: pide explícitamente utilizar esta función void buscar(arbol A, elem dato, arbol *aux); para buscar un elemento de un árbol de letras (que no están ordenadas). El primer parámetro es el árbol dónde queremos buscar, el segundo el dato que se busca y el tercero un puntero que apunte a la posición del árbol donde se encuentra ese elemento.

Ahora bien, la función realiza su trabajo, pero quería saber si existe algún modo de detener la búsqueda cuando se haya encontrado el elemento y de que te avise si no lo ha encontrado. Al ser recursiva y de tipo void, no tengo claro como sería el procedimiento. Os dejo aquí mi función por si a alguien se le ocurre algo.

¡Muchas gracias, compañeros!

void buscar(arbol A, elem dato, arbol *aux){
   elem E;
   if(!esVacio(A)){
       info(A,&E); // Miramos el contenido del nodo y lo almacenamos en la variable auxiliar E
       if(E==dato){ // Si el dato del nodo coincide con el buscado...
           *aux=A;
       }
       else{
           buscar(izq(A),dato,aux);
           buscar(der(A),dato,aux);
       }
   }
}
#4
Desde hace un par de días, Windows no me deja acceder a determinados programas (no muchos, la verdad), como WhatsApp. Pero tampoco me deja desinstalarlos, al instalar algunos nuevos me da un error de "imagen no encontrada", y si intento abrirlos varias veces, me aparece esto, que se abre en bucle y necesito reiniciar:

"Windows 10 - Error exception processing message 0xc000007b parameters 0x7ffb40e1d28 0xc0000428 0x7ffbf40e1d28 0x7ffbf40e1d28"

La semana pasada hice una partición con linux y se movieron los archivos de Windows, pero me funcionaba perfectamente todo. Y el lunes se actualizó windows, así que no sé si será problema de la actualización.
¿Qué puedo hacer antes de reinstalar?
Gracias!
#5
Hola!
Tengo el siguiente problema:
si estoy reproduciendo alguna canción y pauso, al reanudar se pone el volumen a tope (o bien al cambiar de canción), dejándome sorda. Además, si le doy a subir o bajar volumen, sube a partir del punto que debería estar, y se "quita" el volumen máximo. El caso es que he probado de todo y no deja de hacerlo. Tengo el ordenador recién formateado con un disco duro nuevo, no sé si tendrá algún problema el controlador, pero en tal caso me gustaría saber cómo arreglarlo.
Gracias, espero haberme explicado.
#6
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!
#7
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;
}
#8
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
      }
   }
}
#9
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);
}
#10
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);
}
#11
Hola, me gustaría saber cómo determino la cantidad de numeros que tiene un archivo de texto. Ejemplo: 2 3 14 67 12, "5".
#12
Programación C/C++ / Contar palabras en C
12 Noviembre 2016, 13:54 PM
SOLUCIONADO.
#13
¡Hola!
El problema planteado es el siguiente: leer un texto de un archivo y traducirlo a morse. Esa traducción debe guardarse en un archivo nuevo.

Mi problema es que no sé como hacer para que el texto ya traducido se imprima en el archivo. Tal y como está, permite escribir un texto cualquiera que determines de antemano, pero no el resultado de la función.

Y, ya que estamos, me gustaría saber por qué el bucle no traduce bien. Está bien hecho porque la función independiente funciona, pero en ese programa, no.

Muchas gracias de antemano.


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

int cifrarmorse (char frase);

int main(int argc, char** argv){
   FILE *fichero,*fichero2;
   int i=0,a,b,vector[100];
   
     fichero=fopen("entrada7.txt","r");
   
   if(fichero==NULL){
        printf("Error.\n");
       exit(1);
   }
   else{
       printf("El contenido del archivo es:\n\t");
       while (feof(fichero) == 0){
           fgets(vector,100,fichero);    
           puts(vector);
       }
   }

   fclose(fichero);
   
   a=strlen(vector);
   for (i=0; i<a; i++){
       cifrarmorse(vector[i]);
       b=cifrarmorse(vector[i]);
   }
   printf("\n");
   
   fichero2=fopen("salida7","w+");
   if(fichero2==NULL){
       printf("Error.\n");
       exit(1);  
   }
   fprintf(fichero2,"IMPRIME LO QUE ESCRIBA AQUI");
   /*fprintf(FILE *salida7, char *w){*/
   fclose(fichero2);
   return 0;
}

int cifrarmorse (char frase){
   switch (frase){
       case 'a':
       case 'A': printf("·- ");
           break;
       case 'b':
       case 'B': printf("-··· ");
           break;
       case 'c':
       case 'C': printf("-·-· ");
           break;
       case 'd':
       case 'D': printf("-·· ");
           break;
       case 'e':
       case 'E': printf("· ");
           break;
       case 'f':
       case 'F': printf("··-· ");
           break;
       case 'g':
       case 'G': printf("--· ");
           break;
       case 'h':
       case 'H': printf("···· ");
           break;
       case 'i':
       case 'I': printf("·· ");
           break;
       case 'j':
       case 'J': printf("·--- ");
           break;
       case 'k':
       case 'K': printf("-·- ");
           break;
       case 'l':
       case 'L': printf("·-·· ");
           break;
       case 'm':
       case 'M': printf("-- ");
           break;
       case 'n':
       case 'N': printf("-· ");
           break;
       case 'o':
       case 'O': printf("--- ");
           break;
       case 'p':
       case 'P': printf("·--· ");
           break;
       case 'q':
       case 'Q': printf("--·- ");
           break;
       case 'r':
       case 'R': printf("·-· ");
           break;
       case 's':
       case 'S': printf("··· ");
           break;
       case 't':
       case 'T': printf("- ");
           break;
       case 'u':
       case 'U': printf("··- ");
           break;
       case 'v':
       case 'V': printf("···- ");
           break;
       case 'w':
       case 'W': printf("·-- ");
           break;
       case 'x':
       case 'X': printf("-··- ");
           break;
       case 'y':
       case 'Y': printf("-·-- ");
           break;
       case 'z':
       case 'Z': printf("--·· ");
           break;
       case '0': printf("----- ");
           break;
       case '1': printf("·---- ");
           break;
       case '2': printf("··--- ");
           break;
       case '3': printf("···-- ");
           break;
       case '4': printf("····- ");
           break;
       case '5': printf("····· ");
           break;
       case '6': printf("-···· ");
           break;
       case '7': printf("--··· ");
           break;
       case '8': printf("---·· ");
           break;
       case '9': printf("----· ");
           break;
       case '.': printf("·-·-·- ");
           break;
       case ',': printf("--··-- ");
           break;
       case '?': printf("··--·· ");
           break;
       case '"': printf("·-··-· ");
           break;
       case ' ': printf("   ");
           break;
   }        
}
#14
Programación C/C++ / Estructuras en C (ISBN)
9 Noviembre 2016, 00:55 AM
¡Hola!
Estoy intentando hacer un programa que calcule digito de control de un codigo ISBN introducido por el usuario, a través de 3 campos diferenciados, utilizando estructuras. Para calcular el digito de control hay que ir multiplicando cada cifra por su posición, y al final hallar el resultado de la suma módulo 11. Si el digito es 10, se pone X.

Lo que no entiendo es:
a) En el programa está indicado la longitud del vector introducido para hacer los cálculos, pero quiero hacerlo de modo genérico, el caso es que no sé como indicarlo.
b) No controlo bien las estructuras y el hecho de convertirlas de char a int etc.


He conseguido escribir el código casi totalmente, con la excepción de la función main, que soy consciente de que no está bien.

¡Muchas gracias!


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
   
struct ISBN{
   char camp1[6];          /*Grupo*/
   char camp2[8];          /*Editor*/
   char camp3[8];          /*Titulo*/
   int control;        /*Digito de control*/
};

struct ISBN controlisbn(char c1[], char c2[], char c3[]){
   int control=0,i=0;
   struct ISBN a;
   for (i=0; i<1; i++){
       a.camp1[i]=c1[i];
   }
   for (i=0; i<5; i++){
       a.camp2[i]=c2[i];
   }
   for (i=0; i<9; i++){
       a.camp3[i]=c3[i];
   }
   for (i=0; i<1; i++){
       control+=c1[i]*(i+1);
   }
   for (i=0; i<5; i++){
       control+=c2[i]*(i+3);
       }
   for (i=0; i<9; i++){
       control+=c3[i]*(i+8);
   }
   
   a.control=control%11;
   return(a);
};
void main(){
   int a,b,c;
   struct ISBN libro;
   int x;
   
   printf("Intruduzca primer campo del ISBN: ");
   gets(a);
   printf("Intruduzca segundo campo del ISBN: ");
   gets(b);
   printf("Intruduzca tercer campo del ISBN: ");
   gets(c);
   
   strcpy(a,libro.camp1);
   strcpy(b,libro.camp2);
   strcpy(c,libro.camp3);

       
   x=controlisbn;
   if (x==10){
       printf("\nCaracter de control es X");
   }
   else{
       printf("\nCaracter de control es %d", x);
   }
}

//Ejemplo: 1-2345-6789----7
#15
Programación C/C++ / Morse - ¿donde está mal?
7 Noviembre 2016, 01:16 AM
Hola, estaba intentando crear un programa sencillito para traducir un texto a morse. El caso es que no sé que está mal. El código es el siguiente:
(Por curiosidad, ¿cómo podría conseguir realizar el mismo algorirmo sin la biblitoecastring.h)

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

void cifrarmorse (char frase[], int a){    
   char letra;
   
   switch (letra){
       case 'a':
       case 'A': printf("·- ");
           break;
       case 'b':
       case 'B': printf("-··· ");
           break;
       case 'c':
       case 'C': printf("-·-·" );
           break;
       case 'd':
       case 'D': printf("-·· ");
           break;
       case 'e':
       case 'E': printf("· ");
           break;
       case 'f':
       case 'F': printf("··-· ");
           break;
       case 'g':
       case 'G': printf("--· ");
           break;
       case 'h':
       case 'H': printf("···· ");
           break;
       case 'i':
       case 'I': printf("·· ");
           break;
       case 'j':
       case 'J': printf("·--- ");
           break;
       case 'k':
       case 'K': printf("-·- ");
           break;
       case 'l':
       case 'L': printf("·-·· ");
           break;
       case 'm':
       case 'M': printf("-- ");
           break;
       case 'n':
       case 'N': printf("-· ");
           break;
       case 'o':
       case 'O': printf("--- ");
           break;
       case 'p':
       case 'P': printf("·--· ");
           break;
       case 'q':
       case 'Q': printf("--·- ");
           break;
       case 'r':
       case 'R': printf("·-· ");
           break;
       case 's':
       case 'S': printf("··· ");
           break;
       case 't':
       case 'T': printf("- ");
           break;
       case 'u':
       case 'U': printf("··- ");
           break;
       case 'v':
       case 'V': printf("···- ");
           break;
       case 'w':
       case 'W': printf("·-- ");
           break;
       case 'x':
       case 'X': printf("-··- ");
           break;
       case 'y':
       case 'Y': printf("-·-- ");
           break;
       case 'z':
       case 'Z': printf("--·· ");
           break;
       case '0': printf("----- ");
           break;
       case '1': printf("·---- ");
           break;
       case '2': printf("··--- ");
           break;
       case '3': printf("···-- ");
           break;
       case '4': printf("····- ");
           break;
       case '5': printf("····· ");
           break;
       case '6': printf("-···· ");
           break;
       case '7': printf("--··· ");
           break;
       case '8': printf("---·· ");
           break;
       case '9': printf("----· ");
           break;
       case '.': printf("·-·-·- ");
           break;
       case ',': printf("--··-- ");
           break;
       case '?': printf("··--·· ");
           break;
       case '"': printf("·-··-· ");
           break;
       case ' ': printf("   ");
           break;
   }        
}

int main(int argc, char** argv){
   int a;
   char frase[95];
   printf("Introduzca una frase:\n");
   gets(frase);
   a=strlen(frase);
   cifrarmorse(frase,a);
   
   return 0;
}