试验报告(三)
分析功能
1.分析下列程序,说出程序的功能
#include <stdio.h>
int main()
{
int i;
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{
if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
printf("\n");
return 0;
}
计算并打印斐波那契数列的前20项。
2.分析下列程序,说出程序的功能
#include <stdio.h>
int main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{
printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("array b:\n");
for (i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
}
return 0;
}
将二维数组a的行和列互换后放到二维数组b中并打印。
3.请对程序填空输入一行字符,让其统计其中有多少个单词,单词之间用空格分隔开。
#include <stdio.h>
int main()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for (你需要在此填入一行代码)
if(c==' ') word=0;
else if(word==0)
{
word=1;
num++;
}
printf("There are %d words in this line.\n",num);
return 0;
}
应该在for循环中填入:i = 0; (c = string[i]) != '\0'; i++
编写程序
- 现有10个数:6, 9 ,12 , -7, 0, 3, 15, 3,19,-5,用冒泡法编写程序,将它们按由大到小的顺序排列出来
#include<stdio.h>
//设计冒泡排序函数
void bubble_sort(int arr[], int sz)
{
for (int i = 0; i < sz - 1; i++)
{
for (int j = 0; j < sz - 1 - i; j++)
{
if (arr[j] < arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
//主函数调用并打印排序后的数组
int main()
{
int arr[] = { 6, 9 ,12 , -7, 0, 3, 15, 3,19,-5 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
- 针对上述10个数,用选择法编写程序,将它们按由小到大的顺序排列出来
#include<stdio.h>
//设计选择排序函数
void selection_sort(int arr[], int sz)
{
int i, j;
for (i = 0; i < sz - 1; i++)
{
int min = i;
for (j = i + 1; j < sz; j++)
if (arr[j] < arr[min])
min = j;
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
//主函数调用实现
int main()
{
int arr[] = { 6, 9 ,12 , -7, 0, 3, 15, 3,19,-5 };
int sz = sizeof(arr) / sizeof(arr[0]);
selection_sort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
- 从键盘上输入一个4*3的整型数组,找出数组中的最小值及其在数组中的下标。
#include <stdio.h>
int main()
{
int a[4][3] = { 0 };
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d", &a[i][j]);
}
}
int row = 0, col = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (a[i][j] < a[row][col])
{
row = i;
col = j;
}
printf("该数组的最小的数是%d\n", a[row][col]);
printf("所处的位置为数组的第%d行第%d列\n", row + 1, col + 1);
return 0;
}
试验报告(四)
1.下面程序实现由键盘输入4个数,运行程序找出最大数,完善程序:
#include <stdio.h>
int main()
{ int max4(int a,int b,int c,int d);
int a,b,c,d,max;
printf("Please enter 4 interger numbers:");
scanf("%d %d %d %d",&a,&b,&c,&d);
max=max4(a,b,c,d);
printf("max=%d \n",max);
return 0;
}
int max4(int a,int b,int c,int d)
{ int max2(int a,int b);
int m;
m=max2(max2(max2(a,b),c),d); /* 仔细分析此行 */
return(m);
}
_________________ //声明函数
{
( );
}
填入程序应如下:
int max2(int a, int b)
{
return a > b ? a : b;
}
2.下面是一个函数递归调用的程序,请你画出每次函数调用过程示意图,说明最终结果是怎么产生的:
#include <stdio.h>
int main()
{ int age(int n);
printf("NO.5,age:%d\n",age(5)); //输出第4人的年龄
return 0;
}
int age(int n) //定义递归函数
{ int c;
if(n==1) // 如果n等于1
c=10; // 年龄为10
else // 如果n不等于1
{
k=age(n-1); // 年龄是前一人的年龄加2
C=k+2; //例如:第4人年龄是第3人年龄加2
}
return(c); // 返回年龄
}
main函数将n=5传给age函数,由于求解第五个人的年纪,需要第四个人的年纪,所以age函数有把n-1后传给age函数,一次类推,最后求出第一个人的年纪,然后将第一个人年纪依次往上传过去。递归=递推+回归
3.下面是一个能计算输入数n的阶层程序,其中包含函数的递归调用,请在//后面添加其实现功能的注释内容。
#include <stdio.h>
int main()
{ int fac(int n);
int n;
int y;
while(1) //n<2时重新输入
{ printf("input an integer number:");
scanf("%d",&n);
if(n<1)continue; //(1)
else break; //(2)
}
y=fac(n); //(3)
printf("%lld!=%d\n",n,y);
return 0;
}
int fac(int n)
{
int f;
if(n==0||n==1) f=1; //(4)
else f=fac(n-1)*n; //(5)
return(f);
}
(1)如果输入的n小于1,就跳过后面的内容继续进行循环(2)如果输入的n不小于1,直接跳出while循环
(3)调用自定义的fac函数
(4)如果n=0或者n=1,那么直接返回1
(5)如果n不为0和1,继续递归调用fac函数,返回值f为fac(n-1)的值乘n
试验报告(五)
1.有10个整数,使前面各数顺序向后移 5 个位置,最后 5 个数变成最前面 5 个数。写一函数实现以上功能
#include<stdio.h>
//写一个移动函数
void move(int str[], int n, int m)
{
int* p, str_end;
if (m > 0)
{
str_end = *(str + n - 1);
for (p = str + n - 1; p > str; p--)
*p = *(p - 1);
*p = str_end;
m--;
}
if (m > 0)
move(str, n, m); //递归
else
return ;
}
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("转换前:");
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
move(a, 10, 5);
printf("\n转换后:");
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
return 0;
}
2.写一函数,求一个字符串的长度。在 main 函数中输入字符串,并输出其长度。
#include<stdio.h>
int my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
p++;
return p - s;
}
int main()
{
char ch[30];
scanf("%s", &ch);
int a = my_strlen(ch);
printf("%d\n", a);
return 0;
}
3.写一函数,将一个 3×3 的整型矩阵转置
#include<stdio.h>
void move(int(*pa)[3])
{
int i, j, temp;
for (i = 0; i < 3; i++)
for (j = 0; j < i; j++)
{
temp = *(*(pa + i) + j);
*(*(pa + i) + j) = *(*(pa + j) + i);
*(*(pa + j) + i) = temp;
}
}
int main()
{
int a[3][3];
int temp;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
scanf("%d", &a[i][j]);
printf("转置前的数组为:\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
printf("%5d ", a[i][j]);
printf("\n");
}
move(a);
printf("转置后的数组为:\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
printf("%5d ", a[i][j]);
printf("\n");
}
return 0;
}
4.将 n 个数按输入时顺序的逆序排列,用函数实现。
#include<stdio.h>
void reverse(int* p, int n)
{
int temp;
int i;
for (i = 0; i <= n / 2; i++)
{
temp = *(p + i);
*(p + i) = *(p + n - 1 - i);
*(p + n - 1 - i) = temp;
}
}
int main()
{
int array[100];
int n = 0;
printf("输入元素个数:");
scanf("%d", &n);
printf("依次输入元素:\n");
for (int i = 0; i < n; i++)
{
scanf("%d", &array[i]);
}
reverse(array, n);
for (int i = 0; i < n; i++)
{
printf("%d ", array[i]);
}
return 0;
}