转眼间,大半个学期过去了,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,使我们在忘记的时候,及时查看。方法虽然简单,但很实用!
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |