Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

empezar en c

143 Respuestas
16 Usuarios
0 Reactions
365.4 K Visitas
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 19 años

Hola, quisiera que me recomendarais algun programa, gratuito si es posible, para compilar y programar en c, y saber si se puede hacer programas en c, que ademas de escribir texto en pantalla pueda manejar graficos, crear entorno grafico propio y similares (como los entornos graficos de un videojuego) y como se puede programar que se muestren imagenes en pantalla con c. Igualmente agradeceria cualquier referencia a manuales lo mas completos posibles sobre programacion en c, preferiblemente en castellano.

Gracias por cualquier ayuda que me podais ofrecer.

Responder
142 respuestas
luisj
Respuestas: 235
(@luisj)
Estimable Member
Registrado: hace 18 años

Realmente ambos son imperativos. Lo que quiere decir 'imperativo' más o menos es que tu le dices al ordenador qué tiene que hacer y cómo hacerlo paso a paso (es que hay lenguajes en los que no se hace asi exactamente). C++ es orientado a objetos y C es estructurado.

Todo lo que puede hacerse en C++ puede hacerse en C, pero también lo podrias hacer en ensamblador... La ventaja de C++ es que es más facil de entender para los que no lo han programado y de revisar por el que lo ha programado.

Se escribe sobre todo, un sobretodo es una prenda de vestir.

No tiene que ver nada con punteros, pero a mi hermano el primer programa gracioso que le puse fue programar el juego de la vida:

http://es.wikipedia.org/wiki/Juego_de_la_vida

Si quieres seguir con algoritmia, metete con árboles y grafos

Quizás debas afianzar tus conocimientos y te vendría mejor hacer un listín telefónico o algo así usando punteros y ficheros.

Responder
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 19 años

Hola, tengo acabado el juego de la vida, solo tengo algunos problemillas al mezclar el uso de getch y scanf; el problema es que uso getch para el menu para leer un solo caracter porque compilado el programa no pide el retorno de linea sino que lee la tecla nada mas pulsarla, pero en otros momentos intento usar scanf como para leer las dimensiones del tablero que pueden ser mas grandes de 9x9 y tener mas de una cifra, y aunque compila el programa al pulsar enter se para y da error, sin embargo si en vez de ese scanf uso un getch o borro la linea del scanf, el programa funciona sin dar error. ¿hay algo que impida usar getch y scanf en un mismo programa?

codigo con scanf:
#include <stdio>

void modificar(int *t, int j, int i);
void mostrar(int *t, int c, int f);
void actualizar(int *t, int c, int f);

int main(){
int an=20, al=20, i, j, ej=1 ;
printf("Juego de la vidannIndique las medidas del tablero: ");
printf("n - Ancho: ");
scanf("%i", an);
printf("n - Alto: ");
scanf("%i", al);
int tm[an][al] ;
for(i=1; i<=an; i++){
for(j=1; j<=al; j++){
tm[j] = 0 ;
}
}
do{
char pm ;
int oi=0 ;
printf("nn");
mostrar(&tm[0][0], an, al);
printf("nMenu:");
printf("n 1 Cambiar estado de celdan");
printf("n 2 jugar un determinado numero de ciclos entre 1 y 9n");
printf("n 3 salirn");
pm = getch();
switch(pm){
case '1':
modificar(&tm[0][0], an, al);
break ;
case '2':
oi = 1 ;
break ;
case '3':
ej = 0 ;
printf("nnadios");
break ;
}
if(oi == 1){
unsigned int ncj, i ;
printf("nnEscribe el numero de ciclos que quieras jugar: ");
ncj = getch()-48;
for(i = 1; i<=ncj && ncj<10>0; i++){
printf("nn");
mostrar(&tm[0][0], an, al);
actualizar(&tm[0][0], an, al);
}
}
}while(ej == 1);
getch();
return 0 ;
}

void actualizar(int *t, int c, int f){
int i, j, tc[c][f], tv ;
for(j=1; j<=c; j++){
for(i=1; i<=f; i++){
tc[j] = *(t+c*j+i) ;
}
}
for(j=1; j<=c; j++){
for(i=1; i<=f; i++){
tv = 0 ;
if(tc[j+1][i+1] == 1){
tv += 1 ;
}
if(tc[j][i+1] == 1){
tv += 1 ;
}
if(tc[j-1][i+1] == 1){
tv += 1 ;
}
if(tc[j+1][i-1] == 1){
tv += 1 ;
}
if(tc[j+1] == 1){
tv += 1 ;
}
if(tc[j-1][i-1] == 1){
tv += 1 ;
}
if(tc[j-1] == 1){
tv += 1 ;
}
if(tc[j][i-1] == 1){
tv += 1 ;
}
if(tc[j] == 0){
if(tv == 3){
*(t+c*j+i) = 1 ;
}
else{
*(t+c*j+i) = 0 ;
}
}
else{
if(tv == 3 || tv == 2){
*(t+c*j+i) = 1 ;
}
else{
*(t+c*j+i) = 0 ;
}
}
}
}
}

