|
111
|
Programación / Programación C/C++ / abrir archivo con default
|
en: 26 Noviembre 2013, 22:08 pm
|
Saludos, yo siempre que utilizo archivos los creo y abro indicandole al fopen que quiero crear mi archivo en la USB, pero ahora quiero usar la forma default solo que no se como hacerlo ni donde me va a crear y guardar los archivos: #include <stdio.h> #include <stdlib.h> void crearTablero(int n,int **tablero); int main() { FILE *pd; if((pd = fopen("F:\\archivo.txt","w"))!= NULL ) printf("Se ha creado archivo"); }
de antemano gracias
|
|
|
112
|
Programación / Programación C/C++ / memoria dinamica y funciones
|
en: 25 Noviembre 2013, 03:09 am
|
saludos tengo el siguiente codigo en el que le asigno memoria dinamica a una matriz en lenguaje C para poder ingresarle x numero de datos, el problema que tengo es que si quiero pasarle la matriz a una funcion para dentro de esta asignarle memoria dinamica el programa me truena, pero si se la asigno dentro del main el programa funciona correctamente y no se a que se debe, este es el codigo que me truena: #include <stdio.h> #include <stdlib.h> void inicializaTablero(char **tablero,int n); int main() { int n,i,j; char **tablero; printf("Dame tamanio de tablero: "); inicializaTablero(tablero,n); for(i = 0;i < n;i++) { for(j = 0;j < n;j++) } return 0; } void inicializaTablero(char **tablero,int n) { int i,j,k; tablero = (char**)malloc(n *sizeof(char*)); for(i = 0;i < n;i++) tablero [i ] = (char*)malloc(n ); for(j = 0;j < n;j++) { for(k = 0;k < n;k++) tablero[j][k] = '0'; } }
y de esta manera si funciona: #include <stdio.h> #include <stdlib.h> int main() { int n,i,j,k; char **tablero; printf("Dame tamanio de tablero: "); tablero = (char**)malloc(n *sizeof(char*)); for(i = 0;i < n;i++) tablero [i ] = (char*)malloc(n ); for(j = 0;j < n;j++) { for(k = 0;k < n;k++) tablero[j][k] = '0'; } for(i = 0;i < n;i++) { for(j = 0;j < n;j++) } return 0; }
de antemano gracias
|
|
|
113
|
Programación / Programación C/C++ / desbordamiento de arreglos
|
en: 24 Noviembre 2013, 01:41 am
|
Saludos, si tengo una matriz en C, en la cual tengo que posicionarme en alguna de las casillas( le pido la fila y la columna al usuario), y despues a apartir de esa casilla quiero moverme x numero de celdas en el eje de las filas y x numero de celdas en el eje de las columnas, ¿Cual es a manera correcta de validar que la nueva posicion en la que me encuentro es una celda valida para que no se desborde el arreglo???,podria ser algo como esto? void verificarCelda(char **arreglo,int filaInicial,int columnaInicial) { if(arreglo[filaInicial + 2][columnaInicial - 1] != -1) }
|
|
|
114
|
Programación / Programación C/C++ / matrices y memoria dinamica
|
en: 22 Noviembre 2013, 23:13 pm
|
Saludos si tengo una matriz n x n, a la que quiero asignarle memoria dinamicamente porque su tamaño solo se puede saber en tiempo de ejecucion, cual es la manera correcta de hacerlo? char **tablero; tablero = (char**)malloc(tamanio *sizeof(char*);
o esta otra: char **tablero; tablero = (char**)malloc(n *sizeof(char)); for(i = 0;i < n;i++) tablero [i ] = (char*)malloc(n *sizeof(char));
otra duda, estaba leyendo un manual sobre memoria dinamica y me decia que si hacia algo como esto me iba a dar error de compilacion que porque el compilador requiere que el tamaño del array o de la matriz sea constante: int main() { int num_estudiantes,i; printf("Dame numero de estudiantes: "); scanf("%d",&num_estudiantes ); int asignatura[num_estudiantes]; for(i = 0;i < num_estudiantes;i++) { scanf("%d",&asignatura [i ]); }
pero ya lo probe y me compila correctamente, a que se debe esto?? gracias
|
|
|
115
|
Programación / Programación C/C++ / copiar vectores de enteros
|
en: 21 Noviembre 2013, 22:14 pm
|
Saludos
Tengo un arreglo de enteros y quiero copiarlo a otro arreglo, pense que lo podia hacer con la funcion strcpy(), pero despues me di cuenta que esta solo se usa para cadenas. Entonces que otra manera hay de hacer esto??
gracias
|
|
|
116
|
Programación / Programación C/C++ / Lista doblemente ligada
|
en: 14 Noviembre 2013, 23:54 pm
|
Saludos tengo una lista doblemente ligada que me inserta por la cabeza, por el final, despues y antes de un elemento que se le pide al usuario, todavia no esta terminado pero el problema que tengo es con el caso de insertar antes de un elemento dado, que me truena el programa y no entiendo por que, creo que el problema es que una vez que le pido al usuario el numero antes del que quiero ingresar mando llamar a la funcion anterior #include <stdio.h> #include <stdlib.h> #define INSERTAR_CABEZA 1 #define INSERTAR_ANTES 2 #define INSERTAR_DESPUES 3 #define INSERTAR_FINAL 4 #define SALIR 5 typedef struct nodo { int elemento; struct nodo *sig; struct nodo *ant; }Nodo; Nodo *crearNodo(int insertable); void insertarCabeza(int insertable,Nodo **cabeza); void insertar_antes(Nodo *anterior,int insertable); void insertar_despues(Nodo *posterior,int insertable); void insertarFinal(Nodo *ultimo,int insertable); Nodo *buscarElemento(int elementoBuscado,Nodo *cabeza); void imprimirLista(Nodo *cabeza); Nodo *ultimoElemento(Nodo *cabeza); Nodo *Anterior(Nodo *p); int main() { Nodo *cabeza,*anterior,*posterior,*p,*ultimo; cabeza = NULL; int continuar = 1,opcion,numElementos,insertable,elementoBuscado,i; printf("Lista Doblemente Enlazada!\n\n"); do { printf("1) Insertar cabeza de Lista\n"); printf("2) Insertar antes de elementento\n"); printf("3) Insertar despues de elemento\n"); printf("4) Insertar final de Lista\n"); switch(opcion) { case INSERTAR_CABEZA: printf("Dame el numero de elementos de la lista: "); scanf("%d",&numElementos ); for(i=0;i < numElementos;i++) { printf("Dame el elemento a insertar: "); insertarCabeza(insertable,&cabeza); } imprimirLista(cabeza); break; case INSERTAR_ANTES: printf("Antes de que elemento se quiere insertar: "); scanf("%d",&elementoBuscado ); if((p = buscarElemento(elementoBuscado,cabeza))!=NULL) { printf("Dame el elemento a insertar: "); anterior = Anterior(p); insertar_antes(anterior,insertable); } else printf("No se encontro elemento!\n"); imprimirLista(cabeza); break; case INSERTAR_DESPUES: printf("Despues de que elemento deseas insertar: "); scanf("%d",&elementoBuscado ); if((posterior = buscarElemento(elementoBuscado,cabeza))!=NULL) { printf("Dame el elemento a insertar: "); insertar_despues(posterior,insertable); } else printf("No se encontro elemento!\n"); imprimirLista(cabeza); break; case INSERTAR_FINAL: printf("Dame el numero de elementos de la lista: "); scanf("%d",&numElementos ); if(estaVacia(cabeza)) { printf("Dame el elemento a insertar: "); cabeza = crearNodo(insertable); numElementos--; } for(i = 0;i < numElementos;i++) { ultimo = ultimoElemento(cabeza); printf("Dame el elemento a insertar: "); insertarFinal(ultimo,insertable); } imprimirLista(cabeza); break; case SALIR: continuar = 0; break; } if(continuar) }while(continuar); return 0; } Nodo *crearNodo(int insertable) { Nodo *p; p = (Nodo *)malloc(sizeof(Nodo )); p->elemento = insertable; p->sig = NULL; p->ant = NULL; return p; } void insertarCabeza(int insertable,Nodo **cabeza) { Nodo *nuevo; nuevo = crearNodo(insertable); nuevo->sig = *cabeza; nuevo->ant = NULL; *cabeza = nuevo; } void insertar_antes(Nodo *anterior,int insertable) { Nodo *nuevo; nuevo = crearNodo(insertable); anterior->sig->ant = nuevo; nuevo->ant = anterior; nuevo->sig = anterior->sig; anterior->sig = nuevo; } void insertar_despues(Nodo *posterior,int insertable) { Nodo *nuevo; nuevo = crearNodo(insertable); posterior->sig->ant = nuevo; nuevo->ant = posterior; nuevo->sig = posterior->sig; posterior->sig = nuevo; } void insertarFinal(Nodo *ultimo,int insertable) { ultimo->sig = crearNodo(insertable); ultimo->sig->sig = NULL; ultimo->sig->ant = ultimo; } void imprimirLista(Nodo *cabeza) { Nodo *ptr; for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig) } Nodo *buscarElemento(int elementoBuscado,Nodo *cabeza) { Nodo *ptr; for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig) { if(ptr->elemento == elementoBuscado) return ptr; } return NULL; } Nodo *ultimoElemento(Nodo *cabeza) { Nodo *ptr; ptr = cabeza; while(ptr->sig!=NULL) ptr = ptr->sig; return ptr; } int estaVacia(Nodo *cabeza) { if(cabeza == NULL) return 1; else return 0; } Nodo *Anterior(Nodo *p) { return p->ant; }
gracias
|
|
|
117
|
Programación / Programación C/C++ / programa tarjetas
|
en: 9 Noviembre 2013, 06:02 am
|
Saludos Tengo el siguiente programa que dice: Tengo n tarjetas numeradas en cierto orden(al azar), y hay que eliminar algunas de esas tarjetas, de tal forma que las que queden esten ordenadas ascendentemente, y cuyos valores esten entre el rango 1 <= valores <= 100,000, esto ya lo codifique pero el problema que tengo es que me pide encontrar el menor numero de tarjetas que se pueden eliminar y es lo que no entiendo como hacerlo, o sea que tengo que buscar todas las posibilidades y despues verificar cual es la que puede eliminar el menor numero de tarjetas?? el codigo es el siguiente: #include <stdio.h> #include <stdlib.h> #include <time.h> #define VALORES 100000 typedef struct nodo { int dato; struct nodo *sig; }Nodo; void agregarTarjetas(int x,Nodo **cabeza); void imprimirTarjetas(Nodo *cabeza); void eliminarTarjetas(Nodo *cabeza); Nodo *crearNodo(int x); int main() { int numeroTarjetas,i,x; Nodo *cabeza; cabeza = NULL; do { printf("Dame numero de tarjetas: "); scanf("%d",&numeroTarjetas ); }while((numeroTarjetas < 1)||(numeroTarjetas > 100)); for(i = 0;i < numeroTarjetas;i++) { agregarTarjetas(x,&cabeza); } imprimirTarjetas(cabeza); eliminarTarjetas(cabeza); imprimirTarjetas(cabeza); return 0; } void agregarTarjetas(int x,Nodo **cabeza) { Nodo *nuevo; nuevo = crearNodo(x); nuevo->sig = *cabeza; *cabeza = nuevo; } Nodo *crearNodo(int x) { Nodo *p; p = (Nodo *)malloc(sizeof(Nodo )); p->dato = x; p->sig = NULL; return p; } void imprimirTarjetas(Nodo *cabeza) { Nodo *ptr; for(ptr = cabeza;ptr!=NULL;ptr = ptr->sig) } void eliminarTarjetas(Nodo *cabeza) { Nodo *ptr1,*ptr2; for(ptr1 = cabeza,ptr2 = ptr1->sig;ptr2!=NULL;ptr2 = ptr2->sig) { if(ptr2->dato < ptr1->dato) ptr1->sig = ptr2->sig; else ptr1 = ptr1->sig; } }
esta la hice con listas con apuntadores porque pense que seria mas facil hacer las eliminaciones, aunque tambien lo habia hecho de esta otra manera, y las dos funcionan solo que no se como hacer un algoritmo que me determine cual es el menor numero de tarjetas que se pueden eliminar #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define VALORES 100000 int *ingresarValores(int numeroTarjetas,FILE *fd); void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd); int main() { FILE *fd; int numeroTarjetas,*tarjetas; if((fd = fopen("F:\\Archivo_Analisis_Algoritmos.txt","w"))!= NULL ) { do { printf("Dame el numero de tarjetas: "); scanf("%d",&numeroTarjetas ); }while((numeroTarjetas < 1)||(numeroTarjetas > 1000)); fprintf(fd ,"Archivo de Texto:\n\n"); tarjetas = ingresarValores(numeroTarjetas,fd); eliminarTarjetas(tarjetas,numeroTarjetas,fd); } else printf("No se pudo crear archivo\n"); return 0; } int *ingresarValores(int numeroTarjetas,FILE *fd) { int i,*buffer; buffer = (int*)malloc(numeroTarjetas *sizeof(int)); for(i = 0;i < numeroTarjetas;i++) { buffer [i ] = rand()% VALORES +1; if((i%10==0)&&(i!=0)) } return buffer; } void eliminarTarjetas(int tarjetas[],int numeroTarjetas,FILE *fd) { int i,j; for(i=0;i < numeroTarjetas;i++) { for(j=i+1;j < numeroTarjetas;j++) { if(tarjetas[j] < tarjetas[i]) tarjetas[i] = -1; } } fprintf(fd ,"\n\nTarjetas eliminadas\n"); for(i=0;i < numeroTarjetas;i++) { if(tarjetas[i] != -1) } }
por ejemplo si tengo los numeros [11,500][22,924][13,449][21,933][13,150][1,858][11,516], se que el menor numero de eliminaciones serian 4, y quedaria asi: [11,500][13,449][21,933], pero trate de buscarle la logica y no supe como de antemano gracias
|
|
|
118
|
Programación / Programación C/C++ / colores de texto
|
en: 6 Noviembre 2013, 01:19 am
|
Saludos
Si tengo un codigo con varios printf, y quiero cambiarle el color de fuente a solo uno de esos printf, como lo haria, intente con system("color"); pero imprime todo de ese color y no solo el printf que yo quiero,tendria que agregar alguna libreria o algo asi??
gracias
|
|
|
119
|
Programación / Programación C/C++ / fwrite y estructuras
|
en: 4 Noviembre 2013, 02:14 am
|
Saludos si tengo la siguiente estructura en la que tengo campos de tipo cadena y campos de tipo entero, cual es la manera para poder escribirlos en un archivo utilizando a fuerzas la funcion fwrite()?? typedef struct { char nombre[MAX]; int edad; char ciudad_residencia[MAX]; }Persona;
el problema que tengo es con el campo int me imprime basura a la hora de escribir en el archivo: int main() { FILE *fd; Persona p; agregarDatos(&p); if((fd = fopen("F:\\gente.txt","w"))!=NULL ) { fwrite(&p. edad,sizeof(int),1,fd );// aqui esta el error fwrite(p. ciudad_residencia,sizeof(char),strlen(p. ciudad_residencia),fd ); } else printf("No se pudo crear archivo\n"); return 0; }
tengo entendido que con el fprintf me puedo quitar de problemas, pero tengo que usar a fuerzas el fwrite de antemano gracias
|
|
|
120
|
Programación / Programación C/C++ / cambiar for a do-while
|
en: 1 Noviembre 2013, 23:28 pm
|
Saludos tengo la siguiente funcion que tiene un for el cual quiero convertirlo a un do-while, pero no se bien como hacerlo void imprimirLista(Nodo *cabeza) { Nodo *p,*ult; for(p = cabeza,ult = fin(cabeza);p!=ult;p = p->sig) { printf("%s\n\n",p ->ciudad_residencia ); } } Nodo *fin(Nodo *cabeza) { Nodo *ptr = cabeza; while(ptr->sig!= NULL) ptr = ptr->sig; return ptr; }
el principal problema es que no se donde poner el p = p->sig en el do while?? probe con lo siguiente pero me marca errores void imprimirLista(Nodo *cabeza) { Nodo *p,*ult; p = cabeza; ult = fin(cabeza); do { printf("%s\n\n",p ->ciudad_residencia ); p = p->sig; }while(p!=ult); }
gracias
|
|
|
|
|
|
|