论文下载链接:论文|学期1 | 2016-17
时间: 3小时
总分数:100
注意:-
- 共分为三个部分。 A节为20分, B节为30分, C节为50分。
- 尝试所有问题。每个问题都带有标记。
- 必要时假定合适的数据。
2.尝试任何五个问题:(5 * 10 = 50)
a)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
}
流程图:
例子:
// 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
a)ii)什么是递归?用C编写一个程序来生成斐波那契数列。
函数直接或间接调用自身的过程称为递归,而相应的函数称为递归函数。使用递归算法,可以很容易地解决某些问题。此类问题的示例包括河内塔(TOH),有序/预购/后继树遍历,图的DFS等。
递归的基本条件?
在递归程序中,提供了基本情况的解决方案,并且以较小的问题表示较大的问题。
int fact(int n)
{
if (n < = 1) // base case
return 1;
else
return n*fact(n-1);
}
在上面的示例中,定义了n <= 1的基本情况,并且可以通过转换为较小的1直到达到基本情况来解决较大的数值。
用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
b)i)区分以下各项:
- 实际参数和形式参数:
- 形式参数:在函数或方法的原型中出现的变量及其类型。
- 实际参数:与在调用环境中的函数或方法调用中出现的形式参数相对应的变量或表达式。
- 全局变量和外部变量
- 顾名思义,可以从程序的任何部分访问全局变量。
- 在整个程序的生命周期内都可以使用它们。
- 它们在所有功能或块之外的程序顶部声明。
- 声明全局变量:全局变量通常在程序顶部的所有函数和块之外声明。可以从程序的任何部分访问它们。
- extern:Extern存储类仅告诉我们该变量是在其他位置定义的,而不是在使用该变量的同一个块中定义的。基本上,该值是在另一个块中分配给它的,也可以在另一个块中对其进行覆盖/更改。因此,extern变量不过是一个全局变量,该变量在声明有合法值的情况下进行了初始化,以便在其他地方使用。可以在任何函数/块中访问它。同样,也可以通过在任何函数/块的声明/定义之前将“ extern”关键字放置在普通全局变量中,将其设置为外部变量。这基本上表示我们不是在初始化新变量,而是仅在使用/访问全局变量。使用外部变量的主要目的是可以在大型程序的两个不同文件之间访问它们。有关外部变量如何工作的更多信息,请查看此链接。
- 顾名思义,可以从程序的任何部分访问全局变量。
b)ii)用简洁的框图描述计算机的基本组件。
数字计算机:数字计算机可以定义为可编程机器,它可以读取作为指令传递的二进制数据,处理该二进制数据并显示计算出的数字输出。因此,数字计算机就是那些处理数字数据的计算机。
数字计算机功能部件的详细信息
- 输入单元:输入单元由连接到计算机的输入设备组成。这些设备接受输入并将其转换为计算机可以理解的二进制语言。一些常见的输入设备是键盘,鼠标,操纵杆,扫描仪等。
- 中央处理器(CPU0:输入设备将信息输入计算机后,处理器对其进行处理。CPU被称为计算机的大脑,因为它是计算机的控制中心。它首先从内存中获取指令,然后从计算机中获取指令。然后解释它们以便知道要做什么。如果需要,则从内存或输入设备中获取数据,然后CPU执行或执行所需的计算,然后将输出存储或显示在输出设备上,CPU具有三个负责不同功能的主要组件-算术逻辑单元(ALU),控制单元(CU)和存储器寄存器
- 算术和逻辑单元(ALU):顾名思义,ALU执行数学计算并做出逻辑决策。算术计算包括加法,减法,乘法和除法。逻辑决策涉及两个数据项的比较,以查看哪个数据项更大或更小或相等。
- 控制单元:控制单元负责协调和控制流入和流出CPU的数据流,还控制ALU,存储器寄存器以及输入/输出单元的所有操作。它还负责执行程序中存储的所有指令。它解码获取的指令,对其进行解释,然后将控制信号发送到输入/输出设备,直到所需的操作由ALU和内存正确完成为止。
- 内存寄存器:寄存器是CPU中的临时内存单元。这些用于存储处理器直接使用的数据。寄存器的大小可以不同(16位,32位,64位等),CPU内部的每个寄存器都有特定的函数,例如存储数据,存储指令,在存储器中存储位置地址等。用户寄存器可以由汇编语言程序员用来存储操作数,中间结果等。累加器(ACC)是ALU中的主要寄存器,包含要在ALU中执行的操作的操作数之一。
- 内存:附属于CPU的内存用于存储数据和指令,称为内部存储器。内部存储器分为许多存储位置,每个位置都可以存储数据或指令。每个存储单元的大小均相同,并具有一个地址。借助该地址,计算机可以轻松读取任何内存位置,而不必搜索整个内存。当程序被执行时,它的数据被复制到内部存储器中,并且被存储在存储器中直到执行结束。内部存储器也称为主存储器或主存储器。该存储器也称为RAM,即随机存取存储器。数据访问的时间与其在存储器中的位置无关,因此,该存储器也称为随机访问存储器(RAM)。阅读此文章以了解不同类型的RAM
- 输出单元:输出单元由计算机附带的输出设备组成。它将来自CPU的二进制数据转换为人类可以理解的形式。常见的输出设备是监视器,打印机,绘图仪等。
c)i)动态内存分配是什么意思?详细解释malloc()和calloc()函数。
C中的动态内存分配:可以定义为在运行时更改数据结构(如Array)大小的过程。
C提供了一些功能来完成这些任务。 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,
c)ii)编写一个程序,将两个3 * 3的矩阵相乘,并将结果存储在另一个矩阵中。
// 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
d)转换以下数字:
(i)(10101011101.011) 2 =() 16
=(55D.6) 16
(ii)(916.125) 10 =() 4
=(32110.02) 4
(iii)(123) 10 =() 2
=(1111011) 2
(iv)(574.32) 8 =() 2
=(101111100.01101) 2
(v)(1011.10) 2 =() 10
=(11.5) 10
e)i)编写一个程序以打印从1到300的所有素数。
// C program to check if a
// number is prime
#include
int main()
{
int n = 1, i, flag = 1;
for (n = 1; n <= 300; n++) {
flag = 1;
// Iterate from 2 to n/2
for (i = 2; i <= n / 2; i++) {
// If n is divisible by any number between
// 2 and n/2, it is not prime
if (n % i == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
printf("\n%d is a prime number", n);
}
}
return 0;
}
1 is a prime number
2 is a prime number
3 is a prime number
5 is a prime number
7 is a prime number
11 is a prime number
13 is a prime number
17 is a prime number
19 is a prime number
23 is a prime number
29 is a prime number
31 is a prime number
37 is a prime number
41 is a prime number
43 is a prime number
47 is a prime number
53 is a prime number
59 is a prime number
61 is a prime number
67 is a prime number
71 is a prime number
73 is a prime number
79 is a prime number
83 is a prime number
89 is a prime number
97 is a prime number
101 is a prime number
103 is a prime number
107 is a prime number
109 is a prime number
113 is a prime number
127 is a prime number
131 is a prime number
137 is a prime number
139 is a prime number
149 is a prime number
151 is a prime number
157 is a prime number
163 is a prime number
167 is a prime number
173 is a prime number
179 is a prime number
181 is a prime number
191 is a prime number
193 is a prime number
197 is a prime number
199 is a prime number
211 is a prime number
223 is a prime number
227 is a prime number
229 is a prime number
233 is a prime number
239 is a prime number
241 is a prime number
251 is a prime number
257 is a prime number
263 is a prime number
269 is a prime number
271 is a prime number
277 is a prime number
281 is a prime number
283 is a prime number
293 is a prime number
e)ii)通过键盘输入任何年份。编写程序以确定该年份是否为a年。
// C program to check if a given
// year is leap year or not
#include
#include
bool checkYear(int year)
{
// If a year is multiple of 400,
// then it is a leap year
if (year % 400 == 0)
return true;
// Else If a year is multiple of 100,
// then it is not a leap year
if (year % 100 == 0)
return false;
// Else If a year is multiple of 4,
// then it is a leap year
if (year % 4 == 0)
return true;
return false;
}
// driver code
int main()
{
int year;
// Get the year
printf("Enter the year: ");
scanf("%d", &year);
printf("%d", year);
// Check if year is leap year
checkYear(year)
? printf("\nLeap Year")
: printf("\nNot a Leap Year");
return 0;
}
Enter the year: 2018
Not a Leap Year
f)参数传递是什么意思?通过示例讨论C中各种类型的参数传递机制。在运行时将值分配给函数定义中定义的变量称为参数传递。参数数据可以通过不同的方法传入和传出方法和函数。让我们假设从另一个函数A()调用了函数B () 。在这种情况下, A被称为“呼叫者函数”,而B被称为“被呼叫函数或被调用者函数” 。同样, A发送给B的参数称为实际参数,而B的参数称为形式参数。
参数传递的重要方法
- 按值传递:此方法使用模式内语义。对形式参数所做的更改不会传输回调用方。对被调用函数或方法内部的形式参数变量的任何修改仅影响单独的存储位置,并且不会反映在调用环境中的实际参数中。此方法也称为按值调用。
// 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严格按值调用。
缺点:- 存储分配效率低下
- 对于对象和数组,复制语义是昂贵的
- 通过引用传递(别名):此技术使用输入/输出模式语义。对形式参数所做的更改确实会通过参数传递回传给调用者。形式参数的任何更改都会反映在调用环境中的实际参数中,因为形式参数会收到对实际数据的引用(或指针)。此方法也称为通过引用调用< 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
g)i)用C定义数据类型。根据占用的内存,格式说明符和范围讨论原始数据类型。 C中的每个变量都有一个关联的数据类型。每种数据类型需要不同数量的内存,并具有一些可以在其上执行的特定操作。让我们对它们进行一个简短的描述:
以下是C中使用的一些非常常见的数据类型的示例:
- char: C语言中最基本的数据类型。它存储一个字符,并且几乎在所有编译器中都需要一个字节的内存。
- int:顾名思义,int变量用于存储整数。
- float:用于存储单精度十进制数(带浮点值的数字)。
- double:用于存储双精度精度的十进制数字(带浮点值的数字)。
不同的数据类型还可以存储数字的范围也不同。这些范围可能因编译器而异。以下是32位gcc编译器上的范围以及内存要求和格式说明符的列表。
Data Type Memory (bytes) Range Format Specifier short int 2 -32, 768 to 32, 767 %hd unsigned short int 2 0 to 65, 535 %hu unsigned int 4 0 to 4, 294, 967, 295 %u int 4 -2, 147, 483, 648 to 2, 147, 483, 647 %d long int 4 -2, 147, 483, 648 to 2, 147, 483, 647 %ld unsigned long int 4 0 to 4, 294, 967, 295 %lu long long int 8 -(2^63) to (2^63)-1 %lld unsigned long long int 8 0 to 18, 446, 744, 073, 709, 551, 615 %llu signed char 1 -128 to 127 %c unsigned char 1 0 to 255 %c float 4 %f double 8 %lf long double 12 %Lf g)ii)编写程序以打印以下图案:
A AB ABC ABCD ABCDE ABCDEF
#include
int main() { char ch = 'A'; int i, j; for (i = 0; i < 5; i++) { for (j = 0; j <= i; j++) { printf("%c", ch + j); } printf("\n"); } return 0; } 输出:A AB ABC ABCD ABCDE
h)列出C中的各种文件操作和模式。编写一个程序,将内容从一个文件复制到另一个文件。
C中的文件打开模式:- “ r” –搜索文件。如果文件成功打开,则fopen()将其加载到内存中并设置一个指向其中第一个字符的指针。如果无法打开文件,则fopen()返回NULL。
- “ w” –搜索文件。如果文件存在,其内容将被覆盖。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
- “ a” –搜索文件。如果文件成功打开,则fopen()将其加载到内存中并设置一个指向文件中最后一个字符的指针。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
- “ r +” –搜索文件。如果成功打开,则fopen()将其加载到内存中并设置一个指向其中第一个字符的指针。如果无法打开文件,则返回NULL。
- “ w +” –搜索文件。如果文件存在,其内容将被覆盖。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
- “ a +” –搜索文件。如果文件成功打开,则fopen()将其加载到内存中并设置一个指向文件中最后一个字符的指针。如果该文件不存在,则会创建一个新文件。如果无法打开文件,则返回NULL。
C程序将一个文件的内容复制到另一个文件:
#include
#include // For exit() int main() { FILE *fptr1, *fptr2; char filename[100], c; printf("Enter the filename to open for reading \n"); scanf("%s", filename); // Open one file for reading fptr1 = fopen(filename, "r"); if (fptr1 == NULL) { printf("Cannot open file %s \n", filename); exit(0); } printf("Enter the filename to open for writing \n"); scanf("%s", filename); // Open another file for writing fptr2 = fopen(filename, "w"); if (fptr2 == NULL) { printf("Cannot open file %s \n", filename); exit(0); } // Read contents from file c = fgetc(fptr1); while (c != EOF) { fputc(c, fptr2); c = fgetc(fptr1); } printf("\nContents copied to %s", filename); fclose(fptr1); fclose(fptr2); return 0; } 输出:Enter the filename to open for reading Cannot open file
输出:
Enter the filename to open for reading a.txt Enter the filename to open for writing b.txt Contents copied to b.txt