void mostrar(int *t, int c, int f){
int i, j ;
for(j=1; j<=c; j++){
for(i=1; i<f>j){
c = 1 ;
}
if(f>i){
f = 1 ;
}
}while(v == 1);
v = *(t+c*j+f) ;
if(v == 0){
*(t+c*j+f) = 1 ;
}
else{
*(t+c*j+f) = 0 ;
}
}

y este el codigo que funciona sin el scanf:#include <stdio>

void modificar(int *t, int j, int i);
void mostrar(int *t, int c, int f);
void actualizar(int *t, int c, int f);

int main(){
int an=20, al=20, i, j, ej=1 ;
printf("Juego de la vidannIndique las medidas del tablero: ");
printf("n - Ancho: ");
printf("n - Alto: ");
int tm[an][al] ;
for(i=1; i<=an; i++){
for(j=1; j<=al; j++){
tm[j] = 0 ;
}
}
do{
char pm ;
int oi=0 ;
printf("nn");
mostrar(&tm[0][0], an, al);
printf("nMenu:");
printf("n 1 Cambiar estado de celdan");
printf("n 2 jugar un determinado numero de ciclos entre 1 y 9n");
printf("n 3 salirn");
pm = getch();
switch(pm){
case '1':
modificar(&tm[0][0], an, al);
break ;
case '2':
oi = 1 ;
break ;
case '3':
ej = 0 ;
printf("nnadios");
break ;
}
if(oi == 1){
unsigned int ncj, i ;
printf("nnEscribe el numero de ciclos que quieras jugar: ");
ncj = getch()-48;
for(i = 1; i<=ncj && ncj<10>0; i++){
printf("nn");
mostrar(&tm[0][0], an, al);
actualizar(&tm[0][0], an, al);
}
}
}while(ej == 1);
getch();
return 0 ;
}

void actualizar(int *t, int c, int f){
int i, j, tc[c][f], tv ;
for(j=1; j<=c; j++){
for(i=1; i<=f; i++){
tc[j] = *(t+c*j+i) ;
}
}
for(j=1; j<=c; j++){
for(i=1; i<=f; i++){
tv = 0 ;
if(tc[j+1][i+1] == 1){
tv += 1 ;
}
if(tc[j][i+1] == 1){
tv += 1 ;
}
if(tc[j-1][i+1] == 1){
tv += 1 ;
}
if(tc[j+1][i-1] == 1){
tv += 1 ;
}
if(tc[j+1] == 1){
tv += 1 ;
}
if(tc[j-1][i-1] == 1){
tv += 1 ;
}
if(tc[j-1] == 1){
tv += 1 ;
}
if(tc[j][i-1] == 1){
tv += 1 ;
}
if(tc[j] == 0){
if(tv == 3){
*(t+c*j+i) = 1 ;
}
else{
*(t+c*j+i) = 0 ;
}
}
else{
if(tv == 3 || tv == 2){
*(t+c*j+i) = 1 ;
}
else{
*(t+c*j+i) = 0 ;
}
}
}
}
}

void mostrar(int *t, int c, int f){
int i, j ;
for(j=1; j<=c; j++){
for(i=1; i<f>j){
c = 1 ;
}
if(f>i){
f = 1 ;
}
}while(v == 1);
v = *(t+c*j+f) ;
if(v == 0){
*(t+c*j+f) = 1 ;
}
else{
*(t+c*j+f) = 0 ;
}
}

Responder
heli
Respuestas: 748
 Heli
(@heli)
Ardero
Registrado: hace 19 años

El problema es que al scanf hay que pasarle como parámetros punteros a los datos, no los datos. http://es.wikipedia.org/wiki/Scanf
Sería interesante que mejoraras la forma de escribir los programas, por claridad, para que todos podamos entenderlos mejor (y tu mismo cuando retomes un programa viejo puedas seguir el código con facilidad).

#include <stdio> // Aqui deberia poner <stdioPUNTOh> pero no sale...

