C语言自学教程--郝斌--第三讲

if的常见问题解析

if(3 > 2);
//等价于
if(3 > 2)
    ;	//这是一个空语句
if(表达式1)
    A;
else
    B;
//是正确的
if(表达式1);
	A;
else
    B;
//是错误的
if (表达式1)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
else
    D;
//即使表达式1和2都成立,也只会执行A语句
if (表达式1)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
//这样写语法不会出错,但逻辑上有漏洞
if (表达式1)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
else (表达式4)
    D;
//这样写是不对的,正确的写法是:
//要么去掉7行的(表达式4)
//要么在7行的else后面加if
if (表达式1)
    A;
else if (表达式2)
    B;
else if (表达式3)
    C;
else (表达式4);
    D;
//这样写语法不会出错,但逻辑上是错误的
else (表达式4);
    D;
//等价于
else e
    (表达式4);
D;

循环

定义:某些代码会被重复执行。

分类
for
while
do...while
//强制类型转化
//格式:(数据类型)(表达式)                                 
//功能:把表达式的值强制转化为前面所执行的数据类型             
//例子:
(int)(4.5+2.5);	//最终值是6
(float)(5);		//最终值是5.000000 

浮点数的存储所带来的问题

  • float和double都不能保证可以精确的存储一个小数
  • 循环中更新的变量不能定义成浮点型
//有一个浮点型变量x,如何判断x的值是否是零
if(|x-0.000001| <= 0.000001)
    是零;
    else
        不是零;
//求1到100之间的奇数之和

#include <stdio.h>

int main(void)
{
    int i;
    int sum = 0;
    
    for(i=1; i<101; ++i)
    {
        if (i%2 == 1)
            sum += i;
    }
    printf("sum = %d\n",sum);
    
    return 0;
}
//求1到100之间的奇数的个数

#include <stdio.h>

int main(void)
{
    int i;
    int cnt = 0;	//个数一般用cnt表示
    
    for(i=1; i<101; ++i)
    {
        if (i%2 == 1)
            ++cnt;
    }
    printf("cnt = %d\n",cnt);
    
    return 0;
}
//求1到100之间的奇数的平均值

#include <stdio.h>

int main(void)
{
    int i;
    int sum = 0;
    int cnt = 0;	//个数一般用cnt表示
    float avg;		//average的缩写
    
    for(i=1; i<101; ++i)
    {
        if (i%2 == 1)
        {
            sum += i;
            ++cnt;
        }
    }
    avg = 1.0*sum / cnt;	//1.0默认是double类型
    
    printf("sum = %d\n",sum);
    printf("cnt = %d\n",cnt);
    printf("avg = %f\n",avg);
    
    return 0;
}
//求1到100之间的奇数之和,再求1到100之间的偶数之和

#include <stdio.h>

int main(void)
{
    int i;
    int sum1 = 0;	//奇数之和
    int sum2 = 0;	//偶数之和
    
    for(i=1; i<101; ++i)
    {
        if (i%2 == 1)
        {
            sum1 += i;
        }
        else
        {
            sum2 += i;
        }
    } 
    printf("奇数之和 = %d\n",sum1);
 	printf("偶数之和 = %d\n",sum2);
    
    return 0;
}

多个for循环的嵌套使用

for(1; 2; 3)
    for(4; 5; 6)
        A;
B;
//整体是两个语句,1、2、3行是第一个语句,4行是第二个语句

进制

1. 什么叫n进制?逢n进一

2. 把r进制转化成十进制?

3.十进制转化成r进制?除二取余法(除r取余,直至商0,余数倒序排列)

4.不同进制所代表的数值之间的关系?同一个数字的不同表现形式

一些琐碎的运算符知识

++i;	//前自增
i++;	//后自增

//相同:最终都使i的值增加1
//不同:前自增整体表达式的值是i加1之后的值,后自增整体表达式是i加1之前的值

为什么会出现自增?

  1. 代码更精炼

  2. 自增的速度更快

学习自增要明白的几个问题

  1. 我们编程时应该尽量屏蔽掉前自增和后自增的差别
  2. 自增表达式最好不要最为一个更大的表达式的一部分来使用(后自增和前自增单独成一个语句,不要把它最为一个完整符合语句的一部分来使用)

sequence points : At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.

三目运算符

A?B:C;
//等价于
if (A)
    B;
else
    C;

逗号表达式

(A,B,C,D);
//功能:从左到右执行,最终表达式的值是最后一项的值

while表达式

While (表达式)
    语句; 
//用for实现1到100的求和

# include <stdio.h>

int main(void)
{
    int sum = 0;
    int i;
    
    for (i=1; i<101; ++i)
    {
        sum = sum + i;
    }
    printf("sum = %d\n", sum);
    
    return 0;
}
//用while实现1到100的求和

# include <stdio.h>

int main(void)
{
    int sum = 0;
    int i;
    
    i = 1;
    while (i < 101)
    {
        sum = sum + i;
        ++i;
    }
    printf("sum = %d\n", sum);
    
    return 0;
}

//while和for可以相互转化,但for的逻辑性更强,更不容易出错,推荐多使用for
//求回文数

# include <stdio.h>

int main (void)
{
    int val;	//存放待判断的数字
    int m;
    int sum = 0;
    
    printf("请输入您需要判断的数字: ");
    scanf("%d", &val);
    
    m = val;
    while (m)
    {
        sum = sum * 10 + m%10;
        m /= 10;
    }
    if (sum == val)
        printf("Yes!\n");
    else
        printf("No!\n");
}
//如何看懂一个程序举例_2_斐波那契数列

# include <stdio.h>

int main(void)
{
    int n;
    int f1, f2, f3;
    int i;
    
    f1 = 1;
    f2 = 2;
    
    printf("请输入您需要求的项的序列: ");
    scanf("%d", &n);
    
    if (1 == n)
    {
        f3 =1;
    }
    else if (2 == n)
    {
        f3 =2;
    }
    else
    {
        for(i=3; i<=n; ++i)
        {
            f3 = f1 + f2;
            f1 = f2;
            f2 = f3;
        }
    }
        
    return 0;
}

什么时候用while,什么时候用for?

  • 没法说,用多了自然而然就知道了

do while

do
{
    语句A;
} while (表达式);
//do while 主要用于人机交互
//一元二次方程

# include <stdio.h>
# include <math.h>

int main(void)
{
    double a, b, c;
    double delta;
    double x1, x2;
    char ch;
    
    do
    {
        printf("请输入一元二次方程的三个系数:\n");
        printf("a = ");
        scanf("%lf", &a);

        printf("b = ");
        scanf("%lf", &b);

        printf("c = ");
        scanf("%lf", &c);

        delta = b*b - 4*a*c;

        if(delta > 0)
        {
            x1 = (-b + sqrt(delta)) / (2*a);
            x2 = (-b - sqrt(delta)) / (2*a);
            printf("有两个解,x1 = %lf, x2 = %lf\n",x1, x2);
        }
        else if (0 == delta)
        {
            x1 = x2 = (-b) / (2*a);
            printf("有唯一解,x1 = x2 = %lf\n",x1,x2);
        }
        else
        {
            printf("无实数解!\n");
        }
        
        printf("您想继续吗?(Y/N): ");
        scanf(" %c", &ch);	//%c前面必须得加一个空格,原因略
        
    }while ('y'==ch || 'Y'==ch);
        
    return 0;
}