当前位置:天才代写 > tutorial > C语言/C++ 教程 > TC编程手册之二

TC编程手册之二

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:1019

副标题#e#

函数与数组.由于时间和精神有限,故不能像谭浩强谭老那样把C语言讲的细致入微, 但我想简朴易懂的讲授对初学者来说照旧有很大辅佐的.

函数:

险些所有的C语言课本都把函数部门单列一章, 可见函数在C语言中是十分重要的.当一位初学者试图编写一则上百行的措施时, 他会很快就被数不清的变量搞得晕头转向, 再看各条语句的逻辑干系, 恐怕连本身也看不懂了吧, 更不消说别人读你的措施了. 这时你所需要的就是把一个较大的措施分为若干个措施模块, 每一个模块实现一个特定的成果. 所有函数都是平行的, 即在界说函数时是相互独立的, 一个函数并不从属于另一个函数, 即函数不能嵌套界说. 就是这样一个一个平行干系的小模块, 将一个巨大的措施分生了多个简朴的小措施. 这样做可以使措施的层次越发的清晰, 不只利便了措施员的事情, 也便于其他人对措施的阅读.

从用户利用的角度看,函数有两种(以下援引谭老的话,欠盛情思,究竟谭老的履历要更富厚嘛^0^):

(1).尺度函数, 即库函数. 这是由系统提供的, 用户不必本身界说这些函数, 可以直接利用他们. 应该说明, 差异的C系统提供的库函数的数量和成果差异, 虽然有一些根基的函数是配合的.

(2).用户本身界说的函数, 用以办理用户的专门需要.

从函数的形式看,函数分两类:

(1).无参函数.譬喻:

printstar();
   print_message();
   main()
   {
     printstar();
     print_message();
     printstar();
   }
printstar()
   {
     printf("************\n");
   }
print_message()
   {
     printf("*green food*\n");
   }

运行功效如下:

************

* green food *

************

个中printstar和print_message都是无参函数.在挪用无参函数时,主调函数并不将数据传送给被挪用函数.无参函数可带回或不带回函数值.

(2)有参函数. 在挪用函数时,在主调函数与被调函数之间有数据通报. 也就是说主调函数可以将数据通报给被调函数利用, 被调函数的数据也可以传返来共主调函数利用. 譬喻:

  #include
   print_add();
   main()
   {
     printf("the add is: %d",print_add());
   }
   print_add()
   {
     int a=1, b=2, c;
     c=a+b;
     return c;
   }

运行功效如下:

the add is: 3

以上我们对函数有了大抵的相识, 下面我向各人先容一下形式参数和实际参数.

首先从界说入手, 形式参数即在界说函数时函数后头括弧中的变量名. 而实际参数则是指在主调函数中挪用一个函数时, 函数名后头括弧中的参数.(可以是一个表达式) 详细见下例:

  #include
   print_add(int, int);
   main()
   {
     int a, b, c;
     scanf("%d%d",&a,&b);
     c=print_add(a,b);
     printf("the add is :%d",c);//实际参数
   }
   print_add(int x, int y)//形式参数
   {
     int z;
     z=x+y;
     return(z);
   }

需要留意的几点问题:

(1) 实参可以是常量,变量, 或表达式, 但必需要有确切的值.

(2) 在被界说的函数中, 必需指定形参的范例.

(3) 形参加实参的范例应沟通或赋值兼容.

函数需要讲的对象尚有许多, 这里只是一个大略的先容. 尚有许多的内容没有涉及到, 推荐大有时间可以看看谭浩强的书. 关于函数部门谭老的书要比老Delitel写的有层次的多.(也许是翻译事情做的欠好)但愿各人在看了上面的文章后, 能有所辅佐. 有问题可以给我写信, 我的邮箱是:[email protected].


#p#副标题#e#

数组:

数组在C语言中也是十分重要的一部门, 要展开讲或许说上几天也没完, 所以这里我们只从一些基本观念入手, 阐明一些根基的问题.

数组等于一组相关的存储单位, 这些存储单位具有沟通的名字和数据范例. 要引用数组的某个特定的存储单位(元素)需要说明数组名和该特定元素在数组中的序号. 见下例:

  #include
   main()
   {
     int i, c [3] ={1,2,3};//可以在声明数组时初始化数组
     for(i=0;i<=2;i++)
     printf("%5d",c[i]);
   }

运行功效如下:

1 2 3

