AKTU 1er año Sem 2 Documento resuelto 2015-16 | COMP. SISTEMA Y PROGRAMACION C | Sec C

Enlace de descarga de papel : Papel | semestre 2 | 2015-16

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

Tiempo: 3 horas
Marcas totales : 100

Nota :-

  • Hay tres secciones. La Sección A lleva 20 puntos, la Sección B lleva 50 puntos y la Sección C lleva 30 puntos.
  • Intenta todas las preguntas. Las marcas se indica frente a cada pregunta.
  • Asumir datos adecuados siempre que sea necesario.

Sección – C

Intenta dos partes: (15*2 = 30)

3. ¿Qué son las directivas de preprocesador ? Explique tres de ellos.

  • Compilación condicional : las directivas de compilación condicional ayudan a compilar una parte específica del programa o nos permiten omitir la compilación de alguna parte específica del programa en función de algunas condiciones. En nuestro artículo anterior , hemos discutido acerca de dos de estas directivas ‘ ifdef ‘ y ‘ endif ‘. En esta publicación discutiremos #ifndef , #if , #else y #elif .
    1. #ifdef : esta directiva es la directiva condicional más simple. Este bloque se llama grupo condicional. El texto controlado se incluirá en la salida del preprocesador si se define el macronombre. El texto controlado dentro de un condicional incluirá directivas de preprocesamiento. Se ejecutan solo si el condicional tiene éxito. Puede anidarlos en varias capas, pero deben estar completamente anidados. En otras palabras, ‘#endif’ siempre coincide con el ‘#ifdef’ más cercano (o ‘#ifndef’ o ‘#if’). Además, no puede comenzar un grupo condicional en un archivo y terminarlo en otro.

      Sintaxis:

      #ifdef MACRO
          controlled text
      #endif /* macroname */
      
    2. #ifndef : sabemos que la directiva in #ifdef si se define el nombre de la macro, entonces el bloque de declaraciones que sigue a la directiva #ifdef se ejecutará normalmente, pero si no está definido, el compilador simplemente omitirá este bloque de declaraciones. La directiva #ifndef es simplemente opuesta a la de la directiva #ifdef. En el caso de #ifndef, el bloque de sentencias entre #ifndef y #endif se ejecutará solo si no se define la macro o el identificador con #ifndef.
      Sintaxis:
      ifndef macro_name
          statement1;
          statement2;
          statement3;
          .
          .
          .
          statementN;
      endif
      

      Si la macro con el nombre ‘macroname’ no se define mediante la directiva #define, solo se ejecutará el bloque de instrucciones.

    3. #if, #else y #elif : estas directivas funcionan juntas y controlan la compilación de partes del programa usando algunas condiciones. Si la condición con la directiva #if se evalúa como un valor distinto de cero, entonces el grupo de líneas inmediatamente después de la directiva #if se ejecutará; de lo contrario, si la condición con la directiva #elif se evalúa como un valor distinto de cero, entonces el grupo de líneas inmediatamente después de que se ejecute la directiva #elif; de lo contrario, se ejecutarán las líneas posteriores a la directiva #else.
      Sintaxis:
      #if macro_condition
         statements
      #elif macro_condition
         statements
      #else
         statements
      #endif
      

      Ejemplo:

      #include <iostream>
        
      #define gfg 7
        
      #if gfg > 200
      #undef gfg
      #define gfg 200
      #elif gfg < 50
      #undef gfg
      #define gfg 50
      #else
      #undef gfg
      #define gfg 100
      #endif
        
      int main()
      {
          std::cout << gfg; // gfg = 50
      }

      Producción:

      50
      

      Observe cómo toda la estructura de las directivas enstringdas #if, #elif y #else termina con #endif.

  • Control de línea (#line) : Siempre que compilamos un programa, hay posibilidades de que ocurra algún error en el programa. Cada vez que el compilador identifica un error en el programa, nos proporciona el nombre del archivo en el que se encuentra el error junto con la lista de líneas y los números de línea exactos donde se encuentra el error. Esto nos facilita encontrar y corregir el error.
    Sin embargo, podemos controlar qué información debe proporcionar el compilador durante los errores de compilación usando la directiva #line.
    Sintaxis:
    #line number "filename"
    

    número : número de línea que se asignará a la siguiente línea de código. Los números de línea de las líneas sucesivas se incrementarán uno a uno a partir de este momento.
    “nombre de archivo” – parámetro opcional que permite redefinir el nombre del archivo que se mostrará.

  • Directiva de error (#error) : esta directiva aborta el proceso de compilación cuando se encuentra en el programa durante la compilación y produce un error que es opcional y se puede especificar como un parámetro.
    Sintaxis:
    #error optional_error
    

    Aquí, option_error es cualquier error especificado por el usuario que se mostrará cuando se encuentre este derective en el programa.
    Ejemplo:

    #ifndef GeeksforGeeks
    #error GeeksforGeeks not found !
    #endif

    Producción:

    error: #error GeeksforGeeks not found !
    

4. (i) Explique la carga y vinculación de un programa en detalle.

  • Loader es el programa del sistema operativo que carga el ejecutable desde el disco a la memoria principal (RAM) para su ejecución . Asigna el espacio de memoria al módulo ejecutable en la memoria principal y luego transfiere el control a la instrucción inicial del programa.

    Ejemplo:

    akash @aix(/ u / akash) #cat./ ak1.cpp
    #include <stdio.h>
                                   int main()
    {
        printf("Testing of Loader !");
        return 0;
    }

    Compilando por el compilador xlC:

    akash @aix(/ u / akash) #xlC – o ak1.out./ ak1.cpp akash @aix(/ u / akash) #ls – lrt ak1 * -rw – rw – r– 1 akash dev 74 Nov 12 06 : 10 ak1.cpp
    – rwxrwxr – x 1 akash dev 8562 12 de noviembre 06 : 34 ak1.out akash @aix(/ u / akash) #

    Lo que realmente sucede mientras se ejecuta el ejecutable: también se podría usar el comando strace para lo mismo.

    akash@aix (/u/akash)# truss ./ak1.out eCCVE («./ ak1.out», 0x2ff20a00 ,
    0x200138a8)
    ) = 0x00000000
    sbrk(0x00000000) = 0x20000998
    vmgetinfo(0x2FF20350, 7, 16) = 0
    sbrk(0x00000000) = 0x20000998
    sbrk(0x00000008) = 0x20000998
    __libc_sbrk(0x00000000) = 0x200009A0
    loadquery(2, 0x200009C8, 0x00001000) = 0
    __loadx(0x0A040000 , 0xF06F599C, 0x00000000, 0xF05BE208, 0x20001D20) = 0xF05BFD64
    loadbind(0, 0xF0760BBC, 0xF06D0E54) = 0
    kfcntl(0, F_GETFL, 0x00000000) = 67110914
    kfcntl(1, F_GETFL, 0x00000000) = 67110914
    kfcntl(2, F_GETFL, 0x00000000) = 67110914
    kfcntl(2, F_GETFL, 0x00000000) = 67110914
    kioctl(1, 22528, 0x00000000, 0x00000000) = 0
    Prueba del cargador !kwrite(1, ” Prueba de L”., 19) = 19
    kfcntl(1, F_GETFL0, 0x000) = 67110914
    kfcntl(2, F_GETFL, 0x2FF22FFC) = 67110914
    _salir(0)

    La primera llamada que se muestra es ‘ execve() ‘, que en realidad es el cargador. Este cargador crea el proceso que involucra:

    • Leer el archivo y crear un espacio de direcciones para el proceso.
    • Se crean las entradas de la tabla de páginas para las instrucciones, los datos y la pila de programas y se inicializa el conjunto de registros.
    • Luego, ejecuta una instrucción de salto a la primera instrucción del programa que generalmente provoca una falla de página y la primera página de sus instrucciones se lleva a la memoria.
  • Vinculación Esta es la fase final en la que se realiza toda la vinculación de las llamadas a funciones con sus definiciones. Linker sabe dónde se implementan todas estas funciones. Linker también hace un trabajo adicional, agrega un código adicional a nuestro programa que se requiere cuando el programa comienza y finaliza. Por ejemplo, hay un código que se requiere para configurar el entorno, como pasar argumentos de línea de comandos. Esta tarea se puede verificar fácilmente usando $size filename.o y $size filename . A través de estos comandos, sabemos cómo el archivo de salida aumenta de un archivo de objeto a un archivo ejecutable. Esto se debe al código extra que agrega el enlazador con nuestro programa. Tenga en cuenta que GCC realiza enlaces dinámicos de forma predeterminada, por lo que printf() está vinculado dinámicamente en el programa anterior. Referirse
    compil8
    this , this y this para obtener más detalles sobre enlaces estáticos y dinámicos.

