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 - MAFUS

#1431
De todas formas tampoco tiene claro como funciona el paso de parámetros a una función.
Ya son unos cuántos que confunden parámetros de función con declaración de variables locales. Si su estudio viene del mismo sitio, en dónde sea que lo hagan, dan las clases muy mal.

Orb, cuándo tu función está declarada cómo int operacion(int a, int b) quiere decir que desde donde se la llame se le van a pasar dos enteros, el a y el b, para que dentro de la función se trabaje con ellos. Algo así como:
int operacion(int a, int b) {
   printf("La suma de a y b es %i.", a + b);
   ...


En cambio si quisieras que a y b formaran parte de la función pero no deben ser usadas para pasar parámetros en ella:
int operacion() {
   int a = 2;
   int b = 3;
   printf("La suma de a y b es %i.", a + b);
   ...


Hacer algo como lo que has puesto:
int operacion(int a, int b) {
   a = 2;
   b = 3;
   ...

Es una mala práctica ya que, sea lo que sea que has recibido por a y b, lo sustituyes por tus propios datos. Tu dirás: si así funciona, ¿porqué cambiar? La razón es que para llamar a la función debes pasarle tantos argumentos como así la hayas definido, además si la usa otra persona que no eres tú esperará que funcione de una forma cuándo se encontrará con resultados extraños porqué machacas lo que ella ha querido pasar.

Por otra parte tu función retorna un valor entero. Cuándo las funciones son declaradas con un valor de retorno éstas siempre deben terminar devolviendo un dato de ese tipo, aunqué después no lo uses, como ocurre casi siempre con printf (sí, printf devuelve un dato entero). Las únicas que están exentas de ello son las funciones con retorno tipo void.
#1432
Por ahora todo está bien. Muestra Identificar.
#1433
Programación C/C++ / Re: Hardware y C/C++
18 Enero 2016, 09:29 AM
C puede acceder directamente a la memoria, los punteros le dan esa capacidad. Si la máquina mapea el hardware a la memoria C puede acceder así al hardware,  pero eso no es portable ya que depende de cada arquitectura. Si el acceso al hardware no es por memoria C ya no puede acceder a él y se deben usar funciones escritas en ensamblador expresamente para dotar al programa de ese acceso.
Y todo esto en un sistema sin el modo protegido, en caso contrario hay que solicitar permiso al S.O. o cambiar de anillo en el procesador mediante unos códigos ASM específicos.
#1434
Pon el código donde se cambia el valor de si el satélite está identificado.
#1435
Pásate por aquí hay un buen tutorial sobre pthreads. Como siempre en inglés.
http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html
#1436

#include <stdio.h>

unsigned divide(unsigned n) {
   unsigned divisores = 1;
   unsigned divisor = 2;

   while(n > 1) {
       if(n % divisor == 0) {
           n /= divisor;
           divisores++;
       }
       else
           divisor++;
    }
   return(divisores);
}

int main() {
   unsigned n;

   printf("Dime el número: ");
   scanf("%u", &n);
   printf("%d\n", divide(n));
   
   return 0;
}
#1437
A ver:

Presentas el código muy desordenado. Para ti, si haces pruebas y lo puedes entender sigue con él, pero cuándo vayas a presentarlo a más gente ordenalo. Sigue algunas reglas de estructuración. Sé coherente.

Por otra parte pasas como argumentos a las funciones variables que después resultan ser locales de la función.

Estos errores los vas repitiendo post tras post y creo que te los han a corregido numerosas veces.
#1438
Ahí va un código más bonito y adaptado totalmente a C, ya que había batiburrillo de mucho C y algo de C++.

Aviso que el código no compila. Los errores originales siguen estando. Tan solo se ha aclarado y se han quitado problemas dialectales.

A ver si así la gente se anima con este post.

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

// defino una estructura  llamada agenda
struct agenda {  
   int codigo;
   char nombre[10];
   char apellido[10];
   int telefono;
   int vacio;
} registros[10];

// funciones a utilizar
int ingresar(int codigo, int pos);
void consultar();
int verifica_pos();
void desmarcar_pos();
int verifica_cod(int cod);
int excluir();
void mostrar();

int main() {
   int op, retorno, codaux, posicion;
   
   desmarcar_pos();  // no entiendo para que sirve esta funcion  bien
   
   do {
       printf("\n\n\t\t\t\t** AGENDA **\n1 - Ingresar\n2 - Buscar\n3 - Borrar\n4 - Mostrar todo\n\nOpcion: ");
       scanf("%d", &op);
       while(getchar() != '\n');
       
       switch(op) {
           case 1:                
               posicion = verifica_pos();
               if (posicion != -1) {
                   printf("\nIngresar codigo: ");
                   scanf("%d", &codaux);
                   while(getchar() != '\n');
                   
                   retorno = verifica_cod(codaux);
                   if(retorno)
                       ingresar(codaux, posicion);
                   else
                       puts("\nIntenta de nuevo");
               }
               else
                   puts("\nLa agenda ya esta llena");
               break;
           case 2:              
               consultar();
               break;
           case 3:
               excluir();
               break;
           case 4:
               mostrar();
               break;
           case 5:
               puts("\nPresione INTRO para salir");
               getchar();
               break;
           default:
               printf ("\nEsa opcion no existe");
               break;
       }
   } while(op != 5);
}

void mostrar( )
{
   /* Aqui tengo que mostrar todo pero sin el dato eliminado ya que me
    * muestras todo  seria con registros[pos].vacio == 1 pero
    * no se como muy bien */
   int cont = 0;
   
   while (cont < 10) {
       printf ("\n\t ----------------");
       printf ("\n\t posicion %d",cont);
       printf ("\n\t codigo   %d",registros[cont].codigo);
       printf ("\n\t nombre   %s",registros[cont].nombre);
       printf ("\n\t apellido %s",registros[cont].apellido );
       cont++;
   }
}

int ingresar(int codigo, int pos) {
   int val_atomic;
   int val_atomic2;
   int estado;
   int estado2;
   int x, y;
   int i;
   
   if(pos > 10) {
       puts("\nTodo esta lleno");
   }
   else {      
       registros[pos].codigo=codigo;
       val_atomic = 0;
       val_atomic2 = 0;
       estado = 0;
       estado2 = 0;  
       do {
           if(!estado) {
               printf("\n Nombre: ");
               scanf ("%s", &registros[pos].nombre);  // utilizo scanf ya que no se utyilizar muy bien el gets creo que hice lo correcto
           }
           else {
               if(val_atomic == 1) {
                   puts("\nNombre correcto no es necesario modificar");  
                   x = 1;
               }
           }
           if(!estado2) {
               printf("\n Apellido ") ;
               scanf("%s", &registros[pos].apellido);  
           }
           else {
               if (val_atomic2 == 1) {      
                   puts("\nApellido correcto no es necesario modificar") ;  
                   y = 1;
               }
           }        
           char *str = registros[pos].nombre;  // se supone que paso  lo que esta enla estrctura   d de nombre   a un puntero  
           char *str2 = registros[pos].apellido;
           i = 0;
           while(str) {  // no entiendo bien pero se supone que un puntero es un array  pero  no se como funciona el while aqui
               if(strlen(registros[pos].nombre) > 10) {  // digo que si cadena es mayor a 10 entonces que no se pueda exceder del tamaño del array
                   puts("\nLo siento demasiadas letras");
                   printf("El nombre %s", registros[pos].nombre);
                   printf(" tiene %d letras ", strlen(registros[pos].nombre));  // imprimo el numero de letras contenidas
                   break;
               }
               if(isalpha(str) != NULL) {  // verifico si es  o no un tipo de dato alfabetico
                   puts("\nBien");
                   estado = 1;
                   break;
               }
               else {
                   puts("\nEl nombre es incorrecto nada de caracteres o numeros raros");
                   registros[pos].vacio = 0;  // aqui se supone que si lo que ingreso fue incorrecto le digo que me lo elimine de la estructura
                   estado = 0;
                   break;
               }
               i++;
           }
           i = 0;
           while(str2) {  
               if(strlen(registros[pos].apellido) > 10) {
                   puts("\nLo siento demasiadas letras");
                   printf("El apellido %s", registros[pos].apellido);
                   printf(" tiene %d letras",  strlen(registros[pos].apellido));
                   break;
               }
               if(isalpha(str2) != NULL) {
                   puts("\nBien");
                   estado2 = 1;
                   break;  
               }    
               else {
                   puts("\nApellido es incorrecto   nada de numeros o caractes raros");
                   registros[pos].vacio = 0;
                   estado2 = 0;
                   break;
               }
               i++;
           }
       } while (estado != 1  ||  estado2 != 1);  
       suma = x + y;
       registros[pos].vacio = 1;  // aqui valido y digo que se le pase el valor para poder ser registrado
       puts("\nEl registro a sido realizado\n");
       return suma;
   }
}

void consultar() {
   int cont = 0;
   int codigo;
   
   printf("\nIngresa el codigo: ");
   scanf("%d", &codigo);
   while(cont <= 10) {
       if(registros[cont].codigo == codigo) {  // igualo el codigo con el codigo de la estructura
           if(registros[cont].vacio == 1) {  // se supone que verifico si en determinada posicion vacio vale uno y si es asi que me lo imprima
               printf("\nNombre: %s", registros[cont].nombre);
               printf("\nApelldio: %s", registros[cont].apellido);
               break;
           }
       }
       cont++;
       if(cont > 10)  // si es mayor a diez significa que no lo encontro
       puts("\nCodigo no encontrado");
   }
}

int verifica_pos() {
   int cont = 0;

   while(cont <= 10) {
       if(registros[cont].vacio == 0)
           return(cont);
       cont++;
   }
   return -1;  // retorno -1 para comprobar que no este lleno
}

void desmarcar_pos() {
   int cont;
   
   for(cont = 0; cont <= 10; cont++)
       registros[cont].vacio = 0;  // no entiendo muy bien
}

int verifica_cod(int codigo) {
   int cont = 0;

   while(cont <= 10) {
       if(registros[cont].codigo == codigo) {  // comparo el codigo y si es el mismo que me imprima que no se puede tener el mismo codigo
           puts("\nLo siento no puedes tener el mismo codigo");
           return 0;
       }
       cont++;
   }
   return 1;  // retorno 1 para decirle que pueda continuar si es que no es el mismo
}

int excluir() {
   int codigo;
   int cont = 0;
   
   printf("\nIngresa el codigo para ser eliminado: ");
   scanf("%d", &codigo);
   while(getchar() != '\n');
   while(cont <= 10) {
       if(registros[cont].codigo == codigo)  // compara como arriba
           if (registros[cont].vacio == 1) {  // verifico  que  el valor de la estrctura de determinada posicion  sea iguala  uno para eliminarlo con la linea sigueinte
               registros[cont].vacio = 0;
               puts("\nEliminado correctamente");
               break;
           }
           cont++;
           if(cont > 10)
               puts("\nCodigo no encontrado");
   }
   return codigo;
}


Vaya diferencia ¿eh?  ;-) ;-)
#1439
Ah, jeje, creía que le ibas a hacer algo al coche  ;)
#1440
¿Cuál es el proyecto?