Programacion en C basico

Iniciado por Anta, 12 Septiembre 2011, 22:52 PM

0 Miembros y 1 Visitante están viendo este tema.

Anta

Hola soy nuevo y realmente se que en lo que he leido aqui apoyan en dudas y tengo una gran duda....

sinceramente tiene como 2 semanas  en esto ahora que baje infinidad de manuales en C y C++ para guiarme por un ejemplo no allo tal respuesta..

esta es la duda...

como seria la logica para poder iniciar con cero en un ingreso de datos... solo me gustaria saber que sentencia usar he usado if, swich, for pero cuando ingreso 01 se me cierra o no me compila he usado hasta case pero sinceramente creo que ese no puede ser en este caso... gracias

Eternal Idol

Deja tu codigo, no entiendo cual es el problema, si haces fgets (con stdin) + sscanf (con %d) al poner 01 el valor es 1.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Anta

Cita de: Eternal Idol en 12 Septiembre 2011, 23:58 PM
Deja tu codigo, no entiendo cual es el problema, si haces fgets (con stdin) + sscanf (con %d) al poner 01 el valor es 1.

Citar#include <stdio.h>
#include <conio.h>
void main ()
{
int A,R[6],i;
clrscr();
printf ("Programa que........ \n");
    for (i=0; i<=6; i++)
   {
    printf ("Introduce numeros binarios \n");
    scanf ("%d",& R);
    if (R>1)
      printf (" No introduciste numero binario; \n  ");
    }
    A=3;
    for (i=0; i<=6; i++)
    {
        if (R==A)
         printf ("LOS NUMEROS NO LLEVAN SECUENCIA \n ");
          else
        if(R<=1)
        {
       A=R;
       printf("numeros aceptados \n");
             }    }
             printf("Los numeros son:");
             for (i=0; i<=6; i++)
                  printf("%d",R);
      getch();
   }

me refiero a un ingreso de numeros ceros y unos por ejemplo ingresar numeros:
01010101 y que me lo acepte pero que al ingresar 0010101 no, he estado probando muchas combinaciones de sentencias pero nose si este bien

rir3760

Revisa los temas fijos de este foro, descarga un buen libro de C y estudia este paso a paso.

Ello porque en el programa tienes muchos errores de concepto:

* Evita el uso de conio (no es necesario en tu programa) y define la función principal como "int main(void) ..." o "int main() ..." indicando su valor de retorno con al menos "return 0;".

* En C y C++ cuando se declara un array se indica su numero de elementos N y se accede a estos mediante los indices 0 a N-1. Tu iteras siete veces (de forma inocua) pero lo correcto, de nuevo, son seis.

* La llamada:
scanf ("%d",& R);
Técnicamente es correcta pero es un error lógico ya que solo lees el valor del primer elemento del array (deberia ser "&R[ i ]" o su equivalente "R + i").

* Después comparas "R" contra diversos valores lo cual no es correcto ya que "R" en el contexto en que se utiliza resulta en la dirección en memoria del array, deberías utilizar "R[ i ]".


Finalmente no puedes utilizar scanf y similares para leer números en base 2, en su lugar utiliza fgets para leer una linea de texto y strtol para obtener el numero.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Eternal Idol

R deberia ser de 8 elementos. ¿Se supone que es un byte, no?

for (i = 0; i < 8; i++)

El [ i ] no sale dentro de la etiqueta codigo lamentablemente.

Despues de hacer el bucle para obtener los valores podrias hacer otro con x = 0; x < 4 (no incluido) y la condicion R[x * 2] diferente de cero o R[x * 2 + 1] diferente de uno determinaria facilmente si se cumple el postulado de que las parejas sean siempre 01. Si es que eso era lo que querias ... ¿De donde sale esta historia?

PD. Es introdujiste.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Anta

kk lo intentare si he descargado muchos manuales de C incluidos los de esta pagina...

lo que intento hacer es que por ejemplo un numero limitado de digitos digamos [10] en el cual solo acepte  010101010101 no importa si es 01 o 0101 o 01010101 y que cualquier digito que se ponga 01001 este mal y arroje un error y em regrese de nuevo ala insercion de digitos solo que sea intercalados los ceros y unos... tratare de intentarlo gracias por la ayuda  :-*

rir3760

En ese caso debes leer la entrada como cadena y comparar los caracteres pares contra '0' y los impares contra '1'.

Mas o menos asi:
char cad[ALGUN_VALOR];
int i;

/* Se lee la cadena almacenando esta en "cad" */

for (i = 0; cad[i] == '0' + (i % 2); i++)
   ;
if (cad[i] == '\0')
   puts("Cadena valida");
else
   puts("Cadena NO valida");


Muy limitado pero funciona. Una vez manejes mas del lenguaje la podrias mejorar (por ejemplo descartando el espacio blanco al principio de la cadena).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Anta

#7
muchas gracias en vdd no imagine hacer las comparaciones de ese tipo todos los ejemplos que lei solo decia q cero era = a valor nulo y que para que pudiera dar 1 tendria q poner lo q es [--i].... muchas gracias lo intentare

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

main()

{
    char n[10]={0101010101};
    int i;
   
     printf("Ingresar Digitos\n");
      scanf("%c", &n);
     
      for (i = 0; n == '0' + (i % 2); i++);
        if (n == '\0')
       puts("Cadena valida\n");
         else
           puts("Cadena NO valida\n");
           
       return 0;
           
}


se me  facilito mucho intentarlo con tu codigo pero no logro cuando lo ejecuto que el exe se quede abierto solo pongo datos me los valida en el rango y se cierra casi al instante uso el DEV c++ sera que sea por eso? :-[

satu

#8
Hola

Escribe esto justo antes del return 0


while(getchar()!='\n') ; //Esto limpa el buffer de entrada
getchar(); //Esto espera a que pulses una tecla


Saludos
Breakbeat como forma de vida

rir3760

No debes utilizar "%c" en la llamada a scanf ya que esta lee un solo carácter, en su lugar debes utilizar "%s" para leer una palabra. Y hay que eliminar el operador "dirección de" (el '&') ya que no es necesario cuando se trata de un array.

En la declaración del array su inicialización esta mal y no es necesaria (scanf no permite una validación rigurosa, en el mejor de los casos se debe comprobar su valor de retorno). El primer condicional "if" esta mal al comparar "n" cuando debería ser "n[ i ]". También el for esta mal.

Hay que agregar la comprobación para verificar que el numero de caracteres en la palabra sea par.


Y no debes incluir el encabezado <string.h>, de nuevo consigue un buen libro.

Con las correcciones (colocaría solo un fragmento pero se tiene que corregir casi todo):
#include <stdio.h>
#include <string.h>

int main(void)
{
   char n[10];
   int i;
   
   printf("Ingresar Digitos\n");
   scanf("%s", n);
   
   for (i = 0; n[i] == '0' + (i % 2); i++)
      ;
   if (n[i] == '\0' && i % 2 == 0)
      puts("Cadena valida\n");
   else
      puts("Cadena NO valida\n");
     
   return 0;
   
}


En cuanto a Dev-C++ lo mejor es cambiar a otro entorno (no recuerdo uno (salvo ese) que no soporte la generacion de la pausa de forma automatica).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language