这是我当年实习的实习报告,写的不算好,当时数据结构没学好,不会用链表这些东西。
第一部分:基础问题
1.2
1.实验题目
17世纪法国数学家加斯帕在《数学的游戏问题》中讲的一个故事:n个教徒和n个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:2n个人围成一个圆圈,从第一个人开始依次循环报数,每数到第九个人就将他扔入大海,如此循环直到仅剩n个人为止 。问怎样的排法,才能使每次投入大海的都是非教徒。
2.需求分析
本演示程序用VC编写,完成从文件中输入任意的整数n,并把排好序的字符串输出到一个文件中。
① 输入的形式和输入值的范围:输入文件由一行构成,就是n的值。其中n是整数。
② 输出的形式:输出文件中是一行字符串,字符串由n个‘@’字符(代表教徒)和n个‘+’ 字符(代表非教徒)排列构成。该排列使得按照前面的约定每次投入大海的都是非教徒。
③ 程序所能达到的功能:完成从文件中输入任意的整数n,并把排好序的字符串输出到 一个文件中。该排列使得按照前面的约定每次投入大海的都是非教徒。
④ 测试数据:
输入文件中n=15,输出文件为@@@@+++++@@+@@@+@++@@+++@++@@+
3.概要设计
1)为了实现上述程序功能,需要定义一个数组:
2)本程序包含1个函数:
① 主函数main()
4.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法。
1) 数组类型
#define N 100
int A[N] ;
2) 主函数的主要操作伪码算法
首先从文件中读取n,然后在数组中赋值2*n个64(‘@’的ASCLL值为64)
for(z=0;z<m;z++)
A[z]=64;
然后对数组从头到尾遍历,除了‘+’每到第九个就赋值为34(‘+’的ASCLL值为34),直到赋了n个‘+’为止。
最后把数组中的值一一输出到文件中。
fp=fopen("b.txt","w");
for(z=0;z<m;z++)
fprintf(fp,"%c ",A[z]);
fclose(fp);
5.调试分析
在运行中主要遇到逻辑错误一步步的通过调试找出来。
6.使用说明
程序名为1.2.exe,运行环境为Windows。
在输入文件a.txt中存储一个整型n值。
程序执行完后会自动生成b.txt文件中有排好序的字符串。
7.测试结果
8.附录
源代码如下:
#include<stdio.h>
#define N 100
int main()
{
int i=1,j,z,v=0,g=1; //g表示需要投进海的非教徒,通过i来遍历到第九个人投海。
int n,m; //n表示教徒或者非教徒的人数,m来表示教徒和非教徒总数
FILE *fp;
fp=fopen("a.txt","r"); //打开一个a.txt文件用于只读
if(fp==NULL) return -1;
while(!feof(fp))
{
fscanf(fp,"%d",&n); //在文件中读取n的值
}
m=2*n;
fclose(fp); //读取完后关闭文件
int A[N];
for(z=0;z<m;z++) //对一个m大小的数组赋初值'@'
A[z]=64;
while(g<=n) //非教徒还没全部投海则继续,否则停止
{
for(j=v;j<=m-1&&i<=8;) //通过i来遍历到第九个人投海
{
if(A[j]==43) //如果A[j]=='+'时,j++
{
if(j==m-1) //如果A[j]=='+'&&j=m-1时,j=0从头开始遍历
j=-1;
j++;
}
elseif(j==m-1) //如果A[j]!='+'&&j==m-1,则j=0从头开始
{
i++;j=0;
}
else //如果A[j]!='+'&&j!=m-1,则i++,j++
{
i++;j++;
}
}
//当i到第九个时
if(i==9&&A[j]!=43) //当i到第九个且这个数是'@'
{
A[j]=43; //对其赋值'+'
if(j==m)
v=0;
else
v=j+1;
i=1;
g++;
}
else if(i==9&&A[j]==43) //当i到第九个且这个数是'+'
{
while(A[j+1]==43&&j<=28) //则一直往下查找是'@'时对其赋值
{
j++;
if(j==m)j=0;
}
A[++j]=43;
if(j==m)
v=0;
else
v=j+1;
i=1;
g++;
}
}
fp=fopen("b.txt","w"); //执行完后创建一个只写文件b.txt
for(z=0;z<m;z++)
fprintf(fp,"%c ",A[z]); //把数组中的字符串输出到文件b.txt中
fclose(fp); //执行完后关闭文件
return 0;
}
1.3
1.实验题目
我们要求找出具有下列性质数的个数(包含输入的自然数n)。先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数最高位数字的一半; 3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止。
2.需求分析
本演示程序用VC编写,完成题目要求输入一个自然数n,然后输出满足三个条件的数的个数。
①输入的形式和输入值的范围:自然数n,并使n<=1000。
②输出的形式:整数。
③程序所能达到的功能:输出满足条件的数的个数。
④测试数据:输入6
输出6
3.概要分析
1)为了实现上述程序功能,需要用一个while循环找出最高位数字和一个switch语句来进行求满足条件的数的个数:
2)本程序包含1个函数:
① 主函数main()
4.详细设计
实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法。
1)定义一个整型数N存放输入数据;
2)找出整型数N的最高位数字n
n=N;
while(n/10!=0)
{ n=n/10;}
3)当n=1时,求得满足条件的数有1;
当n=2时,求得满足条件的数有2,12;
当n=3时,求得满足条件的数有3,13;
当n=4时,求得满足条件的数有4,14,24,124;
当n=5时,求得满足条件的数有5,15,25,125;
……
所以有如下switch语句来求满足条件的个数
switch(n/2)
{
case 0:num+=0;break;
case 1:num+=1;break;
case 2:num+=3;break;
case 3:num+=5;break;
case 4:num+=9;break;
}
printf("%d\n",num+1);
5.调试分析
在调试过程中发现最高位2和3是同样的个数,所以后来在switch中把switch(n)改为了switch(n/2),大大简化的程序。
6.使用说明
程序名为1.3.exe,运行环境为Windows。程序执行后显示
请输入一个不大于1000的整数:
然后在光标出输入一个不大于1000且不以0开头(除了0)的数字,再按回车将会显示执行后的结果。
7.测试结果
8.附录
源代码如下:
#include<stdio.h>
int main()
{
int N,n,num=0; //N代表输入的值,num统计满足条件的个数并赋初值0
printf("请输入一个不大于1000的整数N\n");
scanf("%d",&N);
n=N;
while(n/10!=0) //找出最高位的数字
{ n=n/10;}
switch(n/2) //通过最高位的数字一半来分类处理
{
case 0:num+=0;break;
case 1:num+=1;break;
case 2:num+=3;break;
case 3:num+=5;break;
case 4:num+=9;break;
}
printf("%d\n",num+1); //输出满足条件的个数
return 0;
}
1.5
1.实验题目
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
2.需求分析
要求打印出一个不大于100阶的矩阵上三角形,且打印的数字由1开始的自然数。
(1) 输入的形式和输入值的范围:本题有多组数据,每组数据由一个正整数N组成。(N不大于100)
(2) 输出的形式:对于每一组数据,输出一个N行的蛇形矩阵。两组输出之间不要额外的空行。矩阵三角中同一行的数字用一个空格分开。行尾不要多余的空格。
(3) 程序所能达到的功能:完成一个蛇形矩阵的输出。
(4) 测试数据:输入5
输出 1 3 6 10 15
2 5 914
4 8 13
7 12
11
3.概要设计
为了实现上述程序功能,需要定义一个二维数组:
a[100][100];
本程序包含1个函数:
主函数main();
4.详细设计
实现概要设计中定义的所有数据类型,对每个操作给出伪码算法。对主程序写出伪码算法。
1)定义一个整型二维数组存放蛇形矩阵中的值
a[100][100];
2)通过while来控制多组数据输入
while(scanf("%d",&N))
3)由蛇形矩阵的规律从左下角往右上角的遍历有如下算法
s=1;
a[0][0]=s;
for(k=1;k<=N-1;k++)
for(i=k,j=0;i>=0,j<=k;i--,j++) //通过i--,j++来实现这个规律
{
a[i][j]=s+1;
s++;
}
4)给N阶蛇形矩阵输完值后再输出蛇形矩阵
for(i=0;i<N;i++)
{
for(j=0;j<g;j++)
{
if(j<g-1)
printf("%d ",a[i][j]);
else
printf("%d",a[i][j]);
}
printf("\n");
g--;
}
5.调试分析
一开始没有找出这个遍历顺序导致输出结果并不是要求的,后来进过深入的对问题的分析,再转化为简洁的一个二重循环就能遍历出蛇形矩阵。
6.使用说明
程序名为1.5.exe,运行环境为Windows。程序执行后显示
输入一个N,再回车将会输出一个N阶的蛇形矩阵。
再接着还可以输入N,直到输入0为止。
7.测试结果
8.附录
源代码如下:
#include<stdio.h>
intmain()
{
int s,N,i,j,k,a[100][100],g; //s用来存放自然数,定义了一个二维数组
while(scanf("%d",&N)) //控制多组数据测试,直到输入0为止
{
if(N==0) return 0; //如果输入值为0,则终止程序
else
{
s=1; //对自然数赋初值1
a[0][0]=s;
for(k=1;k<=N-1;k++) //通过二重循环来给蛇形矩阵随着s的增加来赋值
for(i=k,j=0;i>=0,j<=k;i--,j++) //通过k控制没次行的开始行数,i--,j++来//使从左下角到右上角的遍历;