从零开始学编程---第一步-C语言(九)

时间:2014-03-05 11:24    点击:

两个值的交换绝没有你们想的那么简单
比如要交换a,b的值
并不是
a=b;
b=a;
这是错误的,更不能a==b
我们知道=号相当于一个向左的箭头
假设a=1 b=2
a=b 就是b的值给了a b是2 所以a也变成了2
b=a a的值给了b,因为a是2了,所以b也是2
最终结果 a,b都是2 并没有交换

我们需要一个代理者来帮我们完成交换
我们可以定义一个专门用来交换的变量
int x;
这样就可以交换了
x=a;    a的值给了x a是1 所以x也变成了1
a=b;    b的值给了a b是2 所以a也变成了2
b=x;    x的值给了b x是1 所以b也变成了1 (x其实就是a的值,成功完成交换)
结果 a=2 b=1

下面这个程序说明交换过程
#include <stdio.h>
main()
{
      int a,b,x;
      printf("请输入数字a:\n");
      scanf("%d",&a);
      printf("请输入数字b:\n");
      scanf("%d",&b);

      printf("开始的a=%d b=%d\n",a,b);
      x=a;
      a=b;
      b=x;
      printf("交换后的a=%d b=%d\n",a,b);
    

}


知道怎么交换两个数的值了,可以开始程序了

程序如下
#include <stdio.h>
main()
{
      int a,b,c,x;
      printf("请输入3个数\n");
      scanf("%d%d%d",&a,&b,&c);
      printf("下面比较3个数的大小\n");
      if(a<b)
      {
          x=a;
          a=b;
          b=x;
      }
      if(a<c)
      {
          x=a;
          a=c;
          c=x;
      }
      if(b<c)
      {
          x=b;
          b=c;
          c=x;
      }

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

}

注意:这里是3条单独的if语句,不能用 else,原因你在程序中就会发现
如果把<号改成>号 就是从小到大排列

这其实就是冒泡排序,这个是最简单的,以后我还会详细介绍
如果要比较3个以上的数的大小也是用上面的方法

这里没懂没关系,因为后面还会要用这个方法的,到时候你兴许会明白一些了
你现在也该知道我们程序要求的逻辑越来越难了吧,没关系一步一步来,你终会懂的,从这里开始,你需要耐心了
时刻转动你的头脑,加油吧


今天我来介绍一种新的运算符:条件运算符
条件运算符的形式为?:

看例子
if(age>=18)
{prrintf("你已成年\n");}
else
{printf("你未成年\n");}

用条件运算符可以写成
(age>=18)?(printf("你已成年\n")):(printf("你未成年\n"));

这两者的功能完全相同
几乎任何的if else语句都可以写成条件语句,条件语句需要较少的输入,你也不会漏掉大括号,并且条件语句运行也更高效,因为它会编译成更简练的代码

(age>=18)?(printf("你已成年\n")):(printf("你未成年\n"));
可以理解成如果条件为真,就做第一件事情,否则,就做第2件事情

不要把每个if else语句都去用条件运算符来替换,很多时候if else语句更容易懂,而且有些语句太复杂,不容易用条件运算符替换

条件运算符有一个优点,它可以出现在if语句不能出现的地方

printf("你%s",(age>=18)?("已成年\n"):("未成年\n"));
又如
printf("I ate %d apple%s",num,(num>1)?("s."):("."));

两个应该都能看懂吧


求三个数最大值现在让我们用条件运算符来写
#include <stdio.h>
main()
{
    int a,b,c;
    printf("输入3个数:\n");
    scanf("%d%d%d",&a,&b,&c);
    printf("最大数为%d\n",(a>b?a:b)>c?(a>b?a:b):c);

}

怎么样,很简短吧,你可能看着有点复杂
(a>b?a:b)>c?(a>b?a:b):c 这是双重条件语句
我来分析它的流程
假设a=3,b=2,c=1
首先先求括号里的 a>b?a:b 如果a大于b 显示a 否则显示b 这里a比b大显示a
这样,这个条件语句就变为 a>c?a:c a比c大,显示a 所以最大数为a

(a>b?a:b)>c?(a>b?a:b):c用if-else表示为
if(a>b)             
    {
        if(a>c)
        {
            max=a;
        }
        else   
        {
            max=c;
        }  
    }
else       
{
        if(b>c)
        {
            max=b;
        }
        else   
        {
            max=c;
        }
    }


看程序
#include <stdio.h>
main()
{
    int a,b,c,max;
    printf("输入3个数:\n");
    scanf("%d%d%d",&a,&b,&c);
//    printf("%d",(a>b?a:b)>c?(a>b?a:b):c);
    if(a>b)               //?号的前半段
    {
        if(a>c)
        {
            max=a;
        }
        else      //else if(c>a)     既然a>b    c>a    所以max=c
        {
            max=c;
        }  
    }
    else         //else if(b>a)      ?号的后半段
    {
        if(b>c)
        {
            max=b;
        }
        else     //else if(c>b)      既然b>a    c>b    所以max=c
        {
            max=c;
        }
    }

    printf("最大数为%d\n",max);

}

