AKTU 1er año Sem 2 Documento resuelto 2014-15 | COMP. SISTEMA Y PROGRAMACION C | Sec B

Enlace de descarga de papel : Papel | semestre 2 | 2014-15

Tecnología B.
(SEM-II) EXAMEN TEÓRICO 2014-15
SISTEMAS DE COMPUTACIÓN Y PROGRAMACIÓN EN C

Tiempo: 3 horas
Marcas totales : 100

Nota :-

  • Intenta todas las preguntas. Las marcas se indica frente a cada pregunta.
  • Asumir datos adecuados siempre que sea necesario.

2. Intenta DOS partes cualquiera: (10*2 = 20)

  1. ¿Qué entiendes por valor ASCII de un carácter? ¿Podemos usar expresiones que incluyan tanto el tipo de datos enteros como el tipo de datos de caracteres? Justifica tu respuesta.

    ASCII es el código estándar estadounidense para el intercambio de información. ASCII es un esquema de codificación de caracteres y fue el primer estándar de codificación de caracteres. ASCII utiliza 7 bits para representar un carácter. Tiene 128 puntos de código, del 0 al 127. Es un código para representar caracteres ingleses como números, con cada letra asignada a un número del 0 al 127.

    Sí, podemos usar expresiones que incluyen tanto el tipo de datos enteros como el tipo de datos de caracteres. En tales expresiones, se producen conversiones de tipo y el tipo de datos de caracteres se convierte en su valor entero. Este valor entero es el valor ASCII del carácter.

    Ejemplo:

    // An example to show we can use
    // expressions including both 
    // integer data type and character data type
      
    #include <stdio.h>
      
    int main()
    {
        int x = 10; // integer x
        char y = 'a'; // character c
        int z;
      
        // y implicitly converted to int. ASCII
        // value of 'a' is 97
        z = x + y;
      
        printf("z = %d", z);
        return 0;
    }

    Producción:

    z = 107
  2. Escribe la diferencia entre conversión de tipos y conversión de tipos. ¿Cuáles son los personajes de las secuencias de escape ?

    En el lenguaje de programación C, hay 256 números de caracteres en el juego de caracteres. El conjunto de caracteres completo se divide en 2 partes, es decir, el conjunto de caracteres ASCII y el conjunto de caracteres ASCII ampliado. Pero aparte de eso, también hay otros caracteres que no forman parte de ningún conjunto de caracteres, conocidos como caracteres ESCAPE.

    Lista de secuencias de escape

    \a    Alarm or Beep   
    \b    Backspace
    \f    Form Feed
    \n    New Line
    \r    Carriage Return
    \t    Tab (Horizontal)
    \v    Vertical Tab
    \\    Backslash
    '    Single Quote
    \"    Double Quote
    \?    Question Mark
    \ooo  octal number
    \xhh  hexadecimal number
    \0    Null

    Ejemplo:

    // C program to illustrate
    // \b escape sequence
    #include <stdio.h>
    int main(void)
    {
        // \b - backspace character transfers
        // the cursor one character back with
        // or without deleting on different
        // compilers.
        printf("Hello Geeks\b\b\b\bF");
        return (0);
    }

    Producción:

    The output is dependent upon compiler.
    
  3. Convierta el siguiente número en:

    (i) (11010.0110) 2 =() 10

    (11010.0110) 2
    = (26.375) 10

    (ii) (110101011.0110110) 2 =() 8

    (110101011.0110110) 2
    = (653.33) 8

    (iii) (2B6D) 16 =() 2

    (2B6D) 16
    = (10101101101101) 2

    (iv) (AB4F.C1) 16 =() 10

    (AB4F.C1) 16
    = (43855.75390625) 10

    (v) (54) 6 =() 4

    (54) 6
    = (202) 4

