C语言学习(3)

一、C语言中循环

  1. 三种循环

    第一种: for循环

    语法:for(表达式1; 表达式2; 表达式3) //先执行表达式1,然后判断表达式2是否为真,在执行代码

    {

      执行的代码

    }

    注意:花括号中的代码只有一句话,那么花括号可写可不写

    花括号中的代码有多句话,一定要写

    难点:循环的嵌套

#include<stdio.h>

int main()
{
    int i=0;
    int j=0;
    //从外到内执行
    //规律: 外层循环成立,里面的循环会全部执行一遍,然后再判断外层循环
    for(i=0; i<5; i++) //外层循环
    {
        printf("外层循环成立了:%d\n",i);
        for(j=0; j<5; j++)  //内层循环
        {
            printf("里面的循环执行%d\n",j);
        }
    }
}

 

    写法一: for( ; i<5; i++)

    写法二: for( ; i<5; )

    写法三: for( ; ;) //死循环

例子如下:

#include <stdio.h>

int main()
{
    int i=0;
    //循环打印5次
    /* for(i=0; i<5; i++) //常规的写法
    {
        printf("hello world!\n");
    } */
    
    /* for(; i<5; i++)
    {
        printf("hello world!\n");
    } */
    
    for(; i<5; )
    {
        printf("hello world!\n");
        i++;
    }
        
/*     for(;;)  //死循环
    {
        printf("hello gec!\n");
    } */
}

 

    第二种: while循环

    语法:while(条件) //条件为真,则执行循环语句

    {

    }

    while(i<5)

    {

      i++;

    }

    while(1) //等价于 for(;;) while('a')死循环

    {  

    }

    第三种:do while循环

    do

    {

      执行的代码

    }while(条件);

    注意: do while循环先斩后奏,会先执行一次循环,然后再判断条件是否成立

while和do while的例子如下:

#include <stdio.h>

int main()
{
    int i=0; 
    while('a')// while(1) 表达式0 就是假的   非零就是真
    {
        printf("死循环!\n");
        
    }
    while(i<5)
    {
        printf("hello gec!\n");
        i++;
    }
    
    
    int a=88;
    int b=99;
    do
    {
        printf("另外一个循环!\n");
    }while(a<10&&b>100);
}

 

  2. break和continue

    break --》彻底结束循环

#include<stdio.h>

int main()
{
    int i;
    for(i=0; i<10; i++)
    {
        if(i==5)
            //break; //结束整个循环
            continue; //结束当前这一次循环,进入下一次循环
        
        printf("循环正常进行%d次!\n",i);
    }
}

 

    continue --》结束本次循环,进入下一次循环

 

  练习:

  1. for循环打印99乘法表

#include <stdio.h>

/*
    for循环打印9*9乘法表
    1*1=1
    1*2=2 2*2=4
    1*3=3 2*3=6 3*3=9
    思路:用两个变量i,j分别表示两个要相乘的数
          循环就是找数学规律:
              第一行:j  1   i 1--》j
              第二行:j  2   i 1--》j
              第三行:j  3   i 1--》j
*/

int main()
{
    int i,j;
    for(j=1; j<=9; j++) //总共9行
    {
        for(i=1; i<=j; i++) //每一行中i的变化次数跟j有关
        {
            printf("%d*%d=%-2d",i,j,i*j); //打印每一行的乘法表
        }
        //打印完一行在换行
        printf("\n");
    }
}

 

 

  2. for循环实现*三角图案

#include <stdio.h>
/*
    *       
   ***               
  *****   
*/
int main()
{
    int n;
    int i,j,k;
    printf("请输入你想打印多少行的钻石图案,输入奇数!\n");
    scanf("%d",&n);
    //先分析搞定钻石图案的上半部分的规律,总共n/2+1行
    for(i=1; i<=(n/2+1); i++) //上半部分
    {
        for(j=0; j<(n/2+1)-i; j++) //打印空格的数目
            printf(" ");
        for(k=0; k<2*i-1;  k++) //打印型号的数目
            printf("*");
            
        //换行
        printf("\n");
    }
    
}    

 

  3.for循环实现钻石图案