这个会有点复杂,你必须耐心的去理解,只要你能看懂上面的程序,你的逻辑思维有一定的进步了


好了,关于条件运算符就到这里,这个其实并不是重点,你没看懂也没关系,毕竟很少用这个,如果觉得条件语句逻辑很复杂,你还是老老实实用if-else吧,你得先把你的逻辑思维给练好,以后再去碰这个吧


另外说一下,为什么上面程序else没有硬加上条件
因为上面的else代表两个条件 还有一个条件就是 等于
我重新做个注释

if(a>b)                //?号的前半段
     {
         if(a>c)
         {
             max=a;
         }
         else       //else if(a=c)      既然a>b     a=c     所以max=c也就是max=a
         {
             max=c;
         }  
     }
     else          //else if(b=a)       ?号的后半段
     {
         if(b>c)     
         {
             max=b;
         }
         else      //else if(c>b)       既然b=a     c>b     所以理所当然max=c
         {
             max=c;
         }
     }



所以这个程序你就是输入两个相等的数字它也能正确算出哪个数最大

if语句对简单的数据测试很好用,但是如果测试数据有很多,你就不得不嵌套多个if语句了,这样写容易混乱并且难以维护

比如写一个程序显示星期几

今天是星期几?请输入数字:
1,星期一
2,星期二
3,星期三
4,星期四
5,星期五
6,星期六
7,星期日


用if语句表示为
if(a==1)
{
      printf("今天是星期一\n");
}
else if(a==2)
{
      printf("今天是星期二\n");
}
else if(a==3)
{
      printf("今天是星期三\n");
}
else if(a==4)
{
      printf("今天是星期四\n");
}
else if(a==5)
{
      printf("今天是星期五\n");
}
else if(a==6)
{
      printf("今天是星期六\n");
}
else if(a==7)
{
      printf("今天是星期日\n");
}
else
{
      printf("请输入数字1-7\n");
}


这个很麻烦,而且程序也不清晰

所以我们要学一种新的语句switch语句

switch语句的格式

switch()
{
case:
..........
default:
}

把这个程序用于上面的程序中如下:
#include <stdio.h>
main()
{
     int a;
     printf("今天是星期几,请输入数字:\n");
     scanf("%d",&a);

     switch(a)
     {
     case(1):printf("今天是星期一\n");
     case(2):printf("今天是星期二\n");
     case(3):printf("今天是星期三\n");
     case(4):printf("今天是星期四\n");
     case(5):printf("今天是星期五\n");
     case(6):printf("今天是星期六\n");
     case(7):printf("今天是星期日\n");
     default:printf("请输入数字1-7\n");
     }
}


这样很清晰吧,switch()括号里放的是变量(只能是整型和字符变量) case()括号里放的是变量的值,case是根据变量的值来决定行为路线的,如果a=2,就会打印今天是星期二
case可以不按顺序排列 default也是 default是缺省的意思,它是可选的,不用它也可以,它的工作方式和else差不多,它在上面程序的含义就是如果用户没有输入1-7的数字,就会执行default后面的语句


但上面的程序并不理想,如果你输入3
它就会打印
今天是星期三
今天是星期四
今天是星期五
今天是星期六
今天是星期日

打印星期三后面所有的,这不是我们希望的
为 什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况, C语言还提供了一种break语句

break是中断的意思,正如它的意思,它的功能就是让程序在某个地方断开
它基本就出现在循环语句(马上就会学了)和switch语句中
它的格式就是
break;

很简单吧

我们把break加入上面switch语句中


#include <stdio.h>
main()
{
     int a;
     printf("今天是星期几,请输入数字:\n");
     scanf("%d",&a);
   
     switch(a)
     {
     case(1):printf("今天是星期一\n");
             break;
     case(2):printf("今天是星期二\n");
             break;
     case(3):printf("今天是星期三\n");
             break;
     case(4):printf("今天是星期四\n");
             break;
     case(5):printf("今天是星期五\n");
             break;
     case(6):printf("今天是星期六\n");
             break;
     case(7):printf("今天是星期日\n");
             break;
     default:printf("请输入数字1-7\n");
     }
}

注意:因为default在最后面,所以它不需要break语句,如果它在前面或中间,就要加上break语句

我们还可以用switch语句做个简易的计算器
#include <stdio.h>
main()
{
int a,b,s;
char c;
printf("请输入算术表达式: a(+,-,*,/)b \n");
scanf("%d%c%d",&a,&c,&b);
switch(c){
case '+': printf("%d\n",a+b);break;
case '-': printf("%d\n",a-b);break;
case '*': printf("%d\n",a*b);break;
case '/': printf("%d\n",a/b);break;
default: printf("输入错误\n");

}
}

呵呵,能懂吧


在使用switch语句时还应注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。
2.在case后,允许有多个语句,可以不用{}括起来。
3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4.default子句可以省略不用。

来源:幻想编程//所属分类:站长原创/更新时间:2014-03-05 11:24
顶一下
(10)
100%
踩一下
(0)
0%
上一篇:从零开始学编程---第一步-C语言(八)
下一篇:从零开始学编程---第一步-C语言(十)
相关内容