论文下载链接:论文|第二学期| 2016-17
时间: 3小时
总分数:100
注意:-
- 共分为三个部分。 A节为20分, B节为30分, C节为50分。
- 尝试所有问题。每个问题都带有标记。
- 必要时假定合适的数据。
2.尝试以下五个问题中的任何一个:(5 * 10 = 50)
- 什么是数字计算机?还详细说明了数字计算机的框图。
数字计算机:数字计算机可以定义为可编程机器,它可以读取作为指令传递的二进制数据,处理该二进制数据并显示计算出的数字输出。因此,数字计算机就是那些处理数字数据的计算机。
数字计算机功能部件的详细信息
- 输入单元:输入单元由连接到计算机的输入设备组成。这些设备接受输入并将其转换为计算机可以理解的二进制语言。一些常见的输入设备是键盘,鼠标,操纵杆,扫描仪等。
- 中央处理器(CPU0:输入设备将信息输入计算机后,处理器对其进行处理。CPU被称为计算机的大脑,因为它是计算机的控制中心。它首先从内存中获取指令,然后从计算机中获取指令。然后解释它们以便知道要做什么。如果需要,则从内存或输入设备中获取数据,然后CPU执行或执行所需的计算,然后将输出存储或显示在输出设备上,CPU具有三个负责不同功能的主要组件-算术逻辑单元(ALU),控制单元(CU)和存储器寄存器
- 算术和逻辑单元(ALU):顾名思义,ALU执行数学计算并做出逻辑决策。算术计算包括加法,减法,乘法和除法。逻辑决策涉及两个数据项的比较,以查看哪个数据项更大或更小或相等。
- 控制单元:控制单元负责协调和控制流入和流出CPU的数据流,还控制ALU,存储器寄存器以及输入/输出单元的所有操作。它还负责执行程序中存储的所有指令。它解码获取的指令,对其进行解释,然后将控制信号发送到输入/输出设备,直到所需的操作由ALU和内存正确完成为止。
- 内存寄存器:寄存器是CPU中的临时内存单元。这些用于存储处理器直接使用的数据。寄存器的大小可以不同(16位,32位,64位等),CPU内部的每个寄存器都有特定的函数,例如存储数据,存储指令,在存储器中存储位置地址等。用户寄存器可以由汇编语言程序员用来存储操作数,中间结果等。累加器(ACC)是ALU中的主要寄存器,包含要在ALU中执行的操作的操作数之一。
- 内存:附属于CPU的内存用于存储数据和指令,称为内部存储器。内部存储器分为许多存储位置,每个位置都可以存储数据或指令。每个存储单元的大小均相同,并具有一个地址。借助该地址,计算机可以轻松读取任何内存位置,而不必搜索整个内存。当程序被执行时,它的数据被复制到内部存储器中,并且被存储在存储器中直到执行结束。内部存储器也称为主存储器或主存储器。该存储器也称为RAM,即随机存取存储器。数据访问的时间与其在存储器中的位置无关,因此,该存储器也称为随机访问存储器(RAM)。阅读此文章以了解不同类型的RAM
- 输出单元:输出单元由计算机附带的输出设备组成。它将来自CPU的二进制数据转换为人类可以理解的形式。常见的输出设备是监视器,打印机,绘图仪等。
- 编写一个计算整数位数之和的程序。例如,数字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
- 编写一个程序,以相反的顺序将一个数组的内容复制到另一个数组中。
#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
- 什么是操作系统?还定义操作系统的类型和功能。操作系统–定义:
- 操作系统是控制应用程序执行的程序,并充当计算机用户和计算机硬件之间的接口。
- 更为常见的定义是,操作系统是始终在计算机上运行的一个程序(通常称为内核),而其他所有程序都是应用程序。
- 操作系统与资源和服务(例如内存,处理器,设备和信息)的分配有关。操作系统相应地包括用于管理这些资源的程序,例如流量控制器,调度程序,内存管理模块,I / O程序和文件系统。
操作系统的功能–操作系统执行三个功能:
- 便利性: OS使计算机更易于使用。
- 效率: OS允许高效使用计算机系统资源。
- 不断发展的能力:操作系统的构建方式应允许有效地开发,测试和引入新的系统功能,同时又不干扰服务。
操作系统类型–
- 批处理操作系统-计算机上程序中的作业序列,无需人工干预。
- 分时操作系统-允许许多用户共享计算机资源。(最大程度地利用资源)。
- 分布式操作系统-管理一组不同的计算机,使它们看起来像是一台计算机。
- 网络操作系统-在不同操作系统中运行的计算机可以参与公共网络(用于安全目的)。
- 实时操作系统–意味着可以按时完成的应用程序。
操作系统的示例是–
- Windows(基于GUI的PC)
- GNU / Linux(个人,工作站,ISP,文件和打印服务器,三层客户端/服务器)
- macOS(Macintosh),用于Apple的个人计算机和工作站(MacBook,iMac)。
- Android(用于智能手机/平板电脑/智能手表的Google操作系统)
- iOS(用于iPhone,iPad和iPod Touch的Apple操作系统)
- 编写一个程序以将两个矩阵相乘(从键盘上读取矩阵的大小和元素数)。
// 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
- 编写程序以升序对整数数组进行排序。
// 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
- 什么是字符串?还要说明不同的字符串函数。编写一个用户定义函数,以比较两个相同或不同的字符串。字符串定义为字符数组。字符数组和字符串之间的区别是字符串以特殊字符’\ 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头文件中。
- strlen : strlen()函数计算给定字符串的长度。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的内容。
- strncmp : std :: 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
- 定义指针的概念?还定义动态内存分配及其各种功能。指针是地址的符号表示。它们使程序能够模拟按引用调用以及创建和操纵动态数据结构。它在C / C++中的一般声明具有以下格式:
句法:
datatype *var_name; int *ptr; //ptr can point to an address which holds int data
如何使用指针?
- 定义一个指针变量
- 使用一元运算符(&)将变量的地址分配给指针,该运算运算符返回该变量的地址。
- 使用一元运算符(*)访问存储在地址中的值,该运算运算符返回位于其操作数指定的地址处的变量的值。
我们将数据类型与指针关联的原因是它知道数据存储在多少字节中。当我们增加一个指针时,我们将指针增加它所指向的数据类型的大小。
C中的动态内存分配:可以定义为在运行时更改数据结构(如Array)大小的过程。
C提供了一些功能来完成这些任务。 C在
头文件下定义了4个库函数,以促进C编程中的动态内存分配。他们是: - malloc()
- calloc()
- 自由()
- realloc()
让我们详细查看它们中的每一个。
-
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,
-
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,
-
自由()
“免费”方法用于动态取消分配内存。使用函数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.
-
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,