void modificar(int *t, int j, int i);
void mostrar(int *t, int c, int f);
void actualizar(int *t, int c, int f);

int main()
{
int an=20, al=20, i, j, ej=1 ;
printf("Juego de la vidannIndique las medidas del tablero: ");
printf("n - Ancho: ");
// scanf("%i", an); MAL!!
scanf("%i", &an); // El parametro ha de ser un puntero a int (&an), no un int (an)
printf("n - Alto: ");
// scanf("%i", al); MAL
scanf("%i", &al); // El parametro ha de ser un puntero a int (&al), no un int (al)
int tm[an][al] ;
for(i=1; i<=an; i++)
{
for(j=1; j<=al; j++)
{
tm[j] = 0 ;
}
}
do
{
char pm ;
int oi=0 ;
printf("nn");
mostrar(&tm[0][0], an, al);
printf("nMenu:");
printf("n 1 Cambiar estado de celdan");
printf("n 2 jugar un determinado numero de ciclos entre 1 y 9n");
printf("n 3 salirn");
pm = getch();
switch(pm)
{
case '1':
modificar(&tm[0][0], an, al);
break ;
case '2':
oi = 1 ;
break ;
case '3':
ej = 0 ;
printf("nnadios");
break ;
}
if(oi == 1)
{
unsigned int ncj, i ;
printf("nnEscribe el numero de ciclos que quieras jugar: ");
ncj = getch()-48;
for(i = 1; i<=ncj && ncj<10>0; i++)
{
printf("nn");
mostrar(&tm[0][0], an, al);
actualizar(&tm[0][0], an, al);
}
}
}while(ej == 1);
getch();
return 0 ;
}

void actualizar(int *t, int c, int f)
{
int i, j, tc[c][f], tv ;
for(j=1; j<=c; j++)
{
for(i=1; i<=f; i++)
{
tc[j] = *(t+c*j+i) ;
}
}
for(j=1; j<=c; j++)
{
for(i=1; i<=f; i++)
{
tv = 0 ;
if(tc[j+1][i+1] == 1)
{
tv += 1 ;
}
if(tc[j][i+1] == 1)
{
tv += 1 ;
}
if(tc[j-1][i+1] == 1)
{
tv += 1 ;
}
if(tc[j+1][i-1] == 1)
{
tv += 1 ;
}
if(tc[j+1] == 1)
{
tv += 1 ;
}
if(tc[j-1][i-1] == 1)
{
tv += 1 ;
}
if(tc[j-1] == 1)
{
tv += 1 ;
}
if(tc[j][i-1] == 1)
{
tv += 1 ;
}
if(tc[j] == 0)
{
if(tv == 3)
{
*(t+c*j+i) = 1 ;
}
else
{
*(t+c*j+i) = 0 ;
}
}
else
{
if(tv == 3 || tv == 2)
{
*(t+c*j+i) = 1 ;
}
else
{
*(t+c*j+i) = 0 ;
}
}
}
}
}

void mostrar(int *t, int c, int f)
{
int i, j ;

for(j=1; j<=c; j++)
{
for(i=1; i<f>j) // Esta linea esta mal!!
{
c = 1 ;
}
if(f>i)
{
f = 1 ;
}
}while(v == 1);
v = *(t+c*j+f) ;
if(v == 0)
{
*(t+c*j+f) = 1 ;
}
else
{
*(t+c*j+f) = 0 ;
}
}

Responder
lacabra25
Respuestas: 84
Topic starter
(@lacabra25)
Trusted Member
Registrado: hace 19 años

OK, entiendo lo de que aiga que pasarle el puntero al dato en vez del dato, pero ¿cuando no uso getch como es que funciona poniendo la variable directamente sin poner puntero, esque esto solo me pasa al usar scanf y getch a la vez?

Nota: gracias por el comentario sobre lo del .h, no era necesario, ya me he estado fijando que al añadir codigo el foro borra algunas partes, por eso ultimamente estoi incluyendo los archivos .c

Responder
aprendiendo
Respuestas: 317
(@aprendiendo)
Reputable Member
Registrado: hace 17 años

technik
...
C# si es cierto que le faltan librerías, pero tiene una cosa a su favor que C++ no ha tenido nunca, es un estándard y por lo tanto sus especificaciones hay que respetarlas a rajatabla (compáralo con lo que hizo Borland con su versión de C++ o Microsoft con VC++).
...

Bueno, costó un poco (bastante), pero C++ tiene su estándar, desde 1998

Responder
Página 17 / 29
Compartir: