martes, 4 de enero de 2011

Kernighan_Ritchie_1.16

#include <stdio.h>

   int main()

  {        //Abre main

    int i = 0;
    char Cadena[] = "corazones";
    int c;
    printf("\nIntroduzca cadena: ");
    while( (c = getchar()) != EOF )
   {
   Cadena[i++] = c;
   }
  }     // Cierra main

 
_____________________________________________________________________________________________
Esta entrada es parte de los problemas resueltos del libro El Lenguaje de Programación C, de B. Kernighan y D. Ritchie.
Entrada Anterior
Entrada Siguiente

6 comentarios:

  1. Hola, estoy por la parte 1.9 del libro y no entiendo el codigo de ejemplo que dan..
    En este link esta el codigo: http://felip_pedrell.tripod.com/c1.html#1_9

    En el codigo crean dos funciones, getline y copy, no entiendo que hace la funcion copy, ya que este solo recibe dos arreglos y no duvuelve ni imprime nada.

    Y en el ejercicio 1.16 no entiendo la consigna y tampoco el codigo que vos escribiste..

    Gracias y saludos..

    ResponderEliminar
    Respuestas
    1. ¡Hola, Roberto! En concreto lo que hace la función copy es copiar la línea de entrada (guardada en el arreglo line), que ha sido probada y resulta que es más larga que la mayor hasta ese momento, en el arreglo longest. La función no regresa nada porque se trata de una llamada por referencia. En realidad se modifica el arreglo longest, no una copia de él, como pasa en las llamadas por valor. Cuando tú envías el nombre de un arreglo a una función estás enviando la dirección de la
      primera localidad de ese arreglo y cualquier cambio se hace directamente en el arreglo. Este cambio es visible en todo el programa, y no sólo en una función. Por eso no se devuelve nada, porque el cambio ya está hecho y se puede ver desde main.
      Con respecto a el código que aparece aquí, debo decir que yo tampoco sé por qué lo puse. Voy a tratar de hacer este programa, aunque hay algunos enunciados a los que simplemente no les entiendo (como el del ejercicio 1-20). Creo que contar la longitud de la cadena más larga es posible, simplemente llevando una variable contador que se detenga cuando el carácter leído sea un salto de línea. Para recibir tanto texto como sea posible, sólo se me ocurre incrementar el tamaño de la variable MAXLINE.
      Voy a revisar el programa y subiré algo. Por favor, si escribes un código, me gustaría verlo.
      Saludos.

      Eliminar
  2. Haa, siempre que se trabaje con las direcciones de memoria de las variables no va a importar si esta dentro de otra funcion que no sea el main, ya que no es una variable declarada dentro de la funcion, ya lo entendi..

    Yo estoy por el ejercicio 1-16 a 1-19, el que no entiendo para nada que es lo que tengo que hacer es el 1-16, asi que lo salteo por el momento, cuando llegue al 1-20 si se me acurre algo te lo paso..

    ha, no se podria hacer algo para que al pegar un codigo en el comentario mantenga el formato? o eso ya es cosa de Blogspot.

    Gracias y saludos..

    ResponderEliminar
  3. hola comenze a hacer estos ejercicios y pues se me ocurrio que una de las maneras de resolver este ejercicio es utilizando un archivo aparte
    #include stdio.h
    #include stdlib.h

    int mgetl();
    char* cop(int);

    //Coopia sin limitacion el texto de la entrada
    int main(int argc, char *argv[])
    {
    int legt, nm = 0;

    while((legt = mgetl()))
    if(legt > nm)
    {
    nm = legt;
    printf("%s", cop(nm));
    }
    return 0;
    }

    FILE *narc;
    int o;
    //mgetl: Copia el texto de la entrada sin limitaciones y lo guarda en un archivo, regresa la longitud
    //del texto
    int mgetl()
    {
    int i, c;

    narc = fopen("contador", "w");
    for(i = 0;(c = getchar()) != EOF && c != '\n'; i++)
    putc(c, narc);
    if(c == '\n')
    {
    putc('\n', narc);
    putc('\0', narc);
    fclose(narc);
    }
    return i++;
    }

    //cop: Copia el contenido de un archivo y lo guarda en un arreglo dinamico, regresa un aputador al nuevo arreglo
    char* cop(int n)
    {
    char *s;
    int i;

    if(o)
    free((void *)s);
    s = (char *) calloc(++n, sizeof(char));
    o = 1;
    narc = fopen("contador", "r");
    for(i = 0;(s[i] = getc(narc)) != EOF; i++)
    ;
    fclose(narc);
    return s;
    }

    ResponderEliminar
  4. Hola, Jesus. Muchas gracias por compartir tu código. No sé por qué tengo en la entrada algo que no tiene nada qué ver con el ejercicio. El único problema que yo tengo con tu programa es que haces uso de funciones como calloc que en el texto, en éste punto, no se ha estudiado.
    Muchas gracias y ojalá puedas compartir más códigos. Saludos.

    ResponderEliminar
  5. Bueno no se qué tan equivocado esté, pero el índice de un arreglo es un entero y el valor máximo para un entero está definido ya:16 bits para un int, 32 para un long. Podría entonces cambiar el límite superior a 32868

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...