>>>在线充值<<<
【必读】通信广角各点值说明一级士官及以上在这领广角币网上购买广角币,实时充值网上支付实时获取广角币教程!!!
【跟帖有奖】挣取广角币完全指南! 这里领取每天赠送的4广角币 华为无线培训课程通信广角08年精华内容大集合
发新话题
打印

【转】C语言初学者入门讲座

本主题由 youzaini 于 2008-5-7 22:00 限时高亮
精华全集  冲广角币  获取广角币的更多方法

数据输入语句

C语言的数据输入也是由函数语句完成的。 本节介绍从标准输入设备—键盘上输入数据的函数scanf和getchar。 scanf函数 scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

一、scanf函数的一般形式

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串, 也就是不能显示提示字符串。地址表列中给出各变量的地址。 地址是由地址运算符“&”后跟变量名组成的。例如,&a,&b分别表示变量a和变量b 的地址。这个地址就是编译系统在内存中给a,b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

变量的地址和变量值的关系如下: &a--->a567 a为变量名,567是变量的值,&a是变量a的地址。在赋值表达式中给变量赋值,如: a=567 在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。 这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。

void main(){

int a,b,c;

printf("input a,b,c\n");

scanf("%d%d%d",&a,&b,&c);

printf("a=%d,b=%d,c=%d",a,b,c);

}

注意&的用法!

在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入。用户输入7、8、9后按下回车键,此时,系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔, 因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。

如: 7 8 9



7

8

9

格式字符串

