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

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

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

时间: 3小时
总分数:100

注意:-

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

尝试以下两个问题中的任何一个:(2 * 15 = 30)

3)用语法定义结构。另外,编写一个比较两个给定日期的程序。要存储日期使用结构,请说包含三个成员的日期,即日期,月份和年份。如果日期相等,则显示消息为“等于”,否则显示为“不相等”。

  • 结构是C / C++中用户定义的数据类型。结构创建一个数据类型,该数据类型可用于将可能不同类型的项目分组为单个类型。

    如何建立结构?
    ‘struct’关键字用于创建结构。以下是一个示例。

    struct address {
        char name[50];
        char street[100];
        char city[50];
        char state[20];
        int pin;
    };
    

    如何声明结构变量?
    结构变量既可以用结构声明来声明,也可以像基本类型一样声明为单独的声明。

    // A variable declaration with structure declaration.
    struct Point {
        int x, y;
    } p1; // The variable p1 is declared with 'Point'
      
    // A variable declaration like basic data types
    struct Point {
        int x, y;
    };
      
    int main()
    {
        struct Point p1; // The variable p1 is declared like a normal variable
    }
    

    注意:在C++中,在声明变量之前,struct关键字是可选的。在C语言中,它是强制性的。

    比较两个给定日期的程序:

    #include 
      
    // Declaring the structure of Date
    struct Date {
        int date;
        int month;
        int year;
    };
      
    // Driver code
    int main()
    {
        int date1, date2, month1,
            month2, year1, year2;
      
        // Get the first date
        scanf("%d", &date1);
        printf("Enter the first date: %d", date1);
        scanf("%d", &month1);
        printf("\nEnter the first month: %d", month1);
        scanf("%d", &year1);
        printf("\nEnter the first year: %d", year1);
      
        // Initialise the structure with first date
        struct Date Date1 = { date1, month1, year1 };
      
        // Get the second date
        scanf("%d", &date2);
        printf("\nEnter the second date: %d", date2);
        scanf("%d", &month2);
        printf("\nEnter the second month: %d", month2);
        scanf("%d", &year2);
        printf("\nEnter the second year: %d", year2);
      
        // Initialise the structure with first date
        struct Date Date2 = { date2, month2, year2 };
      
        printf("\nThe given dates are: ");
      
        // Comparing the Dates
        if (Date1.date == Date2.date
            && Date1.month == Date2.month
            && Date1.year == Date2.year) {
            printf("Equal");
        }
        else {
            printf("Unequal");
        }
      
        return 0;
    }
    

    输出:

    Enter the first date: 10
    Enter the first month: 11
    Enter the first year: 2018
    Enter the second date: 10
    Enter the second month: 11
    Enter the second year: 2018
    The given dates are: Equal
    

    4在以下内容上写上简短的注释(任意两个):

  • (i)具有推入和弹出操作的堆栈堆栈是线性数据结构,遵循执行操作的特定顺序。顺序可以是LIFO(后进先出)或FILO(后进先出)。

    主要在堆栈中执行以下三个基本操作:

    • 推送:在堆栈中添加一个项目。如果堆栈已满,则称其为溢出条件。
    • 弹出:从堆栈中删除一个项目。这些项目以推入的相反顺序弹出。如果堆栈为空,则称其为下溢条件。
    • 窥视或顶部:返回堆栈的顶部元素。
    • isEmpty:如果堆栈为空,则返回true,否则返回false。

    堆

    如何实际理解堆栈?
    有许多现实生活中的堆栈示例。考虑一下在食堂中相互堆叠的盘子的简单示例。位于顶部的板是第一个要卸下的板,即,已放置在最底部位置的板在堆栈中保留的时间最长。因此,可以简单地看出它遵循LIFO / FILO命令。

    堆栈上操作的时间复杂度:

    push(),pop(),isEmpty()和peek()都花费O(1)的时间。在任何这些操作中,我们都不会运行任何循环。

    堆栈的应用:

    • 符号平衡
    • 后缀/前缀转换的中缀
    • 在许多地方都可以重做-撤消功能,例如编辑器,photoshop。
    • Web浏览器中的前进和后退功能
    • 用于许多算法,例如河内塔,树木遍历,股票跨度问题,直方图问题。
    • 其他应用程序可以是回溯,骑士之旅问题,迷宫中的老鼠,N皇后问题和数独求解器
    • 在图算法中,例如拓扑排序和强连接的组件

    执行:
    有两种方法可以实现堆栈:

    • 使用数组
    • 使用链表

    使用数组实现堆栈

    // C program for array implementation of stack
    #include 
    #include 
    #include 
      
    // A structure to represent a stack
    struct Stack {
        int top;
        unsigned capacity;
        int* array;
    };
      
    // function to create a stack of given capacity. It initializes size of
    // stack as 0
    struct Stack* createStack(unsigned capacity)
    {
        struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
        stack->capacity = capacity;
        stack->top = -1;
        stack->array = (int*)malloc(stack->capacity * sizeof(int));
        return stack;
    }
      
    // Stack is full when top is equal to the last index
    int isFull(struct Stack* stack)
    {
        return stack->top == stack->capacity - 1;
    }
      
    // Stack is empty when top is equal to -1
    int isEmpty(struct Stack* stack)
    {
        return stack->top == -1;
    }
      
    // Function to add an item to stack.  It increases top by 1
    void push(struct Stack* stack, int item)
    {
        if (isFull(stack))
            return;
        stack->array[++stack->top] = item;
        printf("%d pushed to stack\n", item);
    }
      
    // Function to remove an item from stack.  It decreases top by 1
    int pop(struct Stack* stack)
    {
        if (isEmpty(stack))
            return INT_MIN;
        return stack->array[stack->top--];
    }
    // Driver program to test above functions
    int main()
    {
        struct Stack* stack = createStack(100);
      
        push(stack, 10);
        push(stack, 20);
        push(stack, 30);
      
        printf("%d popped from stack\n", pop(stack));
      
        return 0;
    }
    
  • (ii)链表:链表与数组一样,是线性数据结构。与数组不同,链接列表元素不存储在连续位置;元素使用指针链接。

    链表

    为什么要链接列表?
    数组可用于存储相似类型的线性数据,但是数组具有以下限制。
    1)数组的大小是固定的:因此,我们必须提前知道元素数量的上限。而且,通常,所分配的存储器与用途无关而等于上限。
    2)在元素数组中插入新元素非常昂贵,因为必须为新元素创建空间,并且要创建空间,必须移动现有元素。

    例如,在系统中,如果我们在ID []数组中维护ID的排序列表。

    id [] = [1000,1010,1050,2000,2040]。

    如果要插入新的ID 1005,则要保持排序顺序,我们必须将所有元素都移到1000(不包括1000)之后。
    除非使用某些特殊技术,否则删除数组也很昂贵。例如,要删除id []中的1010,必须移动1010之后的所有内容。

    相对于阵列的优势
    1)动态尺寸
    2)易于插入/删除

    缺点:
    1)不允许随机访问。我们必须从第一个节点开始顺序访问元素。因此,我们无法使用其默认实现对链接列表进行有效的二进制搜索。在这里阅读。
    2)列表的每个元素都需要用于指针的额外存储空间。
    3)不适合缓存。由于数组元素是连续的位置,因此存在引用位置,而在链接列表的情况下则不存在。

    表示:
    链接列表由指向链接列表的第一个节点的指针表示。第一个节点称为头。如果链表为空,则head的值为NULL。
    列表中的每个节点至少由两部分组成:
    1)资料
    2)指向下一个节点的指针(或引用)
    在C语言中,我们可以使用结构表示节点。下面是一个带有整数数据的链表节点的示例。

    // A linked list node
    struct Node {
        int data;
        struct Node* next;
    };
    
  • (iii)命令行参数: C / C++最重要的函数是main()函数。它主要是用int的返回类型定义的,并且没有参数:
    int main() { /* ... */ } 
    

    我们还可以在C和C++中提供命令行参数。在操作系统的命令行外壳程序中,在程序名称之后给出命令行参数。
    为了传递命令行参数,我们通常使用两个参数定义main():第一个参数是命令行参数的数量,第二个是命令行参数的列表。

    int main(int argc, char *argv[]) { /* ... */ }
    

    或者

    int main(int argc, char **argv) { /* ... */ }
    
    • argc(ARGument Count)为int,存储用户传递的命令行参数数量,包括程序名称。因此,如果我们将值传递给程序,则argc的值为2(一个用于参数,一个用于程序名称)
    • argc的值应为非负数。
    • argv(ARGument Vector)是列出所有参数的字符指针数组。
    • 如果argc大于零,则从argv [0]到argv [argc-1]的数组元素将包含指向字符串的指针。
    • Argv [0]是程序的名称,之后,直到argv [argc-1]为止,每个元素都是命令行参数。

    5. C中有哪些不同的文件打开模式。假设一个文件包含学生的记录,而每个记录都包含一个学生的姓名和年龄。编写一个C程序来读取这些记录,并按名称按顺序显示它们。

  • C中的文件打开模式:
    • “ r” –搜索文件。如果文件成功打开,则fopen()将其加载到内存中并设置一个指向其中第一个字符的指针。如果无法打开文件,则fopen()返回NULL。
    • “ w” –搜索文件。如果文件存在,其内容将被覆盖。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
    • “ a” –搜索文件。如果文件成功打开,则fopen()将其加载到内存中并设置一个指向文件中最后一个字符的指针。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
    • “ r +” –搜索文件。如果成功打开,则fopen()将其加载到内存中并设置一个指向其中第一个字符的指针。如果无法打开文件,则返回NULL。
    • “ w +” –搜索文件。如果文件存在,其内容将被覆盖。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
    • “ a +” –搜索文件。如果文件成功打开,则fopen()将其加载到内存中并设置一个指向文件中最后一个字符的指针。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。

    C程序读取这些记录并按名称将其显示在排序的顺序中:

    // C program to read Student records 
    // like id, name and age, 
    // and display them in sorted order by Name 
      
    #include  
    #include  
    #include  
      
    // 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; 
    } 
    

    输出:

    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