#include <stdio.h>
/*
   *
  ***
 *****    n=5
  ***
   *
   
   *
  ***
 *****  
*******   n=7
 *****
  ***
   *
*/ 
int main(int argc, char *argv[]) {
    
    int row, half, i, j;
    printf("输入你的想要的钻石行数:\n");
    scanf("%d",&row);
    
    //打印钻石上半部分
    half = row / 2 + 1;    
    
    for(i = 1; i <= half; i++)
    {
        //打印前导空格
        for(j = 1; j <= half - i; j++)
        {
            printf(" ");    
        }
        //打印星号
        for(j = 1; j <= 2 * i - 1; j++)
        {
            printf("*");    
        }
        //换行
        printf("\n");
    }
    
    //打印钻石下半部分    
    for(i = 1; i < half; i++)
    {
        //打印前导空格
        for(j = 1; j<= i; j++)
        {
            printf(" ");    
        }
        //打印星号
        for(j = 1; j <= 2 * (half - i - 1) + 1; j++)
        {
            printf("*");    
        }
        //换行
        printf("\n");
    }                  
    return 0;
}

 

  4. while循环实现任意输入一个整数,编程得到这个整数总共多少位,各个位分别是多少

    123/10 --》12 --》12/10 --》1 1/10--》0

    123%10 --》3 12%10 --》2 1%10--》1

#include <stdio.h>

int main()
{
    int num;
    int count=0;
    printf("请输入任意一个整数!\n");
    scanf("%d",&num);
    
    //求出num的各个位
    while(num!=0) 
    {
        printf("num低位到高位依次是:%d\n",num%10);
        count++;
        num=num/10;
    }
    //打印num是几位数
    printf("你刚才输入的整数是:%d 位数!\n",count);
}

 

二、C语言的条件判断

  1. 第一种:单个情况的判断

    if(条件)

    {

      代码

    }

 

  2.第二种:两种情况的判断,非此即彼

    if(条件)

    {

    }

    else

    {

    }

#include <stdio.h>

int main()
{
    int a=10;
    int b=100;
    if(a>b)
    {
        printf("a>b\n");
    }
        //printf("我是来捣乱的!\n"); //if和else之间不能穿插其他语句,编译会报错
    else
    {
        printf("a<=b\n");
    }
        
}

 

  3.第三种:大于等于三种情况的判断

    if(条件)

    {

    }

    else if(条件)

    {

    }

    else if(条件)

    {

    }

    else

    {

    }

    注意:if和else之间不能出现其他语句

    if或者else花括号里面的语句如果只有一条语句,花括号可以省略

  练习:

  1. if语句实现求5个整数的最大值和最小值

#include <stdio.h>

int main()
{
    int n1,n2,n3,n4,n5;
    printf("请输入五个整数!\n");
    scanf("%d%d%d%d%d",&n1,&n2,&n3,&n4,&n5);
    //最大值
     int max=n1; //保存最大值,先假设n1是最大的
    //依次轮流跟max进行比较
    if(n2>max)
        max=n2;
    if(n3>max)
        max=n3;
    if(n4>max)
        max=n4;
    if(n5>max)
        max=n5; 
    
    //最小值
    int min=n1; //保存最小值,先假设n1是最小的
    //依次轮流跟min进行比较
    if(n2<min)
        min=n2;
    if(n3<min)
        min=n3;
    if(n4<min)
        min=n4;
    if(n5<min)
        min=n5;
    printf("五个数的最大值是:%d\n",max);
    printf("五个数的最小值是:%d\n",min);
}

 

  2. 编程实现任意输入6个整数,从小到大排个序(升序)

#include <stdio.h>

int main()
{
    int i,j,a[6],cup;
    printf("请输入6个不同数据:\n");
    for(i = 0;i<6;i++)//循环输入整数
    {
        scanf("%d",&a[i]);
    }
    for(i=0;i<5;i++)//判断第一个数与其他数的大小,再接着下一个,最后一个也就被比较了
    {
        for(j=i+1;j<6;j++)//判断除了筛选出来的那个数后面的数
        {
            if(a[i]>a[j])//前面数大于后面数,调换位置
            {
                cup=a[i];
                a[i]=a[j];
                a[j]=cup;
            }
        }
    }
    printf("排列顺序从小到大为:");
    for(i=0;i<6;i++)//循环打印打印结果
    {
        printf("%d  ",a[i]);
    }
    printf("\n");
    return 0;
}

 

三、C语言中选择条件分支语句(开关语句)

  1. 语法

    swich(变量) //标准写法

    {

      case 1:

      代码;

      break; //结束switch,break只能在循环或者switch中使用

      case 2:

      代码;

      break;

      default:

      代码;

      break;

    }

    特点:switch中的变量只能是整数,字符,常量

    switch有变形形式

    第一种: default 可写可不写

    第二种: switch中的break是可以不写,写和不写含义完全不同

    第三种: default跟case的书写顺序可以随意颠倒

    总结:switch一直执行,直到遇到break才结束switch,没有遇到break一直往下运行

#include <stdio.h>