数组的声明问题: 数组占用内存空间. 措施员声明白数组元素的范例和个数后计较机才气为该数组保存符合的内存数量. 如上例中的int c[3] 即奉告计较机保存了3个整形元素的空间. 除了int 形外, 还可以把数组界说为其他数据范例, 如范例为char的数组可用来存储一个字符串. 在初始化数组时应留意, 初始化列表中的初始化值个数不能多于数组元素的个数.

预处理惩罚措施#define的用法: 先见下例:

#p#分页标题#e#

  #include
   #define SIZE 3//标记常量
   main()
   {
     int i, c [SIZE];
     for(i=0;i<=SIZE-1;i++)
     {
       c [i] =i+1;
       printf("%5d",c[i]);
     }
   }

运行功效如下:

1 2 3

这个例子与上一道例题有沟通的运行功效, 但用了预处理惩罚措施后, 可以利便的对措施举办修改. 譬喻需要打印1 2 3 4 5时, 只需将#define SIZE 3改为#define SIZE 5 即可实现. 要留意的是, 预处理惩罚措施不是C语言的一部门, 他只是对文本操纵的措施, 所以万不行用分号竣事. 还要留意标记常量名都用大写字母书写. 这种写法突出了措施中的标记常量, 同时也提醒措施员标记常量不是变量.

数组的排序: 数组的排序法有许多, 这里只先容冒泡排序法. 见下例:

# include
# define SIZE 10
main()
{
   int a [SIZE] = {2,6,4,8,10,12,89,68,45,37};
   int i, pass, hold;
   printf("Data items in oraginal order\n");
   for(i=0; i<=SIZE-1; i++)
   printf("%4d", a[i]);
   for(pass=1; pass<=SIZE-1; pass++)
   for(i=0; i<=SIZE-2; i++)
   if(a[i]>a[i+1])
   {
     hold=a[i];
     a[i]=a[i+1];
     a[i+1]=hold;
   }
   printf("\nData items in ascending order\n");
   for(i=0; i<=SIZE-1; i++)
   printf("%4d", a[i]);
   printf("\n");
   return 0;
}

运行功效如下:

Data items int oraginal order

2 6 4 8 10 12 89 68 45 327

Data items in ascending order

2 4 6 8 10 12 45 68 89 327

由上例可见, 公道的操作数组可以简化很多问题。 这里就纷歧一先容了, 有乐趣的同学可以拜见H.M.Deitel的书, 个中还先容了很多有趣的例题。 各人可以配合探讨研究。

#p#副标题#e#

关于多维数组的先容, 我想以二维数组为例, 重点先容一下二维数组的应用。 二维数组实际就是有两各下标的数组, 但要出格留意的是第一个下标暗示元素地址的行, 第二个下标暗示元素地址的列。(留意千万不行颠倒)和一维数组一样, 二维数组也能在声明时被初始化。 譬喻:

int a [2] [2] = {{1,2}, {3,4}};

假如某行没有足够的初始化值, 则该行中的剩余元素都被初始化为零, 这点要出格留意。对二维数组来说, 第一个下标有时是不须要的, 但必然要给出第二个下标, 编译器用第二个下标确定元素在内存中的位置。 幻方是二维数组应用的一个很典范的例子, 见下例:

#define N 5
void setmagic(int [][N]);
void outmagic(int [][N]);
main()
{
   int s[N][N] = {0};
   setmagic(s);
   outmagic(s);
}
void setmagic(int s[][N])
{
   int i, j, tryi, tryj, k;
   k = 1;
   i = 0;
   j = N / 2;
   s[i][j] = k;
   k++;
   while(k <= N*N)
   {
     tryi = i - 1; tryj = j - 1;
     if(tryi == -1) tryi += N;
     if(tryj == -1) tryj += N;
     if(s[tryi][tryj] != 0 || (tryi == -1 && tryj == -1))
     i = i + 1;
     else {
       i = tryi; j = tryj;
     }
     s[i][j] = k;
     k++;
   }
}
void outmagic(int s[][N])
{
   int i, j;
   for(i = 0; i < N; i++) {
     for(j = 0; j < N; j++)
     printf("%4d", s[i][j]);
     printf("\n");
   }
}

运行功效如下:

15 8 1 24 17

16 14 7 5 23

22 20 13 6 4

3 21 19 12 10

9 2 25 18 11

关于二维数组的接头就暂告一段落吧, 照旧推荐各人假如要看理论常识可以看谭浩强的C语言设计第二版, 一些例题可以参H.M.Deitel的C措施设计教程。

 

    关键字:

天才代写-代写联系方式