📌  相关文章
📜  AKTU 1年级第二学年解题纸2016-17 | COMP。系统和C编程| B段

📅  最后修改于: 2021-05-20 06:22:17             🧑  作者: Mango

论文下载链接:论文|第二学期| 2016-17

时间: 3小时
总分数:100

注意:-

  • 共分为三个部分。 A节为20分, B节为30分, C节为50分。
  • 尝试所有问题。每个问题都带有标记。
  • 必要时假定合适的数据。

2.尝试以下五个问题中的任何一个:(5 * 10 = 50)

  1. 什么是数字计算机?还详细说明了数字计算机的框图。

    数字计算机:数字计算机可以定义为可编程机器,它可以读取作为指令传递的二进制数据,处理该二进制数据并显示计算出的数字输出。因此,数字计算机就是那些处理数字数据的计算机。

    数字计算机功能部件的详细信息

    • 输入单元:输入单元由连接到计算机的输入设备组成。这些设备接受输入并将其转换为计算机可以理解的二进制语言。一些常见的输入设备是键盘,鼠标,操纵杆,扫描仪等。
    • 中央处理器(CPU0:输入设备将信息输入计算机后,处理器对其进行处理。CPU被称为计算机的大脑,因为它是计算机的控制中心。它首先从内存中获取指令,然后从计算机中获取指令。然后解释它们以便知道要做什么。如果需要,则从内存或输入设备中获取数据,然后CPU执行或执行所需的计算,然后将输出存储或显示在输出设备上,CPU具有三个负责不同功能的主要组件-算术逻辑单元(ALU),控制单元(CU)和存储器寄存器
    • 算术和逻辑单元(ALU):顾名思义,ALU执行数学计算并做出逻辑决策。算术计算包括加法,减法,乘法和除法。逻辑决策涉及两个数据项的比较,以查看哪个数据项更大或更小或相等。
    • 控制单元:控制单元负责协调和控制流入和流出CPU的数据流,还控制ALU,存储器寄存器以及输入/输出单元的所有操作。它还负责执行程序中存储的所有指令。它解码获取的指令,对其进行解释,然后将控制信号发送到输入/输出设备,直到所需的操作由ALU和内存正确完成为止。
    • 内存寄存器:寄存器是CPU中的临时内存单元。这些用于存储处理器直接使用的数据。寄存器的大小可以不同(16位,32位,64位等),CPU内部的每个寄存器都有特定的函数,例如存储数据,存储指令,在存储器中存储位置地址等。用户寄存器可以由汇编语言程序员用来存储操作数,中间结果等。累加器(ACC)是ALU中的主要寄存器,包含要在ALU中执行的操作的操作数之一。
    • 内存:附属于CPU的内存用于存储数据和指令,称为内部存储器。内部存储器分为许多存储位置,每个位置都可以存储数据或指令。每个存储单元的大小均相同,并具有一个地址。借助该地址,计算机可以轻松读取任何内存位置,而不必搜索整个内存。当程序被执行时,它的数据被复制到内部存储器中,并且被存储在存储器中直到执行结束。内部存储器也称为主存储器或主存储器。该存储器也称为RAM,即随机存取存储器。数据访问的时间与其在存储器中的位置无关,因此,该存储器也称为随机访问存储器(RAM)。阅读此文章以了解不同类型的RAM
    • 输出单元:输出单元由计算机附带的输出设备组成。它将来自CPU的二进制数据转换为人类可以理解的形式。常见的输出设备是监视器,打印机,绘图仪等。
  2. 编写一个计算整数位数之和的程序。例如,数字2155的数字总和为2 + 1 + 5 + 5或13。程序应接受用户键入的任意数字。
    // C program to compute sum of digits in
    // number.
      
    #include 
      
    /* Function to get sum of digits */
    int getSum(int n)
    {
        int sum = 0;
        while (n != 0) {
            sum = sum + n % 10;
            n = n / 10;
        }
        return sum;
    }
      
    // Driver code
    int main()
    {
      
        int n;
      
        // Get the number
        scanf("%d", &n);
        printf("Enter the number: %d", n);
      
        // Print the digits of the number
        printf("\nSum of Digits: %d ",
               getSum(n));
      
        return 0;
    }
    

    输出:

    Enter the number: 32764
    Sum of Digits: 22 
  3. 编写一个程序,以相反的顺序将一个数组的内容复制到另一个数组中。
    #include 
      
    // Driver code
    int main()
    {
        int original_arr[10], copied_arr[10], i;
      
        // Get the numbers in the array
        printf("\nEnter the Elements: ");
        for (i = 0; i < 10; i++) {
            scanf("%d", &original_arr[i]);
            printf("%d, ", original_arr[i]);
        }
      
        // Copy the elements of the array
        // in the copied_arr in Reverse Order
        for (i = 0; i < 10; i++) {
            copied_arr[i] = original_arr[10 - i - 1];
        }
      
        // Print the original_arr
        printf("\nOriginal array: ");
        for (i = 0; i < 10; i++) {
            printf("%d ", original_arr[i]);
        }
      
        // Print the copied array
        printf("\nResultant array: ");
        for (i = 0; i < 10; i++) {
            printf("%d ", copied_arr[i]);
        }
      
        return 0;
    }
    

    输出:

    Enter the Elements: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
    Original array: 1 2 3 4 5 6 7 8 9 10 
    Resultant array: 10 9 8 7 6 5 4 3 2 1 
    
  4. 什么是操作系统?还定义操作系统的类型和功能。操作系统–定义:

    • 操作系统是控制应用程序执行的程序,并充当计算机用户和计算机硬件之间的接口。
    • 更为常见的定义是,操作系统是始终在计算机上运行的一个程序(通常称为内核),而其他所有程序都是应用程序。
    • 操作系统与资源和服务(例如内存,处理器,设备和信息)的分配有关。操作系统相应地包括用于管理这些资源的程序,例如流量控制器,调度程序,内存管理模块,I / O程序和文件系统。

    操作系统的功能–操作系统执行三个功能:

    1. 便利性: OS使计算机更易于使用。
    2. 效率: OS允许高效使用计算机系统资源。
    3. 不断发展的能力:操作系统的构建方式应允许有效地开发,测试和引入新的系统功能,同时又不干扰服务。

    操作系统类型–

    • 批处理操作系统-计算机上程序中的作业序列,无需人工干预。
    • 分时操作系统-允许许多用户共享计算机资源。(最大程度地利用资源)。
    • 分布式操作系统-管理一组不同的计算机,使它们看起来像是一台计算机。
    • 网络操作系统-在不同操作系统中运行的计算机可以参与公共网络(用于安全目的)。
    • 实时操作系统–意味着可以按时完成的应用程序。

    操作系统的示例是–

    • Windows(基于GUI的PC)
    • GNU / Linux(个人,工作站,ISP,文件和打印服务器,三层客户端/服务器)
    • macOS(Macintosh),用于Apple的个人计算机和工作站(MacBook,iMac)。
    • Android(用于智能手机/平板电脑/智能手表的Google操作系统)
    • iOS(用于iPhone,iPad和iPod Touch的Apple操作系统)
  5. 编写一个程序以将两个矩阵相乘(从键盘上读取矩阵的大小和元素数)。
    // C program to multiply two square matrices.
      
    #include 
      
    const int MAX = 100;
      
    // Function to print Matrix
    void printMatrix(int M[][MAX], int rowSize, int colSize)
    {
        for (int i = 0; i < rowSize; i++) {
            for (int j = 0; j < colSize; j++)
                printf("%d ", M[i][j]);
      
            printf("\n");
        }
    }
      
    // Function to multiply two matrices A[][] and B[][]
    void multiplyMatrix(int row1, int col1, int A[][MAX],
                        int row2, int col2, int B[][MAX])
    {
        int i, j, k;
      
        // Matrix to store the result
        int C[MAX][MAX];
      
        // Check if multiplication is Possible
        if (row2 != col1) {
            printf("Not Possible\n");
            return;
        }
      
        // Multiply the two
        for (i = 0; i < row1; i++) {
            for (j = 0; j < col2; j++) {
                C[i][j] = 0;
                for (k = 0; k < row2; k++)
                    C[i][j] += A[i][k] * B[k][j];
            }
        }
      
        // Print the result
        printf("\nResultant Matrix: \n");
        printMatrix(C, row1, col2);
    }
      
    // Driven Program
    int main()
    {
        int row1, col1, row2, col2, i, j;
        int A[MAX][MAX], B[MAX][MAX];
      
        // Read size of Matrix A from user
        printf("Enter the number of rows of First Matrix: ");
        scanf("%d", &row1);
        printf("%d", row1);
        printf("\nEnter the number of columns of First Matrix: ");
        scanf("%d", &col1);
        printf("%d", col1);
      
        // Read the elements of Matrix A from user
        printf("\nEnter the elements of First Matrix: ");
        for (i = 0; i < row1; i++) {
            for (j = 0; j < col1; j++) {
                printf("\nA[%d][%d]: ", i, j);
                scanf("%d", &A[i][j]);
                printf("%d", A[i][j]);
            }
        }
      
        // Read size of Matrix B from user
        printf("\nEnter the number of rows of Second Matrix: ");
        scanf("%d", &row2);
        printf("%d", row2);
        printf("\nEnter the number of columns of Second Matrix: ");
        scanf("%d", &col2);
        printf("%d", col2);
      
        // Read the elements of Matrix B from user
        printf("\nEnter the elements of First Matrix: ");
        for (i = 0; i < row2; i++) {
            for (j = 0; j < col2; j++) {
                printf("\nB[%d][%d]: ", i, j);
                scanf("%d", &B[i][j]);
                printf("%d", B[i][j]);
            }
        }
      
        // Print the Matrix A
        printf("\n\nFirst Matrix: \n");
        printMatrix(A, row1, col1);
      
        // Print the Matrix B
        printf("\nSecond Matrix: \n");
        printMatrix(B, row2, col2);
      
        // Find the product of the 2 matrices
        multiplyMatrix(row1, col1, A, row2, col2, B);
      
        return 0;
    }
    
    输出:
    Enter the number of rows of First Matrix: 2
    Enter the number of columns of First Matrix: 3
    Enter the elements of First Matrix: 
    A[0][0]: 1
    A[0][1]: 2
    A[0][2]: 3
    A[1][0]: 4
    A[1][1]: 5
    A[1][2]: 6
    
    Enter the number of rows of Second Matrix: 3
    Enter the number of columns of Second Matrix: 2
    Enter the elements of First Matrix: 
    B[0][0]: 1
    B[0][1]: 2
    B[1][0]: 3
    B[1][1]: 4
    B[2][0]: 5
    B[2][1]: 6
    
    First Matrix: 
    1 2 3 
    4 5 6 
    
    Second Matrix: 
    1 2 
    3 4 
    5 6 
    
    Resultant Matrix: 
    22 28 
    49 64 
    
  6. 编写程序以升序对整数数组进行排序。
    // C program for implementation of selection sort
    #include 
      
    void swap(int* xp, int* yp)
    {
        int temp = *xp;
        *xp = *yp;
        *yp = temp;
    }
      
    void selectionSort(int arr[], int n)
    {
        int i, j, min_idx;
      
        // One by one move boundary of unsorted subarray
        for (i = 0; i < n - 1; i++) {
            // Find the minimum element in unsorted array
            min_idx = i;
            for (j = i + 1; j < n; j++)
                if (arr[j] < arr[min_idx])
                    min_idx = j;
      
            // Swap the found minimum element with the first element
            swap(&arr[min_idx], &arr[i]);
        }
    }
      
    /* Function to print an array */
    void printArray(int arr[], int size)
    {
        int i;
        for (i = 0; i < size; i++)
            printf("%d ", arr[i]);
        printf("\n");
    }
      
    // Driver program to test above functions
    int main()
    {
        int arr[] = { 64, 25, 12, 22, 11 };
        int n = sizeof(arr) / sizeof(arr[0]);
        selectionSort(arr, n);
        printf("Sorted array: \n");
        printArray(arr, n);
        return 0;
    }
    

    输出:

    Sorted array: 
    11 12 22 25 64
  7. 什么是字符串?还要说明不同的字符串函数。编写一个用户定义函数,以比较两个相同或不同的字符串。字符串定义为字符数组。字符数组和字符串之间的区别是字符串以特殊字符’\ 0’终止。

    声明字符串就像声明一维数组一样简单。以下是使用C编程语言声明字符串的基本语法。

    char str_name[size];
    

    一些最常用的String函数是:

    • strcat :strcat()函数会将源字符串的副本附加到目标字符串的末尾。
    • strchr :在C / C++中,strrchr()是用于字符串处理的预定义函数。 cstring是字符串函数所需的头文件。

      此函数返回一个指针,该指针指向字符串最后一次出现的字符。
      我们要查找的最后一个出现的字符作为函数的第二个参数传递,而我们必须在其中找到该字符的字符串作为函数的第一个参数传递。

    • strcmp :strcmp()是内置库函数,在< 字符串.h>头文件中声明。此函数将两个字符串作为参数,然后按字典顺序比较这两个字符串。
    • strcpy :strcpy()是C / C++中的标准库函数,用于将一个字符串复制到另一个字符串。在C中,它存在于字符串.h头文件中,而在C++中,它存在于cstring头文件中。
    • strlenstrlen()函数计算给定字符串的长度。strlen()函数在字符串.h头文件中定义。它不计算空字符“ \ 0”。
    • strncat :在C / C++中,strncat()是用于字符串处理的预定义函数。 字符串.h是字符串函数所需的头文件。

      该函数将以上n从字符串的字符指向由src到字符串的末尾由DEST加上终止空字符的指向。字符串(src)的初始字符将覆盖字符串(dest)末尾的Null字符。因此,字符串的长度(dest)变为strlen(dest)+ n。但是,如果字符串(src)的长度小于n ,则仅复制直到终止空字符的内容,并且字符串(dest)的长度变为strlen(src)+ strlen(dest)。

      该行为是未定义的,如果

      • 字符串重叠。
      • dest数组的大小不足以附加src的内容。
    • strncmpstd :: strncmp()函数从字符比较两个以null结尾的字符串,并根据结果返回一个整数。
      • 该函数有两个字符串和一个数NUM作为参数,并在两个字符串的最开始的num个字节的比较。
      • num最多应等于最长字符串的长度。如果将num定义为大于字符串长度,则将进行比较,直到两个字符串的null-character(’\ 0’)为止。
      • 此函数按字典顺序比较两个字符串。它从每个字符串的第一个字符开始比较。如果它们彼此相等,则继续并比较每个字符串的下一个字符,依此类推。
      • 比较过程将一直终止,直到达到一个终止字符串或两个字符串中的num个字符为止。
    • strncpy :strncpy()函数类似于strcpy()函数,不同之处在于最多复制了src个n字节。如果src的前n个字符中没有NULL字符,则放置在dest中的字符串将不会以NULL终止。如果src的长度小于n,则strncpy()将另外的NULL字符写入dest以确保总共写入了n个字符。
    • strrchr :C / C++中的strrchr()函数查找字符串字符的最后一次出现。它返回一个指向字符串最后一次出现的指针。终止的空字符被视为C字符串的一部分。因此,还可以定位它以检索到字符串末尾的指针。它在cstring头文件中定义。

    程序检查两个字符串是否相同:

    // C program to check if
    // two strings are identical
      
    #include 
    #include 
      
    int main()
    {
      
        char string1[100], string2[100];
      
        // Get the strings which
        // is to be checked
        scanf("%s", string1);
        printf("Enter the first string: %s", string1);
      
        // Get the strings which
        // is to be checked
        scanf("%s", string2);
        printf("\nEnter the second string: %s", string2);
      
        // Check if both strings are equal
        printf("\nAre both strings same: ");
      
        if (strcmp(string1, string2) == 0) {
            printf("Yes");
        }
        else {
            printf("No");
        }
      
        return 0;
    }
    

    输出:

    Enter the first string: GeeksForGeeks
    Enter the second string: GeeksForGeeks
    Are both strings same: Yes
    
  8. 定义指针的概念?还定义动态内存分配及其各种功能。指针是地址的符号表示。它们使程序能够模拟按引用调用以及创建和操纵动态数据结构。它在C / C++中的一般声明具有以下格式:

    句法:

    datatype *var_name; 
    int *ptr;   //ptr can point to an address which holds int data
    

    如何使用指针?

    • 定义一个指针变量
    • 使用一元运算符(&)将变量的地址分配给指针,该运算运算符返回该变量的地址。
    • 使用一元运算符(*)访问存储在地址中的值,该运算运算符返回位于其操作数指定的地址处的变量的值。

    我们将数据类型与指针关联的原因是它知道数据存储在多少字节中。当我们增加一个指针时,我们将指针增加它所指向的数据类型的大小。

    c中的指针

    C中的动态内存分配:可以定义为在运行时更改数据结构(如Array)大小的过程。

    C提供了一些功能来完成这些任务。 C在头文件下定义了4个库函数,以促进C编程中的动态内存分配。他们是:

    1. malloc()
    2. calloc()
    3. 自由()
    4. realloc()

    让我们详细查看它们中的每一个。

    1. malloc()

      “ malloc”“内存分配”方法用于动态分配具有指定大小的单个大内存块。它返回类型为void的指针,该指针可以转换为任何形式的指针。

      句法:

      ptr = (cast-type*) malloc(byte-size)
      
      For Example:
      ptr = (int*) malloc(100 * sizeof(int));
      
      Since the size of int is 4 bytes, 
      this statement will allocate 400 bytes of memory. 
      And, the pointer ptr holds the address 
      of the first byte in the allocated memory.
      

      如果空间不足,分配将失败并返回NULL指针。

      例子:

      #include 
      #include 
        
      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 malloc()
          ptr = (int*)malloc(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 malloc.\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;
      }
      
      输出:
      Enter number of elements: 5
      Memory successfully allocated using malloc.
      The elements of the array are: 1, 2, 3, 4, 5,
      
    2. calloc()

      “ calloc”“连续分配”方法用于动态分配指定类型的指定数量的内存块。它使用默认值“ 0”初始化每个块。

      句法:

      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.
      

      如果空间不足,分配将失败并返回NULL指针。

      例子:

      #include 
      #include 
        
      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;
      }
      
      输出:
      Enter number of elements: 5
      Memory successfully allocated using calloc.
      The elements of the array are: 1, 2, 3, 4, 5,
      
    3. 自由()

      “免费”方法用于动态取消分配内存。使用函数malloc()和calloc()分配的内存不会自行取消分配。因此,每当发生动态内存分配时,都会使用free()方法。它通过释放内存来帮助减少内存浪费。

      句法:

      free(ptr);
      

      例子:

      #include 
      #include 
        
      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;
      }
      
      输出:
      Enter number of elements: 5
      Memory successfully allocated using malloc.
      Malloc Memory successfully freed.
      
      Memory successfully allocated using calloc.
      Calloc Memory successfully freed.
      
    4. realloc()

      重新分配“重新分配”方法用于动态更改先前分配的内存的内存分配。换句话说,如果先前借助malloc或calloc分配的内存不足,则可以使用realloc动态地重新分配memory

      句法:

      ptr = realloc(ptr, newSize);
      
      where ptr is reallocated with new size 'newSize'.
      

      如果空间不足,分配将失败并返回NULL指针。

      例子:

      #include 
      #include 
        
      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]);
              }
        
              // Get the new size for the array
              n = 10;
              printf("\n\nEnter the new size of the array: %d\n", n);
        
              // Dynamically re-allocate memory using realloc()
              ptr = realloc(ptr, n * sizeof(int));
        
              // Memory has been successfully allocated
              printf("Memory successfully re-allocated using realloc.\n");
        
              // Get the new elements of the array
              for (i = 5; 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]);
              }
        
              free(ptr);
          }
        
          return 0;
      }
      
      输出:
      Enter number of elements: 5
      Memory successfully allocated using calloc.
      The elements of the array are: 1, 2, 3, 4, 5, 
      
      Enter the new size of the array: 10
      Memory successfully re-allocated using realloc.
      The elements of the array are: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,