傍晚才开始写代码,貌似有点晚了,谁让昨天巴西1:7惨败德国,明天早上还有阿根廷VS荷兰,看好梅西,打算起来看直播,今晚看来又写不完这本C语言了,而且指针部分也不是很通,得好好看看。刚才细数了一下,暑假里要做的事还真多,感觉暑假刚开始就有点不够用了,这可怎么办好!算了,还是别这边打一炮,那边打一枪了,还不如好好地一件事一件事的做好,不仅效率高,而且也更有成就感。好了,废话不说了,接着上一篇开始写了。
17.Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动的过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序输出移动的步骤。
#include
#include
int main()
{
void hanoi(int n,char one,char two,char three);
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to moving %d diskes:\n",m);
hanoi(m,'A','B','C');
return 0;
}
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
这题其实不错啊,感觉到了递归的优势,如果不用递归还真想不出什么好方法可以这么简单。而且注意move函数并未真正移动盘子,而只是输出移盘的方案。
18.用选择法对数组中10个整数按由小到大排序。所谓选择法,就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。
#include
#include
int main()
{
void sort(int array[],int n);
int a[10],i;
printf("enter the array\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
sort(a,10);
printf("the sorted array: \n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
void sort(int array[],int n)
{
int i,j,k,t;
for(i=0;i
19.有一个一维数组,内放10个学生成绩,用全局变量写一个函数,求出平均分、最高分和最低分。
#include
#include
float Max=0,Min=0;
int main()
{
float average(float array[],int n);
float ave,score[10];
int i;
for(i=0;i<10;i++)
scanf("%f",&score[i]);
ave=average(score,10);
printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",Max,Min,ave);
return 0;
}
float average(float array[],int n)
{
int i;
float aver,sum=array[0];
Max=Min=array[0];
for(i=1;iMax) Max=array[i];
else if(array[i]
20.外部变量与部变量同名情况。(如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被屏蔽,即它不起作用)
#include
#include
int a=3,b=5;//a、b为外部变量
int main()
{
int max(int a,int b);//本行是函数申明,a和b为形参名
int a=8;//a为局部变量,主函数内为局部变量a作用域(a=8)
printf("%d\n",max(a,b));
return 0;
}
int max(int a,int b)
{
int c;
c=a>b?a:b;//a=8,b=5
return(c);
}
21.静态局部变量。
#include
#include
int main()
{
int f(int);
int a=2,i;
for(i=0;i<3;i++)
{
printf("%d",f(a));
}
return 0;
}
int f(int a)
{
auto int b=0;
static int c=3;
b=b+1;
c=c+1;
return(a+b+c);
}
22.输出1到5的阶乘值。(静态局部变量)
#include
#include
int main()
{
int fac(int n);
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fac(i));
return 0;
}
int fac(int n)
{
static int f=1;
f=f*n;
return(f);
}
23.使用寄存器变量。(C语言允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。寄存器变量用register声明。)(当今的优化编译系统能够识别使用频繁的变量,从而自动地将这些变量放在寄存器中,而不需要程序设计者指定。。。老谭你这不是在逗我么,既然系统自动会处理,你还说个毛线?!!)
#include
#include
int main()
{
long fac(long);
long i,n;
scanf("%ld",&n);
for(i=1;i<=n;i++)
printf("%ld!=%ld\n",i,fac(i));
return 0;
}
long fac(long n)
{
register long i,f=1;
for(i=1;i<=n;i++)
f=f*i;
return(f);
}
24.用extern声明外部变量,扩展它在程序文件中的作用域。
#include
#include
int main()
{
int max(int,int);
extern int A,B;
printf("%d\n",max(A,B));
return 0;
}
int A=13,B=-8;
int max(int x,int y)
{
int z;
z=x>y?x:y;
return(z);
}
P214页的条件编译,有空回过去看看,对于编译的调试阶段还是蛮有用处的。好了,到此为止把前九章都算打过一遍了,明天是第十章的指针了,得先把书上的好好看看,然后再打程序,这样效率比较高。今天其实没有什么收获啊,一天晃晃就过去了,唯一的收获算是写了篇日记,明确了暑假的任务,然后决定一本书一本书地看,而不是广撒网,这样反而捕不到鱼。