格式字符串的一般形式为: %
  • [输入数据宽度][长度]类型 其中有方括号[]的项为任选项。各项的意义如下:

    1.类型

    表示输入数据的类型,其格式符和意义下表所示。

    格式 字符意义

    d 输入十进制整数

    o 输入八进制整数

    x 输入十六进制整数

    u 输入无符号十进制整数

    f或e 输入实型数(用小数形式或指数形式)

    c 输入单个字符

    s 输入字符串

    2.“*”符

    用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。 如 scanf("%d %*d %d",&a,&b);当输入为:1 2 3 时,把1赋予a,2被跳过,3赋予b。

    3.宽度

    用十进制整数指定输入的宽度(即字符数)。例如: scanf("%5d",&a);

    输入:

    12345678

    只把12345赋予变量a,其余部分被截去。又如: scanf("%4d%4d",&a,&b);

    输入:

    12345678将把1234赋予a,而把5678赋予b。

    4.长度

    长度格式符为l和h,l表示输入长整型数据(如%ld) 和双精度浮点数(如%lf)。h表示输入短整型数据。

    使用scanf函数还必须注意以下几点:

    a. scanf函数中没有精度控制,如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为2位的实数。

    b. scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。

    c. 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

    d. 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:

    scanf("%c%c%c",&a,&b,&c);

    输入为:

    d e f

    则把'd'赋予a, 'f'赋予b,'e'赋予c。只有当输入为:

    def

    时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,如 scanf ("%c %c %c",&a,&b,&c);则输入时各数据之间可加空格。

    void main(){

    char a,b;

    printf("input character a,b\n");

    scanf("%c%c",&a,&b);

    printf("%c%c\n",a,b);

    }

    scanf("'C14F14%c%c",&a,&b);

    printf("%c%c\n",a,b);

    由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。

    而输入改为MN时则可输出MN两字符,见下面的输入运行情况:

    input character a,b

    MN

    MN

    void main(){

    char a,b;

    printf("input character a,b\n");

    scanf("%c %c",&a,&b);

    printf("\n%c%c\n",a,b);

    }

    scanf("%c %c",&a,&b);

    本例表示scanf格式控制串"%c %c"之间有空格时, 输入的数据之间可以有空格间隔。e. 如果格式控制串中有非格式字符则输入时也要输入该非格式字符。

    例如:

    scanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“ , ”作间隔符,故输入时应为: 5,6,7

    又如: scanf("a=%d,b=%d,c=%d",&a,&b,&c);

    则输入应为

    a=5,b=6,c=7g. 如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。




  • 本贴地址:http://bbs.tong-xin.com/viewthread.php?tid=27887&fromuid=0
    点击复制,把本帖地址粘贴到MSN/QQ/邮件/网络上给朋友分享,即可获得广角币!
    精华全集  冲广角币  获取广角币的更多方法

    C语言初学者入门讲座 第六讲 分支结构

    关系运算符和表达式

    在程序中经常需要比较两个量的大小关系, 以决定程序下一步的工作。比较两个量的运算符称为关系运算符。 在C语言中有以下关系运算符:

    < 小于

    <= 小于或等于

    > 大于

    >= 大于或等于

    == 等于

    != 不等于

    关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。

    关系表达式

    关系表达式的一般形式为: 表达式 关系运算符 表达式 例如:a+b>c-d,x>3/2,'a'+1<c,-i-5*j==k+1;都是合法的关系表达式。由于表达式也可以又是关系表达式。 因此也允许出现嵌套的情况,例如:a>(b>c),a!=(c==d)等。关系表达式的值是“真”和“假”,用“1”和“0”表示。

    如: 5>0的值为“真”,即为1。(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。

    void main(){

    char c='k';

    int i=1,j=2,k=3;

    float x=3e+5,y=0.85;

    printf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);

    printf("%d,%d\n",1<j<5,x-5.25<=x+y);

    printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);

    }

    char c='k';

    int i=1,j=2,k=3;

    float x=3e+5,y=0.85;

    printf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);

    printf("%d,%d\n",1<j<5,x-5.25<=x+y);

    printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);

    在本例中求出了各种关系运算符的值。 字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。

    逻辑运算符和表达式

    逻辑运算符C语言中提供了三种逻辑运算符 && 与运算 || 或运算 ! 非运算 与运算符&&和或运算符||均为双目运算符。具有左结合性。 非运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:

    按照运算符的优先顺序可以得出:

    a>b && c>d等价于(a>b) && (c>d)

    !b==c||d<a等价于((!b)==c)||(d<a)

    a+b>c && x+y<b等价于((a+b)>c) && ((x+y)<b)

    逻辑运算的值

    逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:

    1.与运算&&参与运算的两个量都为真时,结果才为真,否则为假。例如,5>0 && 4>2,由于5>0为真,4>2也为真,相与的结果也为真。

    2.或运算||参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真

    3.非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。

    例如:!(5>0)的结果为假。

    虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。

    又如:5||0的值为“真”,即为1。

    逻辑表达式逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:(a&&b)&&c根据逻辑运算符的左结合性,上式也可写为: a&&b&&c 逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。

    void main(){

    char c='k';

    int i=1,j=2,k=3;

    float x=3e+5,y=0.85;

    printf("%d,%d\n",!x*!y,!!!x);

    printf("%d,%d\n",x||i&&j-3,i<j&&x<y);

    printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);

    } char c='k';

    int i=1,j=2,k=3;

    float x=3e+5,y=0.85;

    printf("%d,%d\n",!x*!y,!!!x);

    printf("%d,%d\n",x||i&&j-3,i<j&&x<y);

    printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);

    本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0, 该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k 由于x+y的值为非0,故整个或表达式的值为1。

    if语句

    用if语句可以构成分支结构。它根据给定的条件进行判断, 以决定执行某个分支程序段。C语言的if语句有三种基本形式。

    1.第一种形式为基本形式 if(表达式) 语句; 其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图

    void main(){

    int a,b,max;

    printf("\n input two numbers: ");

    scanf("%d%d",&a,&b);

    max=a;


    精华全集  冲广角币  获取广角币的更多方法

    if (max<b) max=b;

    printf("max=%d",max);

    }

    输入两个整数,输出其中的大数。

    scanf("%d%d",&a,&b);

    max=a;

    if (max<b) max=b;

    printf("max=%d",max);

    本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。

    2.第二种形式为if-else形式

    if(表达式)

    语句1;

    else

    语句2;

    其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。

    void main(){

    int a, b;

    printf("input two numbers: ");

    scanf("%d%d",&a,&b);

    if(a>b)

    printf("max=%d\n",a);

    else

    printf("max=%d\n",b);

    }

    输入两个整数,输出其中的大数。改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。

    3.第三种形式为if-else-if形式

    前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为:

    if(表达式1)

    语句1;

    else if(表达式2)

    语句2;

    else if(表达式3)

    语句3;



    else if(表达式m)

    语句m;

    else

    语句n;

    其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n 。 然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。

    #include"stdio.h"

    void main(){

    char c;

    printf("input a character: ");

    c=getchar();

    if(c<32)

    printf("This is a control character\n");

    else if(c>='0'&&c<='9')

    printf("This is a digit\n");

    else if(c>='A'&&c<='Z')

    printf("This is a capital letter\n");

    else if(c>='a'&&c<='z')

    printf("This is a small letter\n");

    else

    printf("This is an other character\n");

    }

    if(c<32)

    printf("This is a control character\n");

    else if(c>='0'&&c<='9')

    printf("This is a digit\n");

    else if(c>='A'&&c<='Z')

    printf("This is a capital letter\n");

    else if(c>='a'&&c<='z')

    printf("This is a small letter\n");

    else

    printf("This is an other character\n");

    本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。


    精华全集  冲广角币  获取广角币的更多方法

    4.在使用if语句中还应注意以下问题

    (1) 在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如: if(a=5) 语句;if(b) 语句; 都是允许的。只要表达式的值为非0,即为“真”。如在if(a=5)…;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。

    又如,有程序段: if(a=b)

    printf("%d",a);

    else

    printf("a=0"); 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。

    (2) 在if语句中,条件判断表达式必须用括号括起来, 在语句之后必须加分号。

    (3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{} 括起来组成一个复合语句。但要注意的是在}之后不能再加分号。

    例如:

    if(a>b){

    a++;

    b++;

    }

    else{ a=0;

    b=10;

    }

    if语句的嵌套

    当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。其一般形式可表示如下:

    if(表达式)

    if语句;

    或者为

    if(表达式)

    if语句;

    else

    if语句;

    在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:

    if(表达式1)

    if(表达式2)

    语句1;

    else

    语句2;

    其中的else究竟是与哪一个if配对呢?

    应该理解为: 还是应理解为:

    if(表达式1) if(表达式1)

    if(表达式2) if(表达式2)

    语句1; 语句1;

    else else

    语句2; 语句2;

    为了避免这种二义性,C语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。

    void main(){

    int a,b;

    printf("please input A,B: ");

    scanf("%d%d",&a,&b);

    if(a!=b)

    if(a>b) printf("A>B\n");

    else printf("A<B\n");

    else printf("A=B\n");

    }

    比较两个数的大小关系。

    printf("please input A,B: ");

    scanf("%d%d",&a,&b);

    if(a!=b)

    if(a>b) printf("A>B\n");

    else printf("A<B\n");

    else printf("A=B\n");

    本例中用了if语句的嵌套结构。 采用嵌套结构实质上是为了进行多分支选择,例3.16实际上有三种选择即A>B、A<B或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此, 在一般情况下较少使用if语句的嵌套结构。 以使程序更便于阅读理解。

    void main(){

    int a,b;

    printf("please input A,B: ");

    scanf("%d%d",&a,&b);

    if(a==b) printf("A=B\n");

    else if(a>b) printf("A>B\n");

    else printf("A<B\n");

    }

    条件运算符和条件表达式

    如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。

    条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:

    表达式1? 表达式2: 表达式3

    其求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。 条件表达式通常用于赋值语句之中。

    例如条件语句:

    if(a>b) max=a;

    else max=b;

    可用条件表达式写为 max=(a>b)?a:b; 执行该语句的语义是:如a>b为真,则把a赋予max,否则把b 赋予max。

    使用条件表达式时,还应注意以下几点:

    1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b

    2. 条件运算符?和:是一对运算符,不能分开单独使用。

    3. 条件运算符的结合方向是自右至左。

    例如:

    a>b?a:c>d?c:d应理解为

    a>b?ac>d?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条

    件表达式。

    void main(){

    int a,b,max;

    printf("\n input two numbers: ");

    scanf("%d%d",&a,&b);

    printf("max=%d",a>b?a:b);

    }

    用条件表达式对上例重新编程,输出两个数中的大数。

    switch语句

    C语言还提供了另一种用于多分支选择的switch语句, 其一般形式为:

    switch(表达式){

    case常量表达式1: 语句1;

    case常量表达式2: 语句2;



    case常量表达式n: 语句n;

    default : 语句n+1;

    }

    其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。 如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。

    void main(){


    精华全集  冲广角币  获取广角币的更多方法

    int a;

    printf("input integer number: ");

    scanf("%d",&a);

    switch (a){

    case 1:printf("Monday\n");

    case 2:printf("Tuesday\n");

    case 3:printf("Wednesday\n");

    case 4:printf("Thursday\n");

    case 5:printf("Friday\n");

    case 6:printf("Saturday\n");

    case 7:printf("Sunday\n");

    default:printf("error\n");

    }

    }

    本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况, C语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。

    void main(){

    int a;

    printf("input integer number: ");

    scanf("%d",&a);

    switch (a){

    case 1:printf("Monday\n");break;

    case 2:printf("Tuesday\n"); break;

    case 3:printf("Wednesday\n");break;

    case 4:printf("Thursday\n");break;

    case 5:printf("Friday\n");break;

    case 6:printf("Saturday\n");break;

    case 7:printf("Sunday\n");break;

    default:printf("error\n");

    }

    }

    在使用switch语句时还应注意以下几点:

    1.在case后的各常量表达式的值不能相同,否则会出现错误。

    2.在case后,允许有多个语句,可以不用{}括起来。

    3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。

    4.default子句可以省略不用。程序举例

    输入三个整数,输出最大数和最小数。

    void main(){

    int a,b,c,max,min;

    printf("input three numbers: ");

    scanf("%d%d%d",&a,&b,&c);

    if(a>b)

    {max=a;min=b;}

    else

    {max=b;min=a;}

    if(max<c)

    max=c;

    else

    if(min>c)

    min=c;

    printf("max=%d\nmin=%d",max,min);

    }

    本程序中,首先比较输入的a,b的大小,并把大数装入max, 小数装入min中,然后再与c比较,若max小于c,则把c赋予max;如果c小于min,则把c赋予min。因此max内总是最大数,而min内总是最小数。最后输出max和min的值即可。 计算器程序。用户输入运算数和四则运算符, 输出计算结果。

    void main(){

    float a,b,s;

    char c;

    printf("input expression: a+(-,*,/)b \n");

    scanf("%f%c%f",&a,&c,&b);

    switch(c){

    case '+': printf("%f\n",a+b);break;

    case '-': printf("%f\n",a-b);break;

    case '*': printf("%f\n",a*b);break;

    case '/': printf("%f\n",a/b);break;

    default: printf("input error\n");

    }

    }

    float a,b,s;

    char c;

    printf("input expression: a+(-,*,/)b \n");

    scanf("%f%c%f",&a,&c,&b);

    switch(c){

    case '+': printf("%f\n",a+b);break;

    case '-': printf("%f\n",a-b);break;

    case '*': printf("%f\n",a*b);break;

    case '/': printf("%f\n",a/b);break;

    default: printf("input error\n");

    }

    本例可用于四则运算求值。switch语句用于判断运算符, 然后输出运算值。当输入运算符不是+,-,*,/时给出错误提示。


    精华全集  冲广角币  获取广角币的更多方法

    C语言初学者入门讲座 第七讲 循环结构

    循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C语言提供了多种循环语句,可以组成各种不同形式的循环结构。

    while语句

    while语句的一般形式为: while(表达式)语句; 其中表达式是循环条件,语句为循环体。

    while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。其执行过程可用图3—4表示。 统计从键盘输入一行字符的个数。

    #include <stdio.h>

    void main(){

    int n=0;

    printf("input a string:\n");

    while(getchar()!='\n') n++;

    printf("%d",n);

    } int n=0;

    printf("input a string:\n");

    while(getchar()!='\n')

    n++;

    printf("%d",n);

    本例程序中的循环条件为getchar()!='\n',其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。

    使用while语句应注意以下几点:

    1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。

    void main(){

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    while (n--)

    printf("%d ",a++*2);

    } int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    while (n--)

    printf("%d ",a++*2);

    本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于(a*2;a++)

    2.循环体如包括有一个以上的语句,则必须用{}括起来, 组成复合语句。

    3.应注意循环条件的选择以避免死循环。

    void main(){

    int a,n=0;

    while(a=5)

    printf("%d ",n++);

    } int a,n=0;

    while(a=5)

    printf("%d ",n++);

    本例中while语句的循环条件为赋值表达式a=5, 因此该表达式的值永远为真,而循环体中又没有其它中止循环的手段, 因此该循环将无休止地进行下去,形成死循环。4.允许while语句的循环体又是while语句,从而形成双重循环。

    do-while语句

    do-while语句的一般形式为:

    do

    语句;

    while(表达式);

    其中语句是循环体,表达式是循环条件。

    do-while语句的语义是:

    先执行循环体语句一次, 再判别表达式的值,若为真(非0)则继续循环,否则终止循环。

    do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。

    while语句和do-while语句一般都可以相互改写。

    void main(){

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    do printf("%d ",a++*2);

    while (--n);

    }

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    do printf("%d ",a++*2);

    while (--n);

    在本例中,循环条件改为--n,否则将多执行一次循环。这是由于先执行后判断而造成的。

    对于do-while语句还应注意以下几点:

    1.在if语句,while语句中, 表达式后面都不能加分号, 而在 do-while语句的表达式后面则必须加分号。

    2.do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。

    3.在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。

    4.do-while和while语句相互替换时,要注意修改循环控制条件。

    for语句

    for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为:

    for(表达式1;表达式2;表达3)

    语句:

    表达式1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。

    表达式2 通常是循环条件,一般为关系表达式或逻辑表达式。

    表达式3 通常可用来修改循环变量的值,一般是赋值语句。

    这三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。

    一般形式中的“语句”即为循环体语句。for语句的语义是:

    1.首先计算表达式1的值。

    2.再计算表达式2的值,若值为真(非0)则执行循环体一次, 否则跳出循环。

    3.然后再计算表达式3的值,转回第2步重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式,3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for 语句的执行过程如图所示。

    void main(){

    int n,s=0;

    for(n=1;n<=100;n++)

    s=s+n;

    printf("s=%d\n",s);

    }

    用for语句计算s=1+2+3+...+99+100

    int n,s=0;

    for(n=1;n<=100;n++)

    s=s+n;

    printf("s=%d\n",s);

    本例for语句中的表达式3为n++,实际上也是一种赋值语句,相当于n=n+1,以改变循环变量的值。

    void main(){

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);


    精华全集  冲广角币  获取广角币的更多方法

    for(;n>0;a++,n--)

    printf("%d ",a*2);

    }

    用for语句修改例题。从0开始,输出n个连续的偶数。

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    for(;n>0;a++,n--)

    printf("%d ",a*2);

    本例的for语句中,表达式1已省去,循环变量的初值在for语句之前由scanf语句取得,表达式3是一个逗号表达式,由a++,n-- 两个表达式组成。每循环一次a自增1,n自减1。a的变化使输出的偶数递增,n的变化控制循次数。

    在使用for语句中要注意以下几点

    1.for语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式;表达式)省去了表达式1。for(表达式;;表达式)省去了表达式2。

    for(表达式;表达式;)省去了表达式3。for(;;)省去了全部表达式。

    2.在循环变量已赋初值时,可省去表达式1,如例3.27即属于这种情形。如省去表达式2或表达式3则将造成无限循环, 这时应在循环体内设法结束循环。例题即属于此情况。

    void main(){

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    for(;n>0;)

    { a++;n--;

    printf("%d ",a*2);

    }

    } int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    for(;n>0;)

    { a++;n--;

    printf("%d ",a*2);

    }

    本例中省略了表达式1和表达式3,由循环体内的n--语句进行循环变量n的递减,以控制循环次数。

    void main(){

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    for(;;){

    a++;n--;

    printf("%d ",a*2);

    if(n==0)break;

    }

    }

    int a=0,n;

    printf("\n input n: ");

    scanf("%d",&n);

    for(;;){

    a++;n--;

    printf("%d ",a*2);

    if(n==0)break;

    }

    本例中for语句的表达式全部省去。由循环体中的语句实现循环变量的递减和循环条件的判断。当n值为0时,由break语句中止循环,转去执行for以后的程序。在此情况下,for语句已等效于while( 1)语句。如在循环体中没有相应的控制手段,则造成死循环。

    3.循环体可以是空语句。

    #include"stdio.h"

    void main(){

    int n=0;

    printf("input a string:\n");

    for(;getchar()!='\n';n++);

    printf("%d",n);

    }

    本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf 语句当成循环体来执行。反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误,要十分注意。

    4.for语句也可与while,do-while语句相互嵌套,构成多重循环。以下形成都合法的嵌套。

    (1)for(){…

    while()

    {…}



    }

    (2)do{



    for()

    {…}



    }while();

    (3)while(){



    for()

    {…}



    }

    (4)for(){



    for(){



    }

    }

    void main(){

    int i,j,k;

    for(i=1;i<=3;i++)

    {

    for(j=1;j<=3-i+5;j++)

    printf(" ");

    for(k=1;k<=2*i-1+5;k++)

    {

    if(k<=5) printf(" ");

    else printf("*");

    }

    printf("\n");

    }

    }


    精华全集  冲广角币  获取广角币的更多方法

    C语言初学者入门讲座 第八讲 转移语句

    程序中的语句通常总是按顺序方向, 或按语句功能所定义的方向执行的。如果需要改变程序的正常流向, 可以使用本小节介绍的转移语句。在C语言中提供了4种转移语句:

    goto,break, continue和return。

    其中的return语句只能出现在被调函数中, 用于返回主调函数,我们将在函数一章中具体介绍。 本小节介绍前三种转移语句。

    1.goto语句

    goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的

    前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。

    如: label: i++;

    loop: while(x<7);

    C语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向, 转去执行语句标号所标识的语句。

    goto语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。

    但是,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

    统计从键盘输入一行字符的个数。

    #include"stdio.h"

    void main(){

    int n=0;

    printf("input a string\n");

    loop: if(getchar()!='\n')

    {

    n++;

    goto loop;

    }

    printf("%d",n);

    } int n=0;

    printf("input a string\n");

    loop: if(getchar()!='\n')

    {

    n++;

    goto loop;

    }

    printf("%d",n);

    本例用if语句和goto语句构成循环结构。当输入字符不为'\n'时即执行n++进行计数,然后转移至if语句循环执行。直至输入字符为'\n'才停止循环。

    break语句

    break语句只能用在switch 语句或循环语句中, 其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为: break; 上面例题中分别在switch语句和for语句中使用了break 语句作为跳转。使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。

    continue语句

    continue语句只能用在循环体中,其一般格式是:

    continue;

    其语义是:结束本次循环,即不再执行循环体中continue 语句之后的语句,转入下一次循环条件的判断与执行。应注意的是, 本语句只结束本层本次的循环,并不跳出循环。

    void main(){

    int n;

    for(n=7;n<=100;n++)

    {

    if (n%7!=0)

    continue;

    printf("%d ",n);

    }

    }

    输出100以内能被7整除的数。

    int n;

    for(n=7;n<=100;n++)

    {

    if (n%7!=0)

    continue;

    printf("%d ",n);

    }

    本例中,对7~100的每一个数进行测试,如该数不能被7整除,即模运算不为0,则由continus语句转去下一次循环。只有模运算为0时,才能执行后面的printf语句,输出能被7整除的数。

    #include"stdio.h"

    void main(){

    char a,b;

    printf("input a string:\n");

    b=getchar();

    while((a=getchar())!='\n'){

    if(a==b){

    printf("same character\n");

    break;

    }b=a;

    }

    }

    检查输入的一行中有无相邻两字符相同。

    char a,b;

    printf("input a string:\n");

    b=getchar();

    while((a=getchar())!='\n'){

    if(a==b){

    printf("same character\n");

    break;

    }b=a;

    }

    本例程序中,把第一个读入的字符送入b。然后进入循环,把下一字符读入a,比较a,b是否相等,若相等则输出提示串并中止循环,若不相等则把a中的字符赋予b,输入下一次循环。

    输出100以内的素数。素数是只能被1 和本身整除的数。可用穷举法来判断一个数是否是素数。

    void main(){

    int n,i;

    for(n=2;n<=100;n++){

    for(i=2;i<n;i++)

    if(n%i==0) break;

    if(i>=n) printf("\t%d",n);

    }

    } int n,i;

    for(n=2;n<=100;n++){

    for(i=2;i<n;i++)

    if(n%i==0) break;

    if(i>=n) printf("\t%d",n);

    }

    本例程序中,第一层循环表示对1~100这100个数逐个判断是否是素数,共循环100次,在第二层循环中则对数n用2~n-1逐个去除,若某次除尽则跳出该层循环,说明不是素数。 如果在所有的数都是未除尽的情况下结束循环,则为素数,此时有i>=n, 故可经此判断后输出素数。然后转入下一次大循环。实际上,2以上的所有偶数均不是素数,因此可以使循环变量的步长值改为2,即每次增加2,此外只需对数n用2~n去除就可判断该数是否素数。这样将大大减少循环次数,减少程序运行时间。

    #include"math.h"

    void main(){

    int n,i,k;

    for(n=2;n<=100;n+=2){

    k=sqrt(n);

    for(i=2;i<k;i++)

    if(n%i==0) break;

    if(i>=k) printf("\t%2d",n);

    }

    }


    精华全集  冲广角币  获取广角币的更多方法

    C语言初学者入门讲座 第九讲 数组

    数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

    本章介绍数值数组和字符数组,其余的在以后各章陆续介绍。数组类型说明 在C语言中使用数组必须先进行类型说明。 数组说明的一般形式为:

    类型说明符 数组名 [常量表达式],……;

    其中,类型说明符是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符。 方括号中的常量表达式表示数据元素的个数,也称为数组的长度。

    例如:

    int a[10]; 说明整型数组a,有10个元素。

    float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。

    char ch[20]; 说明字符数组ch,有20个元素。

    对于数组类型说明应注意以下几点:

    1.数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

    2.数组名的书写规则应符合标识符的书写规定。

    3.数组名不能与其它变量名相同,例如:

    void main()

    {

    int a;

    float a[10];

    ……

    }

    是错误的。

    4.方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。

    5.不能在方括号中用变量来表示元素的个数, 但是可以是符号常数或常量表达式。例如:

    #define FD 5

    void main()

    {

    int a[3+2],b[7+FD];

    ……

    }

    是合法的。但是下述说明方式是错误的。

    void main()

    {

    int n=5;

    int a[n];

    ……

    }

    6.允许在同一个类型说明中,说明多个数组和多个变量。

    例如: int a,b,c,d,k1[10],k2[20];

    数组元素的表示方法

    数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。 下标表示了元素在数组中的顺序号。数组元素的一般形式为: 数组名[下标] 其中的下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如,a[5],a[i+j],a[i++]都是合法的数组元素。 数组元素通常也称为下标变量。必须先定义数组, 才能使用下标变量。在C语言中只能逐个地使用下标变量, 而不能一次引用整个数组。 例如,输出有10 个元素的数组必须使用循环语句逐个输出各下标变量:

    for(i=0; i<10; i++) printf("%d",a);

    而不能用一个语句输出整个数组,下面的写法是错误的:

    printf("%d",a);

    void main()

    {

    int i,a[10];

    for(i=0;i<10;)

    a[i++]=2*i+1;

    for(i=9;i>=0;i--)

    printf("%d",a);

    printf("\n%d %d\n",a[5.2],a[5.8]);

    }

    for(i=0;i<10;)

    a[i++]=2*i+1;

    for(i=9;i>=0;i--)

    printf("%d",a);

    printf("\n%d %d\n",a[5.2],a[5.8]);

    本例中用一个循环语句给a数组各元素送入奇数值,然后用第二个循环语句从大到小输出各个奇数。在第一个 for语句中,表达式3省略了。在下标变量中使用了表达式i++,用以修改循环变量。当然第二个for语句也可以这样作, C语言允许用表达式表示下标。 程序中最后一个printf语句输出了两次a[5]的值, 可以看出当下标不为整数时将自动取整。数组的赋值给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。数组初始化赋值数组初始化赋值是指在数组说明时给数组元素赋予初值。 数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。

    初始化赋值的一般形式为: static 类型说明符 数组名[常量表达式]={值,值……值}; 其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储,外部存储的概念在第五章中介绍)。在{ }中的各数据值即为各元素的初值, 各值之间用逗号间隔。例如: static int a[10]={ 0,1,2,3,4,5,6,7,8,9 }; 相当于a[0]=0;a[1]=1...a[9]=9;

    C语言对数组的初始赋值还有以下几点规定:

    1.可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只给前面部分元素赋值。例如: static int a[10]={0,1,2,3,4};表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。

    2.只能给元素逐个赋值,不能给数组整体赋值。 例如给十个元素全部赋1值,只能写为:

    static int a[10]={1,1,1,1,1,1,1,1,1,1};

    而不能写为:

    static int a[10]=1;

    3.如不给可初始化的数组赋初值,则全部元素均为0值。

    4.如给全部元素赋值,则在数组说明中, 可以不给出数组元素的个数。例如:

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

    可写为:

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

    动态赋值可以在程序执行过程中,对数组作动态赋值。 这时可用循环语句配合scanf函数逐个对数组元素赋值。

    void main()

    {

    int i,max,a[10];

    printf("input 10 numbers:\n");

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

    scanf("%d",&a);

    max=a[0];

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

    if(a>max) max=a;

    printf("maxmum=%d\n",max);

    }

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

    scanf("%d",&a);

    max=a[0];

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

    if(a>max) max=a;

    printf("maxmum=%d\n",max);

    本例程序中第一个for语句逐个输入10个数到数组a中。 然后把a[0]送入max中。在第二个for语句中,从a[1]到a[9]逐个与max中的内容比较,若比max的值大,则把该下标变量送入max中,因此max总是在已比较过的下标变量中为最大者。比较结束,输出max的值。

    void main()

    {

    int i,j,p,q,s,a[10];

    printf("\n input 10 numbers:\n");

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

    scanf("%d",&a);

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

    p=i;q=a;

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

    if(q<a[j]) { p=j;q=a[j]; }

    if(i!=p)

    {

    s=a;

    a=a[p];

    a[p]=s;

    }

    printf("%d",a);

    }

    }

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

    scanf("%d",&a);

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

    p=i;q=a;

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

    if(q<a[j]) { p=j;q=a[j]; }

    if(i!=p)

    {

    s=a;

    a=a[p];

    a[p]=s;

    }

    printf("%d",a);

    }

    本例程序中用了两个并列的for循环语句,在第二个for 语句中又嵌套了一个循环语句。第一个for语句用于输入10个元素的初值。第二个for语句用于排序。本程序的排序采用逐个比较的方法进行。在i次循环时,把第一个元素的下标i赋于p,而把该下标变量值a赋于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a作比较,有比a大者则将其下标送p,元素值送q。 一次循环结束后,p即为最大元素的下标,q则为该元素值。若此时i≠p,说明p,q值均已不是进入小循环之前所赋之值,则交换a和a[p]之值。 此时a为已排序完毕的元素。输出该值之后转入下一次循环。对i+1以后各个元素排序。


    精华全集  冲广角币  获取广角币的更多方法

    二维数组

    前面介绍的数组只有一个下标,称为一维数组, 其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的, 因此C语言允许构造多维数组。多维数组元素有多个下标, 以标识它在数组中的位置,所以也称为多下标变量。 本小节只介绍二维数组,多维数组可由二维数组类推而得到。二维数组类型说明二维数组类型说明的一般形式是:

    类型说明符 数组名[常量表达式1][常量表达式2]…;

    其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:

    int a[3][4];

    说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

    a[0][0],a[0][1],a[0][2],a[0][3]

    a[1][0],a[1][1],a[1][2],a[1][3]

    a[2][0],a[2][1],a[2][2],a[2][3]

    二维数组在概念上是二维的,即是说其下标在两个方向上变化, 下标变量在数组中的位置也处于一个平面之中, 而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按一维线性排列的。 如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列, 即放完一行之后顺次放入第二行。另一种是按列排列, 即放完一列之后再顺次放入第二列。在C语言中,二维数组是按行排列的。 在图4.1中,按行顺次存放,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为

    int类型,该类型占两个字节的内存空间,所以每个元素均占有两个 字节(图中每一格为一字节)。

    二维数组元素的表示方法

    二维数组的元素也称为双下标变量,其表示的形式为: 数组名[下标][下标] 其中下标应为整型常量或整型表达式。例如: a[3][4] 表示a数组三行四列的元素。下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。 数组说明的方括号中给出的是某一维的长度,即可取下标的最大值; 而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量, 后者可以是常量,变量或表达式。

    一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

    课程 成绩姓名 Math C DBASE

    张 80 75 92

    王 61 65 71

    李 59 63 70

    赵 85 87 90

    周 76 77 85

    可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量l为全组各科总平均成绩。编程如下:

    void main()

    {

    int i,j,s=0,l,v[3],a[5][3];

    printf("input score\n");

    for(i=0;i<3;i++){

    for(j=0;j<5;j++)

    { scanf("%d",&a[j]);

    s=s+a[j];}

    v=s/5;

    s=0;

    }

    l=(v[0]+v[1]+v[2])/3;

    printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]);

    printf("total:%d\n",l);

    } for(i=0;j<3;i++)

    for(j=0;j<5;j++)

    { scanf("%d",&a[j]);

    s=s+a[j];}

    v=s/5;

    s=0;

    }

    l=(v[0]+v[1]+v[2])/3;

    程序中首先用了一个双重循环。 在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来, 退出内循环后再把该累加成绩除以5送入v之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。

    二维数组的初始化

    二维数组初始化也是在类型说明时给各下标变量赋以初值。 二维数组可按行分段赋值,也可按行连续赋值。 例如对数组a[5][3]:

    1.按行分段赋值可写为static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };

    2.按行连续赋值可写为static int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 };

    这两种赋初值的结果是完全相同的。

    void main()

    {

    int i,j,s=0,l,v[3];

    static int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},

    {85,87,90},{76,77,85} };

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

    { for(j=0;j<5;j++)

    s=s+a[j];

    v=s/5;

    s=0;

    }

    l=(v[0]+v[1]+v[2])/3;

    printf("math:%d\nc languag:%d\ndbase:%d\n",v[0],v[1],v[2]);

    printf("total:%d\n",l);

    }

    对于二维数组初始化赋值还有以下说明:

    1.可以只对部分元素赋初值,未赋初值的元素自动取0值。

    例如:

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

    是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为: 1 0 02 0 03 0 0

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

    赋值后的元素值为 0 1 00 0 23 0 0

    2.如对全部元素赋初值,则第一维的长度可以不给出。

    例如:

    static int a[3][3]={1,2,3,4,5,6,7,8,9};

    可以写为:

    static int a[][3]={1,2,3,4,5,6,7,8,9};

    数组是一种构造类型的数据。 二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组, 就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。 C语言允许这种分解有二维数组a[3][4],可分解为三个一维数组,其数组名分别为a[0],a[1],a[2]。对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。


    精华全集  冲广角币  获取广角币的更多方法

    字符数组

    用来存放字符量的数组称为字符数组。 字符数组类型说明的形式与前面介绍的数值数组相同。例如: char c[10]; 由于字符型和整型通用,也可以定义为int c[10]但这时每个数组元素占2个字节的内存单元。字符数组也可以是二维或多维数组,例如: char c[5][10];即为二维字符数组。 字符数组也允许在类型说明时作初始化赋值。例如: static char c[10]={`c`,` `,`p`,`r`,o`,g`,r`,`a`,`m`};赋值后各元素的值为: 数组C c[0]c[1]c[2]c[3]c[4]c [5]c[6]c[7]c[8]c[9]其中c[9]未赋值,由系统自动赋予0值。 当对全体元素赋初值时也可以省去长度说明。例如: static char c[]={`c`,` `,`p`,`r`,`o`,`g`,`r`,`a`,`m`};这时C数组的长度自动定为9。

    main()

    {

    int i,j;

    char a[][5]={{'B','A','S','I','C',},{'d','B','A','S','E'}};

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

    {

    for(j=0;j<=4;j++)

    printf("%c",a[j]);

    printf("\n");

    }

    }

    本例的二维字符数组由于在初始化时全部元素都赋以初值, 因此一维下标的长度可以不加以说明。字符串在C语言中没有专门的字符串变量, 通常用一个字符数组来存放一个字符串。在2.1.4节介绍字符串常量时,已说明字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时, 也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。 有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

    C语言允许用字符串的方式对数组作初始化赋值。例如:

    static char c[]={'c', ' ','p','r','o','g','r','a','m'}; 可写为:

    static char c[]={"C program"}; 或去掉{}写为:

    sratic char c[]="C program";

    用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。上面的数组c在内存中的实际存放情况为: C program\0`\0'是由C编译系统自动加上的。由于采用了`\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。在采用字符串方式后,字符数组的输入输出将变得简单方便。 除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串, 而不必使用循环语句逐个地输入输出每个字符。

    void main()

    {

    static char c[]="BASIC\ndBASE";

    printf("%s\n",c);

    } printf("%s\n",c);

    注意在本例的printf函数中,使用的格式字符串为“%s”, 表示输出的是一个字符串。而在输出表列中给出数组名则可。 不能写为:

    printf("%s",c[]);

    void main()

    {

    char st[15];

    printf("input string:\n");

    scanf("%s",st);

    printf("%s\n",st);

    } char st[15];

    本例中由于定义数组长度为15, 因此输入的字符串长度必须小于15,以留出一个字节用于存放字符串结束标志`\0`。 应该说明的是,对一个字符数组,如果不作初始化赋值,则必须说明数组长度。还应该特别注意的是,当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。例如运行例4.8,当输入的字符串中含有空格时,运行情况为: input string:this is a book this 从输出结果可以看出空格以后的字符都未能输出。 为了避免这种情况, 可多设几个字符数组分段存放含空格的串。程序可改写如下:

    Lesson

    void main()

    {

    char st1[6],st2[6],st3[6],st4[6];

    printf("input string:\n");

    scanf("%s%s%s%s",st1,st2,st3,st4);

    printf("%s %s %s %s\n",st1,st2,st3,st4);

    }

    本程序分别设了四个数组, 输入的一行字符的空格分段分别装入四个数组。然后分别输出这四个数组中的字符串。在前面介绍过,scanf的各输入项必须以地址方式出现,如 &a,&b等。但在例4.8中却是以数组名方式出现的,这是为什么呢?这是由于在C语言中规定,数组名就代表了该数组的首地址。 整个数组是以首地址开头的一块连续的内存单元。如有字符数组char c[10],在内存可表示如图4.2。设数组c的首地址为2000,也就是说c[0]单元地址为2000。则数组名c就代表这个首地址。因此在c前面不能再加地址运算符&。如写作scanf("%s",&c);则是错误的。 在执行函数printf("%s",c) 时,按数组名c找到首地址,然后逐个输出数组中各个字符直到遇到字符串终止标志'\0'为止。

    字符串常用函数

    C语言提供了丰富的字符串处理函数, 大致可分为字符串的输入、输出、合并、修改、比较、转换、复制、搜索几类。 使用这些函数可大大减轻编程的负担。用于输入输出的字符串函数, 在使用前应包含头文件"stdio.h" ; 使用其它字符串函数则应包含头文件"string.h"。 下面介绍几个最常用的字符串函数。

    1.字符串输出函数 puts 格式: puts (字符数组名) 功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串

    #include"stdio.h"

    main()

    {

    static char c[]="BASIC\ndBASE";

    puts(c);

    }

    static char c[]="BASIC\ndBASE";

    puts(c);

    从程序中可以看出puts函数中可以使用转义字符, 因此输出结果成为两行。puts函数完全可以由printf函数取代。 当需要按一定格式输出时,通常使用printf函数。

    2.字符串输入函数gets 格式: gets (字符数组名) 功能:从标准输入设备键盘上输入一个字符串。 本函数得到一个函数值,即为该字符数组的首地址。

    #include"stdio.h"


    TOP