3. Intenta DOS partes cualquiera: (10*2 = 20)

  1. Dé la declaración de bucle para imprimir la siguiente secuencia de enteros:
    -6 -4 -2 0 2 4 6

    #include <stdio.h>
      
    int main()
    {
      
        int i = 0;
      
        for (i = -6; i <= 6; i += 2)
            printf("%d ", i);
      
        return 0;
    }

    Producción:

    -6 -4 -2 0 2 4 6 
  2. ¿Cuáles son los principios fundamentales de la recursividad ?

    El proceso en el que una función se llama a sí misma directa o indirectamente se llama recursividad y la función correspondiente se llama función recursiva. Usando el algoritmo recursivo, ciertos problemas se pueden resolver con bastante facilidad. Ejemplos de tales problemas son Towers of Hanoi (TOH) , Inorder/Preorder/Postorder Tree Traversals , DFS of Graph , etc.

    ¿Qué es la condición base en la recursividad?
    En el programa recursivo, se proporciona la solución al caso base y la solución del problema más grande se expresa en términos de problemas más pequeños.

    int fact(int n)
    {
        if (n < = 1) // base case
            return 1;
        else    
            return n*fact(n-1);    
    }
    

    En el ejemplo anterior, se define el caso base para n < = 1 y el valor mayor del número se puede resolver convirtiendo a uno más pequeño hasta alcanzar el caso base.

  3. Si int a=2, b=3, x=0; Encuentre el valor de x=(++a, b+=a)

    Salida: x = 6
    Explicación:

    • Como a = 2, b = 3 y x = 0 inicialmente.
    • Por lo tanto,
      x = (++a, b+=a)
      = ((++a), b+=a)
      = (b+=a)…..Ahora a = 3
      = (b = b+a)
      = (b = 3+3)
      = (b = 6)
      = (6)
      x = 6