4. (ii) Escriba un programa en C que lea un número positivo del teclado y lo imprima en orden inverso .
Ejemplo:

Input: 24578 
Output: 87542
#include <stdio.h>
  
/* Iterative function to reverse digits of num*/
int reversDigits(int num)
{
    int rev_num = 0;
    while (num > 0) {
        rev_num = rev_num * 10 + num % 10;
        num = num / 10;
    }
    return rev_num;
}
  
/* Driver program to test reversDigits */
int main()
{
    int num;
  
    scanf("%d", &num);
    printf("Reverse of no. is %d",
           reversDigits(num));
  
    return 0;
}

Producción:

2654

5. Suponga que un archivo contiene registros de estudiantes y cada registro contiene el nombre y la edad de un estudiante. Escriba un programa en C para leer estos registros y mostrarlos ordenados por nombre.

// C program to read Student records 
// like id, name and age, 
// and display them in sorted order by Name 
  
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
  
// struct person with 3 fields 
struct Student { 
    char* name; 
    int id; 
    char age; 
}; 
  
// setting up rules for comparison 
// to sort the students based on names 
int comparator(const void* p, const void* q) 
{ 
    return strcmp(((struct Student*)p)->name, 
                ((struct Student*)q)->name); 
} 
  
// Driver program 
int main() 
{ 
    int i = 0, n = 5; 
  
    struct Student arr[n]; 
  
    // Get the students data 
    arr[0].id = 1; 
    arr[0].name = "bd"; 
    arr[0].age = 12; 
  
    arr[1].id = 2; 
    arr[1].name = "ba"; 
    arr[1].age = 10; 
  
    arr[2].id = 3; 
    arr[2].name = "bc"; 
    arr[2].age = 8; 
  
    arr[3].id = 4; 
    arr[3].name = "aaz"; 
    arr[3].age = 9; 
  
    arr[4].id = 5; 
    arr[4].name = "az"; 
    arr[4].age = 10; 
  
    // Print the Unsorted Structure 
    printf("Unsorted Student Records:\n"); 
    for (i = 0; i < n; i++) { 
        printf("Id = %d, Name = %s, Age = %d \n", 
            arr[i].id, arr[i].name, arr[i].age); 
    } 
    // Sort the structure 
    // based on the specified comparator 
    qsort(arr, n, sizeof(struct Student), comparator); 
  
    // Print the Sorted Structure 
    printf("\n\nStudent Records sorted by Name:\n"); 
    for (i = 0; i < n; i++) { 
        printf("Id = %d, Name = %s, Age = %d \n", 
            arr[i].id, arr[i].name, arr[i].age); 
    } 
  
    return 0; 
} 

Producción:

Unsorted Student Records:
Id = 1, Name = bd, Age = 12 
Id = 2, Name = ba, Age = 10 
Id = 3, Name = bc, Age = 8 
Id = 4, Name = aaz, Age = 9 
Id = 5, Name = az, Age = 10 


Student Records sorted by Name:
Id = 4, Name = aaz, Age = 9 
Id = 5, Name = az, Age = 10 
Id = 2, Name = ba, Age = 10 
Id = 3, Name = bc, Age = 8 
Id = 1, Name = bd, Age = 12

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 *