PDA

Ver la versión completa : Más C



Almorca
09-08-2004, 00:22
Mi pregunta es como puedo detectar cuando el usuario pulsa una tecla y saber que tecla es.

Me explico, yo tengo un bucle

do
{
...
}
while (usuario no pulse la tecla tal).

¿como hago eso?

Dwarft
09-08-2004, 02:00
do
{
...
scanf("%s",&tecla);
}
while(tecla != ' ');

Entre ' ' tienes que poner la letra que quieras, por ejemplo la s:

while(tecla != 's');

Salu2 !

zel089
09-08-2004, 18:37
que tal Dwarft,

y si quisiera que sea una tecla de funciones ej: F1,F2, etc
que tipo de variable utilizaria para almacenar el dato porque me imagino que debe ser con el codigo ASCII o algo asi..


Gracias..

Almorca
09-08-2004, 20:32
Eso ya lo sabía, pero el problema de eso es que el programa para y te obliga a que escribas algo o le des al <enter>.

Yo lo que quiero es algo como el keypressed de Pascal, que compruebe si se ha pulsado una tecla y si no se ha pulsado que el programa continue.

Y otra pregunta. Existe algo parecido al delay de Pascal en C.
El delay lo que hace es que el ordenador está el tiempo que tu le pongas sin hacer nada. ¿Existe una instrucción parecida en C?

Scar_T
09-08-2004, 21:08
Es fácil hacer algo así en DOS.



while(1) {
if(kbhit()) {
// Se apreto una tecla
if(getch() == 0x1B) // Verificar si apreto Esc. por ejemplo
break; //Rompemos el bucle :)
}
}

zel089
10-08-2004, 20:32
Que tal Almorca

en LCCwin32 existe Sleep(cantidad de milisegundos)
creo que es la misma en c,

Gracias Scar_T y en donde puedo ubicar las direcciones de las teclas como para ESC que es 0x1B

Almorca
10-08-2004, 21:19
Gracias Scar_T era justamente lo que andaba buscando.

zel089 como uso el Sleep, porque la ayuda me dice lo siguiente:
VOID Sleep(
DWORD dwMilliseconds // sleep time
);

Requirements
Windows NT/2000: Requires Windows NT 3.1 or later.
Windows 95/98: Requires Windows 95 or later.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

pero aunque incluyo la libreria windows.h no me reconoce la función.

Scar_T
11-08-2004, 05:27
Pues lo que te regresa la función getch es el código ASCII de la tecla. Sinceramente no recuerdo cuales son los códigos para cada tecla, pero puedes hacer un programita que imprima el codigo de la tecla.

printf("%02x\n", getch()).

zel089
12-08-2004, 16:56
Ok gracias Scar_T, y me podrias ayudar con algo de arreglos dinamicos...


Que tal simplemente antes del proceso que quieres que se detenga por un momento
colocas Sleep(Numero de milisegundos);

por ej:

#include <windows.h>
#include <stdio.h>

void main()
{

printf("Ingrese 1 numero");
n1=GetInteger();

printf("Ingrese 2 numero");
n2=GetInteger();

t=n1+n2;
printf("Espere");

Sleep(2500);

printf("La suma es: %d", t);

}

Scar_T
12-08-2004, 22:30
zel089: ¿En qué quieres que te ayude?

zel089
17-08-2004, 16:39
Que tal Scar_T como puedo ingresar una matriz pero con memoria dinamica es decir como la declaro y como la trato..
La verdad se me hace algo confuso la utilizacion de punteros con memoria dinamica.

Dwarft
17-08-2004, 18:57
//Declaracion de una estructura dinamica
typedef struct
{ int dato1;
char dato2;

nodo *sig;
}nodo;

//Declaracion de punteros para la utilizacion de la estructura dinamica
nodo *i=NULL,*a,*w;

Y un ejemplo de como introducir datos:

//Declaramos
typedef struct
{ char nombre[30];
int edad;

nodo *sig;
}nodo;
nodo *i=NULL,*a,*w;

//Introduciendo datos
case '1':
{ if(i == NULL)
{ printf("\nIntroduce su nombre: ");
fgets(i->nombre,30,stdin);
printf("\nIntroduce su edad: ");
scanf("%i",&i->edad);
i->sig=NULL;
a=i;
}
else
{ w=NULL;
printf("\nIntroduce su nombre: ");
fgets(w->nombre,30,stdin);
printf("\nIntroduce su edad: ");
scanf("%i",&w->edad);
w->sig=NULL;
a->sig=w;
a=w;
}
break;
}
//Visualizando datos
case '2':
{ w=i;
while(w != NULL)
{ printf("\nNombre: %s",w->nombre);
printf("\nEdad: %i",w->edad);
w=w->sig;
}
break;
}

No se si te refieres a esto pero bueno :P jeje
Salu2 !

Scar_T
17-08-2004, 22:33
Hice este pequeño programita para ver como crear una matriz usando solo C :), lo iba a hacer con clases pero no se que tanto sepas de C++ ;).



#include <stdlib.h>

//Estructura que define la matriz
typedef struct {
int f, c; //Filas y columnas de la matriz
float **data; //Los datos que hay dentro de la matriz
}Matriz;

//Funcion que sirve para asignar memoria a una matriz
void CrearMatriz(Matriz *m, int f, int c) {
int i;

m->f = f;
m->c = c;

//Asignamos memoria para los punteros que indican las columnas
m->data = (float **)malloc(c * sizeof(void *));

for(i=0; i<c; i++) {
// Asignamos memoria para las filas
m->data[i] = (float *)malloc(sizeof(float) * f);
}
}

//Funcion que sirve para liberar memoria asignada a una matriz
void LiberarMatriz(Matriz *m) {
int i;

for(i=0; i<m->c; i++) free(m->data[i]);

free(m->data);
}

int main(int argc, char *argv[]) {
int i, j;
Matriz A;

//Creamos una matriz de 5x5
CrearMatriz(&A, 5, 5);

//Escribimos en la ultima casilla algo
A.data[4][4] = 0.5f;

//Liberamos la matriz
LiberarMatriz(&A);

return 0;
}


Espero que le entiendes, tal vez te confundas un poco en la parte que asigno memoria para las columnas y luego para las filas, si es que no tienes claro como funcionan los arreglos bidimensionales en C.

Si tienes alguna duda y la puedo responder, con gusto lo hare :).

Dwarft
17-08-2004, 23:16
Ostia... A mi me ha faltado la funcion para reservar memoria :S jejeje U_U

Seria:

puntero = (struct nombre_estructura *) malloc(sizeof(struct nombre_estructura));
Siempre hay que reservar memoria cada vez que quieras introducir un dato.

Salu2 !

zel089
23-08-2004, 23:08
Ok gracias creo que ya entendi un poco mejor, ah disculpen la demora...

Pero tengo un proyecto que hacer y ya saben,