4. Intenta DOS partes cualquiera: (10*2 = 20)

  1. Cuáles son los diferentes tipos de operadores en lenguaje C y también anote la diferencia entre la asociatividad y la precedencia de los operadores.

    Los operadores son la base de cualquier lenguaje de programación. Por lo tanto, la funcionalidad del lenguaje de programación C/C++ está incompleta sin el uso de operadores. Podemos definir operadores como símbolos que nos ayudan a realizar cálculos matemáticos y lógicos específicos sobre operandos. En otras palabras podemos decir que un operador opera los operandos.
    Por ejemplo, considere la siguiente declaración:

    c = a + b;
    

    Aquí, ‘+’ es el operador conocido como operador de suma y ‘a’ y ‘b’ son operandos. El operador de suma le dice al compilador que agregue los dos operandos ‘a’ y ‘b’. C/C++ tiene muchos tipos de operadores incorporados y se pueden clasificar como:

    • Operadores aritméticos : estos son los operadores utilizados para realizar operaciones aritméticas/matemáticas en los operandos. Ejemplos: (+, -, *, /, %, ++, –).
    • Operadores relacionales : los operadores relacionales se utilizan para comparar los valores de dos operandos. Por ejemplo: verificar si un operando es igual a otro operando o no, un operando es mayor que el otro operando o no, etc. Algunos de los operadores relacionales son (==, >=, <= ). Para conocer en detalle cada uno de estos operadores ingresa a este enlace.
    • Operadores Lógicos : Los Operadores Lógicos se utilizan para combinar dos o más condiciones/restricciones o para complementar la evaluación de la condición original en consideración. El resultado de la operación de un operador lógico es un valor booleano, ya sea verdadero o falso. Para obtener más información sobre los diferentes operadores lógicos, visite este enlace.
    • Operadores bit a bit: los operadores bit a bit se utilizan para realizar operaciones a nivel de bit en los operandos. Los operadores se convierten primero a nivel de bits y luego se realiza el cálculo en los operandos. Las operaciones matemáticas como la suma, la resta, la multiplicación, etc. se pueden realizar a nivel de bit para un procesamiento más rápido. Para conocer los operadores bit a bit en detalle, visite este enlace.
    • Operadores de asignación : los operadores de asignación se utilizan para asignar valor a una variable. El operando del lado izquierdo del operador de asignación es una variable y el operando del lado derecho del operador de asignación es un valor. El valor del lado derecho debe ser del mismo tipo de datos que la variable del lado izquierdo; de lo contrario, el compilador generará un error.
    • Otros operadores : además de los operadores anteriores, existen otros operadores disponibles en C o C++ que se utilizan para realizar alguna tarea específica. Algunos de ellos se discuten aquí:
      • Operador sizeof : sizeof es muy utilizado en el lenguaje de programación C/C++. Es un operador unario de tiempo de compilación que se puede usar para calcular el tamaño de su operando. El resultado de sizeof es de tipo integral sin signo, que generalmente se denota por size_t. Básicamente, el operador sizeof se utiliza para calcular el tamaño de la variable. Para obtener información detallada sobre el tamaño del operador, puede visitar este enlace.
      • Operador de coma : el operador de coma (representado por el token, ) es un operador binario que evalúa su primer operando y descarta el resultado, luego evalúa el segundo operando y devuelve este valor (y tipo). El operador coma tiene la precedencia más baja de cualquier operador C. La coma actúa como operador y separador. Para obtener más información sobre la coma en detalles, visite este enlace.
      • Operador condicional : El operador condicional tiene la forma Expresión1? Expresión2 : Expresión3 . Aquí, Expression1 es la condición a evaluar. Si la condición (Expresión1) es verdadera , ejecutaremos y devolveremos el resultado de Expresión2; de lo contrario, si la condición (Expresión1) es falsa , ejecutaremos y devolveremos el resultado de Expresión3. Podemos reemplazar el uso de declaraciones if..else por operadores condicionales. Para obtener más información sobre los operadores condicionales, visite este enlace.
    • (i) ¿Cuál es el papel de la instrucción SWITCH en el lenguaje de programación C ? Explique con ejemplo.

      Las declaraciones de cambio de caso son un sustituto de las declaraciones if largas que comparan una variable con varios valores integrales

      • La declaración de cambio es una declaración de bifurcación de múltiples vías. Proporciona una forma sencilla de enviar la ejecución a diferentes partes del código en función del valor de la expresión.
      • Switch es una declaración de control que permite que un valor cambie el control de ejecución.

      Sintaxis:

      switch (n)
      {
          case 1: // code to be executed if n = 1;
              break;
          case 2: // code to be executed if n = 2;
              break;
          default: // code to be executed if n doesn't match any cases
      }

      Diagrama de flujo:
      switch-case-en-java

      Ejemplo:

      // Following is a simple program to demonstrate
      // syntax of switch.
      #include <stdio.h>
      int main()
      {
          int x = 2;
          switch (x) {
          case 1:
              printf("Choice is 1");
              break;
          case 2:
              printf("Choice is 2");
              break;
          case 3:
              printf("Choice is 3");
              break;
          default:
              printf("Choice other than 1, 2 and 3");
              break;
          }
          return 0;
      }
      Producción:

      Choice is 2
      

      Producción:

      Choice is 2
    • (ii) Distinguir entre:
      • 1. argumentos reales y formales
        • Parámetro Formal: Una variable y su tipo tal como aparecen en el prototipo de la función o método.
        • Parámetro real: la variable o expresión correspondiente a un parámetro formal que aparece en la llamada de función o método en el entorno de llamada.
      • 2. variables globales y externas
      • externo: la clase de almacenamiento externo simplemente nos dice que la variable está definida en otro lugar y no dentro del mismo bloque donde se usa. Básicamente, el valor se le asigna en un bloque diferente y esto también se puede sobrescribir/cambiar en un bloque diferente. Entonces, una variable externa no es más que una variable global inicializada con un valor legal donde se declara para usarse en otro lugar. Se puede acceder desde cualquier función/bloque. Además, una variable global normal también se puede convertir en externa colocando la palabra clave ‘externa’ antes de su declaración/definición en cualquier función/bloque. Básicamente, esto significa que no estamos inicializando una nueva variable, sino que estamos usando/accediendo solo a la variable global. El objetivo principal de usar variables externas es que se puede acceder a ellas entre dos archivos diferentes que forman parte de un programa grande.enlace _
      • Variables globales : como sugiere el nombre, se puede acceder a las variables globales desde cualquier parte del programa.
        • Están disponibles durante todo el tiempo de vida de un programa.
        • Se declaran en la parte superior del programa fuera de todas las funciones o bloques.
        • Declaración de variables globales : las variables globales generalmente se declaran fuera de todas las funciones y bloques, en la parte superior del programa. Se puede acceder a ellos desde cualquier parte del programa.
  2. Describa la llamada por valor y la llamada por referencia con un ejemplo.

    Hay diferentes formas en las que los datos de los parámetros se pueden pasar dentro y fuera de los métodos y funciones. Supongamos que se llama a una función B() desde otra función A() . En este caso, A se denomina «función de llamador» y B se denomina «función de llamado o función de llamado» . Además, los argumentos que A envía a B se denominan argumentos reales y los parámetros de B se denominan argumentos formales .

    Métodos importantes de paso de parámetros

    1. Pasar por valor: este método utiliza la semántica en modo . Los cambios realizados en el parámetro formal no se transmiten de vuelta a la persona que llama. Cualquier modificación a la variable de parámetro formal dentro de la función o método llamado afecta solo a la ubicación de almacenamiento separada y no se reflejará en el parámetro real en el entorno de llamada. Este método también se llama llamada por valor .

      // C program to illustrate
      // call by value
      #include <stdio.h>
        
      void func(int a, int b)
      {
          a += b;
          printf("In func, a = %d b = %d\n", a, b);
      }
      int main(void)
      {
          int x = 5, y = 7;
        
          // Passing parameters
          func(x, y);
          printf("In main, x = %d y = %d\n", x, y);
          return 0;
      }

      Producción:

      In func, a = 12 b = 7
      In main, x = 5 y = 7
      

      Los lenguajes como C, C++, Java admiten este tipo de paso de parámetros. Java, de hecho, es estrictamente llamada por valor.
      Deficiencias:

      • Ineficiencia en la asignación de almacenamiento
      • Para objetos y arrays, la semántica de copia es costosa
    2. Pasar por referencia (aliasing): esta técnica utiliza semántica de modo de entrada/salida . Los cambios realizados en el parámetro formal se transmiten de vuelta a la persona que llama a través del paso de parámetros. Cualquier cambio en el parámetro formal se refleja en el parámetro real en el entorno de llamada, ya que el parámetro formal recibe una referencia (o puntero) a los datos reales. Este método también se llama < em>llamada por referencia . Este método es eficiente tanto en el tiempo como en el espacio.

      // C program to illustrate
      // call by reference
      #include <stdio.h>
        
      void swapnum(int* i, int* j)
      {
          int temp = *i;
          *i = *j;
          *j = temp;
      }
        
      int main(void)
      {
          int a = 10, b = 20;
        
          // passing parameters
          swapnum(&a, &b);
        
          printf("a is %d and b is %d\n", a, b);
          return 0;
      }

      Producción:

      a is 20 and b is 10
      

    5. Intenta DOS partes cualquiera: (10*2 = 20)

    1. Escribir un programa en lenguaje C para generar la serie de Fibonacci.

      Programa en C para generar la serie de Fibonacci :

      // Fibonacci Series using Recursion
        
      #include <stdio.h>
        
      int fib(int n)
      {
          if (n <= 1)
              return n;
          return fib(n - 1) + fib(n - 2);
      }
        
      int main()
      {
          int n = 9;
          printf("%d", fib(n));
          getchar();
          return 0;
      }
      Producción:

      34
      
    2. ¿Qué quiere decir con asignación de memoria dinámica? Explique en detalle las siguientes funciones: free y calloc

      Asignación de memoria dinámica en C : se puede definir como un procedimiento en el que el tamaño de una estructura de datos (como Array) se cambia durante el tiempo de ejecución.

      C proporciona algunas funciones para lograr estas tareas. Hay 4 funciones de biblioteca proporcionadas por C definidas en el archivo de encabezado <stdlib.h> para facilitar la asignación de memoria dinámica en la programación de C. Están:

      1. malloc()
      2. llamar()
      3. libre()
      4. reasignar()

      Veamos cada uno de ellos en detalle.

      1. llamar()

        El método «calloc» o «asignación contigua» se utiliza para asignar dinámicamente el número especificado de bloques de memoria del tipo especificado. Inicializa cada bloque con un valor predeterminado ‘0’.

        Sintaxis:

        ptr = (cast-type*)calloc(n, element-size);
        
        For Example:
        ptr = (float*) calloc(25, sizeof(float));
        
        This statement allocates contiguous space in memory 
        for 25 elements each with the size of float.
        

        Si el espacio es insuficiente, la asignación falla y devuelve un puntero NULL.

        Ejemplo:

        #include <stdio.h>
        #include <stdlib.h>
          
        int main()
        {
          
            // This pointer will hold the
            // base address of the block created
            int* ptr;
            int n, i, sum = 0;
          
            // Get the number of elements for the array
            n = 5;
            printf("Enter number of elements: %d\n", n);
          
            // Dynamically allocate memory using calloc()
            ptr = (int*)calloc(n, sizeof(int));
          
            // Check if the memory has been successfully
            // allocated by malloc or not
            if (ptr == NULL) {
                printf("Memory not allocated.\n");
                exit(0);
            }
            else {
          
                // Memory has been successfully allocated
                printf("Memory successfully allocated using calloc.\n");
          
                // Get the elements of the array
                for (i = 0; i < n; ++i) {
                    ptr[i] = i + 1;
                }
          
                // Print the elements of the array
                printf("The elements of the array are: ");
                for (i = 0; i < n; ++i) {
                    printf("%d, ", ptr[i]);
                }
            }
          
            return 0;
        }
        Producción:

        Enter number of elements: 5
        Memory successfully allocated using calloc.
        The elements of the array are: 1, 2, 3, 4, 5,
        
      2. libre()

        El método «libre» se utiliza para desasignar dinámicamente la memoria. La memoria asignada mediante las funciones malloc() y calloc() no se desasigna por sí sola. Por lo tanto, se usa el método free() siempre que se lleva a cabo la asignación de memoria dinámica. Ayuda a reducir el desperdicio de memoria al liberarla.

        Sintaxis:

        free(ptr);
        

        Ejemplo:

        #include <stdio.h>
        #include <stdlib.h>
          
        int main()
        {
          
            // This pointer will hold the
            // base address of the block created
            int *ptr, *ptr1;
            int n, i, sum = 0;
          
            // Get the number of elements for the array
            n = 5;
            printf("Enter number of elements: %d\n", n);
          
            // Dynamically allocate memory using malloc()
            ptr = (int*)malloc(n * sizeof(int));
          
            // Dynamically allocate memory using calloc()
            ptr1 = (int*)calloc(n, sizeof(int));
          
            // Check if the memory has been successfully
            // allocated by malloc or not
            if (ptr == NULL || ptr1 == NULL) {
                printf("Memory not allocated.\n");
                exit(0);
            }
            else {
          
                // Memory has been successfully allocated
                printf("Memory successfully allocated using malloc.\n");
          
                // Free the memory
                free(ptr);
                printf("Malloc Memory successfully freed.\n");
          
                // Memory has been successfully allocated
                printf("\nMemory successfully allocated using calloc.\n");
          
                // Free the memory
                free(ptr1);
                printf("Calloc Memory successfully freed.\n");
            }
          
            return 0;
        }
        Producción:

        Enter number of elements: 5
        Memory successfully allocated using malloc.
        Malloc Memory successfully freed.
        
        Memory successfully allocated using calloc.
        Calloc Memory successfully freed.
        
  3. Escriba un programa para sumar dos arrays de dimensión 3*3 y almacene el resultado en otra array

    #include <stdio.h>
    #define N 3
      
    // This function adds A[][] and B[][], and stores
    // the result in C[][]
    void add(int A[][N], int B[][N], int C[][N])
    {
        int i, j;
        for (i = 0; i < N; i++)
            for (j = 0; j < N; j++)
                C[i][j] = A[i][j] + B[i][j];
    }
      
    int main()
    {
        int A[N][N] = { { 1, 1, 1 },
                        { 2, 2, 2 },
                        { 3, 3, 3 } };
      
        int B[N][N] = { { 1, 1, 1 },
                        { 2, 2, 2 },
                        { 3, 3, 3 } };
      
        int C[N][N]; // To store result
        int i, j;
        add(A, B, C);
      
        printf("Result matrix is \n");
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++)
                printf("%d ", C[i][j]);
            printf("\n");
        }
      
        return 0;
    }
    Producción:

    Result matrix is 
    2 2 2 
    4 4 4 
    6 6 6
    

Publicación traducida automáticamente

Artículo escrito por RishabhPrabhu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *