C语言学习初次体会

发表于:2007-07-14来源:作者:点击数: 标签:
C语言学习初次体会: 转眼间,大半个学期过去了,c语言的学习也过了一段时间。有时候,由于兴趣,自己在课堂上乱划,一道小程序便出来了,但是,要是不幸运的话,逻辑有毛病,抑或是语句出现问题,在电脑面前一坐便是几个小时了! 随着时间的流逝,我对C语言
C语言学习初次体会:

                                                                          

转眼间,大半个学期过去了,c语言的学习也过了一段时间。有时候,由于兴趣,自己在课堂上乱划,一道小程序便出来了,但是,要是不幸运的话,逻辑有毛病,抑或是语句出现问题,在电脑面前一坐便是几个小时了!

随着时间的流逝,我对C语言的理解和感悟也积攒了不少!

首先是数组的学习,给我带来了不少烦恼。但是说起数组来,它贯穿于我们整个c语言之中,我们经常要用它来存储数据。编写图形要用它来储存坐标数据,编写音乐要用它来储存音符乐谱,即使学生的成绩也要用到它来储存……但是,如果我们在利用它的时候,不好好注意,将被弄得眼花缭乱!我们在利用它来处理数据的时候,涉及到的排序,找最大,最小值这些问题。特别是排序,方法挺多,但如果不把握住几种常用的方法,使用数组就变得非常不便。常用的方法中,有冒泡排序,选择排序,希尔排序,快速排序等方法:选择法排序,与冒泡法排序都是利用for循环语句,前者是先寻找出最大最小值的下标,然后再交换,后者则是利用相邻间元素的比较大小,不符合要求顺序的就交换,这样一级一级地向上交换,把最大的或者最小的放到最上面去;对于后两种办法排序,都利用到循环次数不确定的while和do-while语句,前者还利用到for语句,希尔排序利用一一对应比较的办法,后者利用数组中其它元素与中间数进行比较大小,然后实行交换。

这是冒泡法的程序:

#include<stdio.h>

void sort(int array[],int size)

{

int i,j,temp;

/*下面是利用相邻的比较,把大的数放到上面;*/

for(i=0;i<size-1;i++)

        for(j=i+1;j<size;j++)

               if(array[i]>array[j])

               {

                      temp=array[i];

                      array[i]=array[j];

                      array[j]=temp;

               }

}

void main()

{

int i;

int a[10]={1,33,78,34,787,213,132,35,32,21};

sort(a,10);

for(i=0;i<10;i++)

        printf("%6d",a[i]);

}

这是选择法的程序:

#include<stdio.h>

void sort(int array[],int size)

{

int i,j,k,temp;

for(i=0;i<size-1;i++)

{

        k=i;

/*把最小的那一个数找出来,并且用a[k]记下来,然后与a[i]交换;*/

        for(j=i+1;j<size;j++)

               if(array[k]>array[j])

                      k=j;

        temp=array[k];

        array[k]=array[i];

        array[i]=temp;

}

}

void main()

{

int a[]={12,43,54,23,32,65,87,2,34,54};

int i;

sort(a,10);

for(i=0;i<10;i++)

        printf("%d\t",a[i]);

}

这是一个快速排序的程序:

#include<stdio.h>

void quick_sort(int array[],int first,int last)//first,last分别为数组下标的范围;

{

int temp,low,high,list_separator;

low=first;

high=last;

/*下面是比较数组中的大小,把数组中的数与中间数比较,大的放在后半部分,比中间数小的放在前半部分,*/

    list_separator=array[(first+last)/2];//中间数;

do{

        while(array[low]<list_separator)//中间数与前半部分比较;

               low++;

        while(array[high]>list_separator)// 中间数与后半部分比较;

               high--;

        if(low<=high)//前半部分与后半部分交换;

        {

               temp=array[low];

               array[low++]=array[high];

               array[high--]=temp;

        }

}while(low<=high);

if(first<high)

        quick_sort(array,first,high);//利用递归的办法,实行循环;

if(low<last)

        quick_sort(array,low,last);//利用递归的办法,实行循环;

}

 

