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

📅  最后修改于: 2021-05-20 08:31:45             🧑  作者: Mango

论文下载链接:论文|第二学期| 2014-15

时间: 3小时
总分数:100

注意:-

  • 尝试所有问题。每个问题都带有标记。
  • 必要时假定合适的数据。

2.尝试两个零件:(10 * 2 = 20)

  1. 你说的一个字符的ASCII值明白了吗?我们可以使用包括整数数据类型和字符数据类型的表达式吗?证明你的答案。 ASCII是美国信息交换标准代码。 ASCII是一种字符编码方案,它是第一个字符编码标准.ASCII使用7位表示一个字符。它具有128个代码点,范围是0到127。它是将英语字符表示为数字的代码,每个字母分配的数字是0到127。

    是的,我们可以使用包括整数数据类型和字符数据类型的表达式。在此类表达式中,会发生类型转换,并且字符数据类型将转换为其整数值。该整数值是字符的ASCII值。

    例子:

    // An example to show we can use
    // expressions including both 
    // integer data type and character data type
      
    #include 
      
    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;
    }
    

    输出:

    z = 107
  2. 写下类型转换和类型转换之间的区别。什么是转义字符?在C语言中,有256个数字字符的字符集。整个字符集分为两部分,即ASCII字符集和扩展的ASCII字符集。但是除此之外,还存在一些其他字符,它们不是任何字符集的一部分,称为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

    例子:

    // C program to illustrate
    // \b escape sequence
    #include 
    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);
    }
    

    输出:

    The output is dependent upon compiler.
    
  3. 将以下数字转换为: (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.尝试两个零件:(10 * 2 = 20)

  1. 给出loop语句以打印以下整数序列:
    -6 -4 -2 0 2 4 6
    #include 
      
    int main()
    {
      
        int i = 0;
      
        for (i = -6; i <= 6; i += 2)
            printf("%d ", i);
      
        return 0;
    }
    

    输出:

    -6 -4 -2 0 2 4 6 
  2. 递归的主要原理是什么?函数直接或间接调用自身的过程称为递归,而相应的函数称为递归函数。使用递归算法,可以很容易地解决某些问题。此类问题的示例包括河内塔(TOH),有序/预购/后继树遍历,图的DFS等。

    递归的基本条件是什么?
    在递归程序中,提供了基本情况的解决方案,并且以较小的问题表示较大的问题。

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

    在上面的示例中,定义了n <= 1的基本情况,并且可以通过转换为较小的1直到达到基本情况来解决较大的数值。

  3. 如果int a = 2,b = 3,x = 0;求出x =(++ a,b + = a)的值输出: x = 6
    解释:
    • 当a = 2时,b = 3且x最初为0。
    • 所以,
      x =(++ a,b + = a)
      =(((++ a),b + = a)
      =(b + = a)…..现在a = 3
      =(b = b + a)
      =(b = 3 + 3)
      =(b = 6)
      =(6)
      x = 6

4.尝试两个零件:(10 * 2 = 20)

  1. C语言中的运算符有什么不同类型,还写下了运算符的关联性和优先级之间的区别。

    运算符是任何编程语言的基础。因此,如果不使用运算符,则C / C++编程语言的功能是不完整的。我们可以将运算符定义为符号,以帮助我们对操作数执行特定的数学和逻辑计算。换句话说,我们可以说运算符对操作数进行运算。
    例如,考虑以下语句:

    c = a + b;
    

    这里,“+”是被称为加法运算符和“a”和“b”是操作数运算符。加法运算符告诉编译器将操作数“ a”和“ b”相加。 C / C++具有许多内置的运算符类型,它们可以分类为:

    • 算术运算符:这些运算符用于对操作数执行算术/数学运算。示例:(+,-,*,/,%,++,–)。
    • 关系运算符:关系运算符用于比较两个操作数的值。例如:检查一个操作数是否等于另一个操作数,一个操作数是否大于另一个操作数,等等。一些关系运算符是(==,> =,<=)。要详细了解这些运算符,请访问此链接。
    • 逻辑运算符:逻辑运算符用于组合两个或多个条件/约束或补充所考虑的原始条件的评估。逻辑运算符是布尔值true或false。要详细了解不同的逻辑运算符,请访问此链接。
    • 按位运算符:按位运算符用于对操作数执行位级运算。首先将运算符转换为位级别,然后对操作数进行计算。诸如加法,减法,乘法等数学运算可在位级别执行,以加快处理速度。要详细了解按位运算运算符,请访问此链接。
    • 赋值运算符:赋值运算符用于将值分配给变量。赋值运算符的左侧操作数是一个变量,而赋值运算符的右侧操作数是一个值。右侧的值必须与左侧的变量的数据类型相同。否则编译器将引发错误。
    • 其他运算符:除了上述运算符外,还有其他一些C或C++运算符可用于执行某些特定任务。这里讨论其中一些:
      • sizeof运算符:sizeof在C / C++编程语言中被大量使用。它是一个编译时一元运算运算符,可用于计算其操作数的大小。 sizeof的结果是无符号整数类型,通常用size_t表示。基本上,sizeof运算符用于计算变量的大小。要详细了解sizeof运算符,您可以访问此链接。
      • 逗号运算符:逗号运算符(用标记表示)是一个二进制运算符,它求值第一个操作数并丢弃结果,然后求值第二个操作数并返回该值(和类型)。逗号运算符的优先级是所有C运算符符中的最低。逗号既充当运算符,又充当分隔符。要详细了解逗号,请访问此链接。
      • 条件运算符:条件运算符的形式为Expression1吗? Expression2:Expression3 。此处,表达式1是要评估的条件。如果condition(Expression1)为True ,则将执行并返回Expression2的结果;否则,如果condition(Expression1)为false ,则将执行并返回Expression3的结果。我们可以替换条件运算符对if..else语句的使用。要详细了解条件运算符,请访问此链接。
    • (i)SWITCH语句在C编程语言中的作用是什么?举例说明。 Switch case语句代替了将变量与多个整数值进行比较的long if语句
      • switch语句是多路分支语句。它提供了一种简单的方法,可以根据表达式的值将执行分派到代码的不同部分。
      • Switch是一个控制语句,它允许一个值更改执行控制。

      句法:

      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
      }

      流程图:
      在Java中切换

      例子:

      // Following is a simple program to demonstrate
      // syntax of switch.
      #include 
      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;
      }
      
      输出:
      Choice is 2
      

      输出:

      Choice is 2
    • (ii)区分:
      • 1.实际和形式上的争论
        • 形式参数:在函数或方法的原型中出现的变量及其类型。
        • 实际参数:与在调用环境中的函数或方法调用中出现的形式参数相对应的变量或表达式。
      • 2.全局和外部变量
      • extern :extern存储类仅告诉我们该变量是在其他位置定义的,而不是在使用该变量的同一块中定义的。基本上,该值是在另一个块中分配给它的,也可以在另一个块中对其进行覆盖/更改。因此,extern变量不过是一个全局变量,该变量在声明有合法值的情况下进行了初始化,以便在其他地方使用。可以在任何函数/块中访问它。同样,也可以通过在任何函数/块的声明/定义之前将“ extern”关键字放置在普通全局变量中,将其设置为外部变量。这基本上表示我们不是在初始化新变量,而是仅在使用/访问全局变量。使用外部变量的主要目的是可以在大型程序的两个不同文件之间访问它们。有关外部变量如何工作的更多信息,请查看此链接。
      • 全局变量:顾名思义,可以从程序的任何部分访问全局变量。
        • 在整个程序的生命周期内都可以使用它们。
        • 它们在所有功能或块之外的程序顶部声明。
        • 声明全局变量:全局变量通常在程序顶部的所有函数和块之外声明。可以从程序的任何部分访问它们。
  2. 举例说明按值调用和按引用调用。参数数据可以通过不同的方法传入和传出方法和函数。让我们假设从另一个函数A()调用了函数B () 。在这种情况下, A被称为“呼叫者函数”,B被称为“被呼叫函数或被调用者函数” 。同样, A发送给B的参数称为实际参数,而B的参数称为形式参数

    参数传递的重要方法

    1. 按值传递:此方法使用模式内语义。对形式参数所做的更改不会传输回调用方。对被调用函数或方法内部的形式参数变量的任何修改仅影响单独的存储位置,并且不会反映在调用环境中的实际参数中。此方法也称为按值调用

      // C program to illustrate
      // call by value
      #include 
        
      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;
      }
      

      输出:

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

      诸如C,C++, Java之类的语言都支持这种类型的参数传递。实际上, Java严格按值调用。
      缺点:

      • 存储分配效率低下
      • 对于对象和数组,复制语义是昂贵的
    2. 通过引用传递(别名):此技术使用输入/输出模式语义。对形式参数所做的更改确实会通过参数传递回传给调用者。形式参数的任何更改都会反映在调用环境中的实际参数中,因为形式参数会收到对实际数据的引用(或指针)。此方法也称为通过引用调用< em> 。该方法在时间和空间上都是有效的。

      // C program to illustrate
      // call by reference
      #include 
        
      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;
      }
      

      输出:

      a is 20 and b is 10
      

    5.尝试两个零件:(10 * 2 = 20)

    1. 用C语言编写一个程序来生成斐波那契数列。用C程序生成斐波那契数列
      // Fibonacci Series using Recursion
        
      #include 
        
      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;
      }
      
      输出:
      34
      
    2. 您所说的动态内存分配是什么意思?详细说明以下功能:free和calloc

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

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

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

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

      1. 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,
        
      2. 自由()

        “免费”方法用于动态取消分配内存。使用函数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.
        
    3. 编写程序以添加两个尺寸为3 * 3的矩阵并将结果存储在另一个矩阵中
      #include 
      #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;
      }
      
      输出:
      Result matrix is 
      2 2 2 
      4 4 4 
      6 6 6