C语言基础1——基本语法结构和数组

学习前请先下载DevC++、Code::Block或者VC系列的IDE软件。
这里特别提供一下DevC++的下载地址:
点击这里打开DevC下载页面

但请注意不要使用TC或者WinTC来学习。
在这里不介绍编译器的使用方法。
注意,学习过程必须多动手实验。如果有任何术语不明白请立即查资料。
本文不按照一般的讲解顺序讲的。

一.代码的基本要素
先来看一个最简单的程序(新建立空白工程,新建一个.cpp后缀的文件):
#include <stdio.h>
int main( void )
{
    printf("Hello World\n");
    return 0;
}


复制到编译器编辑窗口,运行(VC请使用Ctrl+F5运行,DevC、Code::Block直接在菜单里选择),
你就能看到在弹出的一个黑底窗口上显示出了一行文字。

如果你发现那个窗口一闪而过,那请你把代码改为如下:
#include <stdio.h>
int main( void )
{
    printf("Hello World\n");
    getchar();
    return 0;
}

这样就能看到了。(先自己实验一下,再试试把Hello World改成Kill you,看看会不?)

现在简单解释一下这段代码是什么(双斜杠//后面的是注释,注释对程序运行结果没有任何影响)。

#include <stdio.h>  // 这是头文件,要进行屏幕输入输出就写上,写上就是了
int main( void )    // 这是main函数,表示从这里开始执行,下面一对{ }括起来的就是要执行的代码
{                  // 代码的执行是从上到下按顺序执行的
    printf("Hello World\n");// 屏幕输出,自己试试改成printf("Hello\nWorld\n");看看什么结果
    getchar();      // 等待你的输入,在等待的时候以便你看到输出结果
    return 0;      // 程序结束,main里面执行了这句以后就不再执行其它语句了
} // 注意,每个语句的末尾要有一个分号表示语句结束


以上就是构成一个最简单的程序的基本要素了。
特别注意:只有声明int main才正确,main的其它类型的声明全部都不合规范
int main是唯一正确的声明。main函数的最后必须写上return 0;

下文不会再加上getchar(); 如果你有需要的话请自行加上

二.简单的带变量输出实例
#include <stdio.h>
int main( void )
{
    int a;
    int b;
    a = 1;
    b = 2;
    printf("Result is: %d", a+b);
    return 0;
}

//这是一个简单的计算a+b的程序并输出计算结果,请你运行试试结果正确不。
//试试改计算55+45看看,这个并不难

你实验过后,现在来解释一下:
int a;  // 声明一个名字为a的变量,类型是int,int类型可以保存-2e9到2e9的所有整数
a = 1;  // 让变量a保存数值1
printf("Result is: %d", a+b); // printf的括号里有个逗号,逗号前面是"Result is: %d"
    //是第一个参数,后面的a+b就是第二个参数
    //第一个参数表示要输出的内容,其中,以%号开头的%d所占的地方会被后面的a+b这个参数的
    //计算结果所代替。你可以试试把"Result is: %d"改成"%d"或者"Result is: "试试有什么不同
    //再或者是"A+B=%d?"

三.分支程序结构
#include <stdio.h>
int main( void )
{
    int a;
    printf("你随便输入一个整数试试:");
    scanf("%d", &a);
    if(a < 0)
    {
        printf("a小于0");
    }
    else if(a > 0)
    {
        printf("a大于0");
    }
    else
    {
        printf("a等于0");
    }
    return 0;
}

//这里出现了一个scanf,这个函数的参数和printf几乎一样,只是把输出换成输入
//要输入多个项可以使用"%d %d"这样的格式,后面的参数变量名字前面要加上&,
//要加上&的详细原因以后再讲,你先记着
//if就是分支程序结构的关键,格式为
if(/*这里写一个表达式*/) //注意:/* */ 这一对符号的中间也是注释
{
    //这里写当表达式是真的时候要执行的内容
}
else //else要紧跟着if后面语句块结束的地方, 注意else这一块可写可不写,看你需要
{
    //当上面的表达式是假的时候要执行的内容
}
当然,if里面还可以有if,这就是嵌套。
练习:输入一个分数,以百分制判断这个分数及格还是不及格

更复杂的分支结构:
#include <stdio.h>
int main( void )
{
    int a;
    printf("你随便输入一个正整数试试:");
    scanf("%d", &a);
    if(0 <= a && a < 10)
    {
        printf("%d是一个一位数", a);
    }
    else if(10 <= a && a < 100)
    {
        printf("%d是一个二位数", a);
    }
    else if(100 <= a && a < 1000)
    {
        printf("%d是一个三位数", a);
    }
    else
    {
        printf("%d是一个多于三位数的数", a);
    }
    return 0;
}

//if(0 <= a && a < 10) 表示 0<=a 和 a<10 要同时成立
//类似的还有||,如 if(a==0 || a==1)表示a等于0或者a等于1,
//这两者任意一个成立那么这个表达式就是真的

练习:1.刚才的示例判断位数的程序在输入负数的时候就会有错误的结果,请完善之
      2.输入一个分数,以百分制判断这个分数是:优、良、及格、不及格(优就是大于等于85分)


四.简单的循环结构
#include <stdio.h>
int main( void ) //计算1+2+3+.....+100的结果
{
    int a;
    int sum;
    sum=0;
    for(a=1; a<=100; a++)// 注意到中间有两个分号了吧,这里分开成三个语句
    {
        sum = sum + a;
    }
    printf("Result: %d", sum);
    return 0;
}

//for的结构类似if,中间也是一对大括号括起来的表示要循环执行的语句,for后面不带else
//然后,for(a=1; a<=100; a++)等价于
a=1;
for(/*这里不写*/ ; a<=100; a++)
也就是说,for里的第一个语句是在for之前执行的,实际并不会参与循环
关键的就是第二和第三个语句
第二个语句类似if,
if(/*第二个语句*/)
{
    //执行里面的内容
    //执行完里面的内容就执行一下第三个语句,再重新从if那里开始判断
    //直到第二个语句不成立
}
或者示例代码可以改写为(伪代码):
    a=1;
IF:
    if(a<=100)
    {
        sum = sum + a;
        a++; //a++ 等价 a=a+1; 就是a的值加上1
        goto IF;//跳转到IF:的地方再来,这样的反复执行构成循环
    }

循环的好处就是在重复做同一个操作的时候可以大大简化代码的编写量
sum=0;
for(a=1; a<=100; a++)
{
    sum = sum + a;
}

在这段代码里,a在for循环里从1一直循环到100,当a=101时不满足循环条件后跳出
在循环过程中,把a所出现过的值都加到sum上,就完成了1+2+3+...+100的任务了
如果要计算1+3+5+...+99,就把a++改a=a+2即可。

练习:1.计算1*2*3*...*10
      2.计算1+2+4+8+16+32+...+2^20 (在数学上用a^b表示a的b次方)
      3.计算1+1+2+3+5+8+13+21+34+55+...的前30项的和的结果,规律是后一个数是前两个数的和


五.浮点数:
#include <stdio.h>
int main( void ) //计算1/1+1/2+1/3+...+1/100
{
    int a;
    double sum; // 注意看这里,double就是浮点类型,一般情况下都请使用double
    sum=0;
    for(a=1; a<=100; a++)
    {
        sum = sum + 1.0/a; // 如果你改写成1/a会有什么结果呢?自己实验一下
    }
    printf("Result: %lf", sum); // 注意这里是%lf,和整数输出的不同点
    return 0;
}

浮点数用double声明,还有一种浮点类型是float,float的有效小数位比double少一半,
默认请使用double,以得到更佳的结果

float 类型的输入输出格式要用%f
double类型的输入输出格式要用%lf

整数除法和浮点除法:
2/3  的结果是0
2.0/3 的结果是0.66666666
两个整数的除法的结果仍然是整数,小数部分直接舍弃
两个浮点数或者浮点数与整数的除法结果就是浮点数
对这个性质要小心并加以利用。