void main()

{

int a[9]={12,23,34,65,93,32,21,9,8};

quick_sort(a,0,8);

for(int i=0;i<9;i++)

        printf("%d\t",a[i]);

printf("\n");

}

这是一个希尔排序的程序:

#include<stdio.h>

void shell_sort(int array[],int size)

{

int temp,gap,i,flag;

gap=size/2;

do{

        do{

               flag=0;/*利用标记,使前半部分与后半部分的数都对应比较过,前半部分大于后半部分的交换,直到都比较过,并且前半部分的数小于与前部分一一对应的后部分的数时,退出while循环*/

               for(i=0;i<size-gap;i++)

                      if(array[i]>array[i+gap])

                      {

                             temp=array[i];

                             array[i]=array[i+gap];

                             array[i+gap]=temp;

                          flag=1;

                      }

        }while(flag);

}while(gap=gap/2);

}

void main()

{

int array[]={1,2,32,43,64,7654,321,42,23,97,56,32,78,45,32},i;

shell_sort(array,15);

for(i=0;i<15;i++)

        printf("%10d",array[i]);

}

对于后面两个程序与前面用for语句排序来比较,while与do-while语句运行起来比较快,并且没有for语句那样的毛病,运行量大的时候可能会出错。比如说,从1循环到10000那么大的时候,冒泡法与选择法就有可能会出错了,希尔排序只减少了一部分的运行量,但并不是很完善,快速排序法完全脱离for语句的使用,对于运行量大的循环是没有问题的了,但只能够用来排序,不能够找出最值,若要找最值来的话,只好选择选择法。

其次,我们在学习数组的时候,还要考虑数组的输出和输入,但这都与循环语句for打交道,通常情况下,是几维数组就用几个for循环语句。但我们在不确定数组的范围是多少时,我们可以先用宏定义来定义数组的范围,然后再由用户确定。但一定要先定义才能使用,因为c语言中,大部分的变量,都遵守着先定义后使用的原则(对于语句则是先声明后使用)。数组在存储字符串的时候,又涉及到专门的语句使用,如gets(),puts()输入输出语句,还有赋值时,就不能用等号赋值了,而用到strcpy()语句等等(将来在c++中或许可以考虑使用运算符重载)。总之,数组的使用,可以与指针的结合(但指针并不是万能的,有利也有弊,用得不好,有可能导致系统瘫痪),那样运用起来会更加简便,特别是在字符串那一部分,需要用到二维数祖时,利用指针可以先取下字符串的首地址,然后就可以访问整个字符串了,这样可以解决函数返回值一个值的问题。

另外,如果我们有兴趣的话,可以接触一些图形的编辑。但图形编辑是离不开我们所学的基本内容。不过在学之前,我们得先做点准备。c语言图形编辑程序是在dos的环境之下运行的,但一般未经设置的编辑器是不能调用graphics.h的头文件的,我们可以按照以下途径设置:打开编辑器(c语言编辑不能用vc来编辑图形),选择途径:options\\Linker\\Libraries……然后在Graphics library上打上“x”即可!这是TC的一种设置办法,但对于其他的编辑器也是差不多的。在开始编辑图形时,要进行图形的初始化,也要对他进行一些设置,比如说,我们在D盘的根目录下装了一个TC,那么我们在初始化时设置为:initgraph(&gdriver,&gmode,”d:\\tc\\bgi”);这样就可以利用图形编辑了。有一个经验就是在编辑图形的时候,我们会经常用到一个输入函数getch(),头文件是conio.h,它是一个非缓冲式字符输入的操作,不显示输入的内容。在c语言的编辑中,它提供了很多的图形编辑工具,都在头文件graphics.h里面,如果要编辑的话都可以找出来查看学习。

最后,我觉得在编译的时候,很重要的一个查看函数头文件的帮助方法,就是Ctrl+F1,使我们在忘记的时候,及时查看。方法虽然简单,但很实用!

原文转自:http://www.ltesting.net