int main()
{
    int n;
    /*     float m=15.6;
    switch(m) //错误,switch要求只能是整数,字符,整型常量
    {
        case 15.6:
            printf("m是15.6");
            break;
        default:
            printf("m不是15.6");
            break;
    } */
    char c = 'i';//字符
    switch (c)
    {
    case 'i':
        printf("iiii\n");
        break;
    default:
        printf("ooooo\n");
        break;
    }

    printf("请输入数字 1-7 分别代表星期一到星期天!\n");
    scanf("%d", &n);
    // if(n==1) else if(n==2) else
    switch (n)
    {
    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和2\n");
        break;
    }
    printf("你输入的是%d\n",n);
}

 

四、作业:

  1. switch做一个功能选择菜单,重复选择不同的功能

    printf("请你选择如下功能!\n");

    1. 登录

    2. 借书

    3. 还书

    4. 修改账户密码

    5. 查询

#include <stdio.h>

int main()
{
    int mode;
    printf("请选择如下功能!\n");
    printf("1.登录\n");
    printf("2.借书\n");
    printf("3.还书\n");
    printf("4.修改账户密码\n");
    printf("5.查询\n");
    
    while(1)
    {
        scanf("%d",&mode);
        switch(mode)
        {
            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;
            default:printf("Error\n");break;        
        }
    }
}
View Code

 

  2. switch键盘任意输入年,月,日, 告诉我这个日期是这个一年的第几天

    1987 6 23

#include <stdio.h>

/*
*    switch键盘任意输入年,月,日,  
*    告诉我这个日期是这个一年的第几天
*    1987  6   23 
*/

int main()
{
    int year,mon,day,a,MON;
    printf("=====判断日期是今年的第几日=====\n");
    printf("请输入年份 月份 日:\n");
    scanf("%d %d %d",&year,&mon,&day);
    
    //闰年能被4整除,却不能被100整除。能被400整除的数。
    if(year%400==0)         
        a=1;        
    else
    {
        if(year%4==0&&year%100!=0)
            a=1;
        else
            a=0;
    }
    if(a==1)//闰年
    {
        switch(mon)//月份
        {
            case 1:MON=0;break;//1月说明还没过完,看天数
            case 2:MON=31;break;//2月说明1月已经过完,1月就有31天
            case 3:MON=60;break;//3月说明1,2月已经过完,1,2月就有60天(闰年2月29日,则31+29=60)
            case 4:MON=91;break;//以此类推……
            case 5:MON=121;break;
            case 6:MON=152;break;
            case 7:MON=182;break;
            case 8:MON=213;break;
            case 9:MON=244;break;
            case 10:MON=274;break;
            case 11:MON=305;break;
            case 12:MON=335;break;
        }
        MON=MON+day;//计算今日是今年的第几天
        printf("%d 此年是闰年\n",year);
        printf("今天是此年的第%d天!\n",MON);
    }
    else//非闰年
    {
        switch(mon)
        {
            case 1:MON=0;break;//1月说明还没过完,看天数
            case 2:MON=31;break;//2月说明1月已经过完,1月就有31天
            case 3:MON=59;break;//3月说明1,2月已经过完,1,2月就有59天(非闰年2月28日,则31+28=59)
            case 4:MON=90;break;//以此类推……
            case 5:MON=120;break;
            case 6:MON=151;break;
            case 7:MON=181;break;
            case 8:MON=212;break;
            case 9:MON=243;break;
            case 10:MON=273;break;
            case 11:MON=304;break;
            case 12:MON=334;break;
        }
        MON=MON+day;//计算今日是今年的第几天
        printf("%d 此年非闰年\n",year);
        printf("今天是此年的第%d天!\n",MON);
    }
    return 0;
    
}
View Code

 

  3. 用循环求出这种表达式的结果

  1+1.0/2-1.0/3+1.0/4-1/5.........1.0/n

    思路一: 加法和减法分开来计算

    思路二:-1的n次方表示正负号

    n从键盘输入

#include <stdio.h>

/*
* 用循环求出这种表达式的结果
* 1+1.0/2-1.0/3+1.0/4-1/5.........1.0/n
* 思路一: 加法和减法分开来计算
* 思路二:-1的n次方表示正负号
* n从键盘输入
*
*以上类举可以看出,当分母为双数的加起来,分母为单数的时候减去
*/


int main()
{
    int a,i;
    float sum = 1.0;//sum=1.0是因为这个数怎么加都是有1,
    float k = 1.0;//正负号,首先为正
    printf("请输入一个数:\n");
    scanf("%d",&a);
    for(i=2;i<=a;i++)
    {
        sum += k/i;//总数求和,双数加,单数减
        k *= -1;//替换符号
    }
    printf("总和为:%f\n",sum);
    return 0;
    
}
View Code

 

posted @ 2020-03-06 15:08  Geek_Jian  阅读(436)  评论(0编辑  收藏  举报