C语言中数组变量及用法

在C语言中,数组是一类复杂数据类型,数组元素可以是任意数据类型,但所有元素类型必须一致。C语言中的数组值得注意的地方有以下两点:

  • C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外一个数组。这样“仿真”出一个多维数组就不是一件难事。
  • 对于一个数组,我们只能够做两件事情:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。

要理解C语言数组的运作机制,我们首先来声明并定义一个数组。例如

int a[3] = {3, 7, 9};

除了a被用作运算符sizeof的参数这一情形,在其他所有情形中数组名a都代表指向数组a中下标为0的元素的指针。正如我们合乎情理的期待,sizeof a的结果是整个数组a的大小,而不是指向数组a的元素的指针的大小。

从上面的理论我们不难看出,*a即数组中下标为0的元素的引用。例如,我们可以这样写:

*a = 84;

这个语句将数组a中下标为0的值设置为84。同样道理,*(a+1)是数组a中下标为1的元素的引用,依次类推。概而言之,*(a+i)即数组a中下标为i的元素的引用;这种写法是如此常用,因此它被简记为a[i]。

实际上,由于a+i与i+a含义一样,因此a[i]与i[a]也具有同样的含义。

给定一个数组,求任意(N-1)个元素的乘积中的最大值?

题目——子数组的最大乘积?
给定一个长度为N的整数数组(数组元素可以为正或负或0),计算任意(N-1)个元素的乘积中的最大值。

#include 
#define N 8
int recur_multi(int a[], int len);
int main(int argc, char *argv[])
{
    int a[N] = {5, -2, -3, -5, 3, 2, 1, 4};
    int b[N] = {0};
    int i;
    int tmp;
    int max;
    for (i = 0; i < N; ++i)
    {
        tmp = a[i];
        a[i] = 1;
        b[i] = recur_multi(a, N-1);
        a[i] = tmp;
    }
    for (i = 0; i < N; ++i)
    {
        printf("%d\t", b[i]);
    }
    max = b[0];
    for (i = 1; i < N; ++i)
    {
        if (b[i] > max)
        {
            max = b[i];
        }
    }
    printf ("\n%d\n",max);
    return 0;
}
int recur_multi(int a[], int len)
{
    if (0 == len)
    {
        return a[0];
    } else {
        return a[len] * recur_multi(a, len-1);
    }
}

用C语言写CGI程式-入门篇

原文链接:http://www.cs.tut.fi/~jkorpela/forms/cgic.html

这是一篇用C语言写CGI程式的入门文章。假定读者对C语言有基本的认识,熟悉HTML并且会在WEB服务器上安装CGI脚本。

为什么要用CGI程式?

大家都应该知道如何用HTML写表单,那么写好表单后,为了可靠地使用、处理表单数据,你仍然需要服务端脚本。通常服务端脚本以简单、类似的方式处理表单提交,典型地如向某个邮件地址发送文本数据。

但是,如果你要处理更复杂的问题,如采集数据并写入文件或数据库、或者接收信息然后转发又或者对提交的数据做四则运算,那么你不得不自己写一个的服务端脚本。

简单地说,CGI是HTML表单和服务端脚本的接口。

但CGI不是唯一的选择。建议看下Lars Marius GarsholHow the web works: HTTP and CGI explained 文章,可以使您了解CGI的概念和除CGI外的其他选择。

如果有人建议用javascript写CGI程式,让他看看这篇文章: JavaScript and HTML: possibilities and caveats. 简单说,如果不使用服务端服本备份的话,JavaScript根本不可靠。

Continue reading

数据结构C语言版:线性表之顺序栈

栈是一种特殊的线性表
栈是一种数据结构,是只能在某一端插入和删除的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶 (top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO–Last IN First Out表)。 Continue reading

数据结构C语言版:线性表之顺序表

线性表是一个线性结构。线性表采用顺序存储的方式

存储就称为顺序表。那么定义一种数据结构就是要描术出数据的逻辑结构、存储结构和运算集合。存储结构是一个结构体,运算集合包括:初始化、

插、删、改、打印、搜索等。顺序表的类型描述如下:
ADT sequence_list{
数据集合 K: K={k(1), k(2), …,k(n)}, n >=0, K中的地素是datatype类型;
数据关系 R: R={r}
r={ | i=1, 2, …, n-1}
操作集合:
(1) void init(sequence_list *slt);顺序表的初始化—置空表
(2) void append(sequence_list *slt, datatype x); 在顺序表后部插入值为x的结点
(3) void display(sequence_list slt);打印顺序表的各结点值
(4) int empty(sequence_list slt);判断顺序表是否为空
(5) int find(sequence_list slt, datatype x);查找顺序表中值为x的结点位置
(6) datatype get(sequence_list slt, int i);取得顺序表中第i个结点的值
(7) void insert(sequence_list *slt, datatype x, int position);在顺序表的postion位置插入值为x的结点
(8) void dele(sequence_list *slt, int position);删除表中第position位置的结点
}ADT sequence_list;
下面用C代码实现:
Continue reading