精华内容
下载资源
问答
  • 4.1任务1:打印数字(时间:25分钟) 4.1.1 任务描述 编程求一个四位自然数ABCD,它乘以A后变成DCBA。 4.1.2 任务目的 逐渐建立使用循环进行编程的思路:寻找...掌握while,do-while,for循环语句结构和执行流程

    4.1任务1:打印数字(时间:25分钟)
    4.1.1 任务描述
    编程求一个四位自然数ABCD,它乘以A后变成DCBA。
    4.1.2 任务目的
    逐渐建立使用循环进行编程的思路:寻找规律;写出循环体中需要重复操作的部分,其中包括改变修改变量值的语句;确定循环判断条件;完善循环结构,定义循环变量;完善整体程序,添加输入输出操作。
    掌握while,do-while,for循环的语句结构和执行流程。
    复习面向过程编程的编程思路。
    4.1.3 任务要求
    分别使用while,do-while,for循环完成此任务,
    添加适当的注释信息。
    给出人性化的输入输出提示信息。
    4.1.4 难点提示
    注意循环体中语句的顺序,先进行相关条件判断再进行其它操作。
    注意循环语句中的循环判断条件应为逻辑或关系表达式。
    注意在循环体中应有使循环结束的设置,即有改变循环变量的值的操作。
    4.2任务2:查找数字(时间:25分钟)
    4.2.1 任务描述
    编写一个程序,从键盘上接收一个整数,并且从1-100之间找到能被它整除的整数,并输出找到的整数。
    4.2.2 任务目的
    复习关系和逻辑表达式的使用。
    掌握如何使用while、do-while、for循环完成上面要求。
    建立使用循环完成面向过程编程的思路。
    4.2.3 任务要求
    要求分别使用while和for循环完成此任务。
    使用关系、逻辑运算符与if语句结合使用完成查找判断。
    4.2.4 难点提示
      注意: 能被整除的意思是:除以从键盘上接收的整数,判断余数是否为0。
    4.3任务3:模拟银行输入密码操作(时间:30分钟)
    4.3.1 任务描述
      模拟XX银行输入密码的操作,在程序开始时提示用户输入密码,如果密码输入不正确(可以事先自己随意确定一个密码,如果输入不是这个密码,就认为是错误的),则要求用户重新进行输入;如果输入正确,可以直接输出“密码输入正确,请选择其他操作.”即可,然后程序结束。如果用户连续三次输入错误,程序也将结束,可以提示用户“密码输入有误超过3次,您的帐户已经被冻结,请明天再输入.”。
    4.3.2 任务目的
    掌握在循环中使用if语句实现具体功能。
    掌握break语句和continue语句在循环中的使用。
    4.3.3 任务要求
    用户输入正确,则输出“密码输入正确,请选择其他操作.”即可
    用户输出错误,则提示用户重新输入。
    如果用户连续3次输入错误,则将用户帐号进行冻结,要求用户明天再输入。
    4.3.4 难点提示
      提示:可以通过循环的判断条件限定用户的输入次数,如果循环正常结束,说明用户已经连续输入错误三次,则应提示用户帐号已经被冻结。在循环中可以通过设置标志位的方式标识循环是正常结束,还是由于输入正确后而跳出循环。然后再在循环体后面判断标志位来进行判断输出是输入正确还是帐户冻结。
    4.4任务4:打印图形(时间:15分钟)
    4.4.1 任务描述
    使用循环语句实现下面的图形:
    *****
    ****
    ***
    **
    *

    4.4.2 任务目的
    理解二重循环的意义,以及循环的流程。
    理解如何使用二重循环完成程序实现。
    4.4.3 任务要求
    先完成此图形,然后修改程序,使程序可以根据用户输入的数据进行打印,例如:上图是用户输入5时打印的结果。
    4.4.4 难点提示
      提示:最外层循环确定的是行数,而内层循环则确定每行有多少个”*”。且内层循环的取值或判断条件一般都取决于最外层循环变化。
      
    五、课后作业
    5.1 作业1 打印图形(时间:30分钟)
    5.1.1 作业任务
    使用循环语句输出一个以*号组成的菱形。要求行数从键盘接收。
    5.1.2 任务要求
    (1)在输出数据前,应给出用户提示信息。
    (2)程序在编写时,注意程序的格式,例如:缩紧、空行、空格的使用。
    (3)编程原则:程序应保证结清晰,容易理解,并添加适当的注释说明信息。
    5.1.3 难点提示
    内层循环和外层循环格子要完成的任务。
    5.2 作业2 打印图形(时间:30分钟)
    5.2.1 作业任务
    编写一个程序,它能够读入一个正方形的边长,然后输出一个由星号和空格组成的边长为刚刚读入的边长的空心正方形。例如,程序读入的边长是5,那么它应输出边长为5的空心正方形。
    5.2.2任务要求
      同作业1
    5.2.3 难点提示
    同作业1。



    5.3 作业3 进制转换(时间:25分钟)
    5.3.1 作业任务
      设计一个程序,该程序能将一个十进制整数,输出将其转化为二进制数以后有多少个1.例如3转化为二进制是11,有两个1,就输出2;5转化为二进制是101,也输出2.
    5.3.2任务要求
    1.要求用户从键盘接收该十进制数。
      2.程序在编写时,注意程序的格式,例如:缩紧、空行、空格的使用。
      3.编程原则:程序应保证结清晰,容易理解,并添加适当的注释说明信息
    5.3.3难点提示
    十进制转换为二进制的方法:
    以45为例
    47/2=23 余数1
    23/2=11 余数1
    11/2=5 余数1
    5/2=2 余数1
    2/2=1 余数0
    1/2=0 余数1
    得到的余数最底层的作为最高位,最顶层的作为最低位 得到的二进制数是:101111.

    5.4 作业4 (时间:25分钟)
    5.4.1 作业任务
    有一条长阶梯,若每步跨2阶最后剩下1阶;若每步跨3阶最后剩下2阶;若每步跨5阶最后剩下4阶;若每步跨6阶最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。编程计算这条阶梯共有多少阶?
    5.4.2 任务要求
    分别用for循环和while循环编写程序。
    5.4.3 难点提示
    阶梯数目为n则:(n%2==1)&&(n%3==2)&&(n%5==4)&&(n%6==5)&&(n%7==0)

     

    答案:

     

    #include <stdio.h>

    int main()
    {

        /*4.1.1
         * 方法一
     int ABCD = 0;
        int DCBA = 0;
        int A = 0;
        int B = 0;
        int C = 0;
        int D = 0;

        for(ABCD = 1000; ABCD < 10000; ABCD++)
        {
            A = ABCD / 1000;
            B = ABCD / 100 - A * 10;
            C = ABCD / 10 - A * 100 - B * 10;
            D = ABCD - A * 1000 - B * 100 - C * 10;

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

            DCBA = D * 1000 + C * 100 + B * 10 + A;

            if ( ( ABCD * A ) == DCBA)
            {
                printf("The Number is %d\n",ABCD);
            }
        }

        return 0;
        *
        */

        /*
         * 方法二

     int ABCD = 0;
        int DCBA = 0;
        int A = 0;
        int B = 0;
        int C = 0;
        int D = 0;

        while(ABCD<10000){
          ABCD++;
           A=ABCD/1000;
           B=(ABCD-A*1000)/100;
           C=(ABCD-A*1000-B*100)/10;
           D=ABCD%10;
           //倒叙
           DCBA=D*1000+C*100+B*10+A;

          if((ABCD*a)==DCBA){
          printf("四位自然数ABCD,它乘以A后变成DCBA:%d\n",ABCD);}
         }

         return 0;
         *
         */

        /*
         * 方法三

     int ABCD = 0;
        int DCBA = 0;
        int A = 0;
        int B = 0;
        int C = 0;
        int D = 0;

           do{
          ABCD++;
          //分别得出个十百千位
          A=ABCD/1000;
          B=(ABCD-A*1000)/100;
          C=(ABCD-A*1000-B*100)/10;
          D=ABCD%10;
          //倒叙
          DCBA=D*1000+C*100+B*10+A;

           if((ABCD*A)==DCBA){
           printf("四位自然数ABCD,它乘以A后变成DCBA:%d\n",ABCD);}
          }while(ABCD<10000);
             return 0;
         *
         */
     /* 4.2.1
      *
     int a=0,b=0;
     printf("请输入一个整数:");
     fflush(stdout);
     scanf("%d",&a);

        while( b<=100){
      b++;
      if(a%b==0){
      printf("能被%d整除的数是%d\n",a,b);
      }
     }
     return 0;
    */

     /*
      * 方法二
     int a=0,b=0;
     printf("请输入一个整数:");
     fflush(stdout);
     scanf("%d",&a);

     for(b=0;b<=100;b++){
      if(a%b==0){
       printf("能被%d整除的数是%d\n",a,b);
      }
     }

     return 0;
      *
      */
    /*
     *4.3.1

     int a=123,b=0,n=1;

      while(n<=3){
       n++;
       printf("请输入密码:");
       fflush(stdout);
       scanf("%d",&b);
       if(b==a){
         printf("密码输入成功");
         }
       if(b==a)break;
       if(n>3){
        printf("密码输入有误超过3次,您的帐户已经被冻结,请明天再输入.");
        break;
       }
       if(b!=a){
        printf("密码输入有误");
        continue;
       }

      }
      return 0;
     *
     */

    /*
     * 4.4.1
      int i=0,j=0;
      fflush(stdout);


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

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

        printf("*");

       }
       printf("\n");
      }
      return 0;
     *
     */

    /*
     * 5.1.1
     int i,j,n;
      scanf("%d",&n);
      for(i=0;i<n;i++){
       j = n+i;
       while(j--){
        printf("%s",j>2*i?" ":"*");
       }
       printf("\n");
      }
      for(i=n-1;i>0;i--){
       for(j=0;j<n+i-1;j++){
        printf("%s",j<n-i?" ":"*");
       }
       printf("\n");

      }
      return 0;
     *
     */

      /*
       * 5.2.1
         int i,j,a;
      printf("输入一个正方形的边长:\n");
      fflush(stdout);
      scanf("%d",&a);
      for(i=1;i<=a;i++)printf("*");
      printf("\n");
      for(i=1;i<=a-2;i++)
      {
      printf("*");
      for(j=1;j<=a-2;j++)printf(" ");
      printf("*\n");
      }
      for(i=1;i<=a;i++)printf("*");
      printf("\n");

      return 0;

       *
       */


     /*
      * 5.3.1
         int x,count=0;
      printf("请输入一个整数:\n");
      fflush(stdout);
      scanf("%d",&x);
      while(x){
       x=x&(x-1);
       count++;
      }
      printf("一共有%d个",count);
      *
      */

     /*
      * 5.4.1
      int n=1;
       while(!((n%2==1)&&(n%3==2)&&(n%5==4)&&(n%6==5)&&(n%7==0))){
        ++n;
       }
       printf("这条阶梯共有 %d 阶。",n);

      return 0;
      
      *
      */

    }

     

    展开全文
  • Golang 条件循环语句

    万次阅读 多人点赞 2021-03-23 20:46:02
    本文简单描述 golang 中最常用的两种...在其他编程语言的基础上介绍条件语句 if 和 switch 的语法和 fallthrough 关键字,以及循环语句 for 的三种使用形式和 break/continue 关键字,并粗略介绍了 goto 语句的用法。

    前言

    本文简单描述 golang 中最常用的两种流程控制语句,条件和循环。在其他编程语言的基础上介绍条件语句 if 和 switch 的语法和 fallthrough 关键字,以及循环语句 for 的三种使用形式和 break/continue 关键字,并粗略介绍了 goto 语句的用法。

    条件语句

    golang 的条件语句和其他语言大同小异,仅做一些简单介绍即可。

    if 语句

    if 语句和其他语言相同,使用 if - elseif - else 的格式,需要注意的是 go 的 condition 只能为表达式,如 if res != 0 {},而不能像 python 一样直接使用 if res {}

    if condition {
    	// dosomething
    } else if condition {
        // dosomething
    } else {
    	// dosomething
    }
    

    go 的 if 语句还可以和 ; 结合,成为 if 赋值;判断 {} 的形式,常用于错误处理或者判断 map 元素是否存在等场景,如下:

    func f() error {
    	// ...
    }
    
    if err := f(); err != nil {
    	// ...
    }
    // 等价于
    // err := f()
    // if err != nil {
    // }
    
    // 判断字典元素是否存在
    // 判断某个 key n 是否在字典中
    // 若存在,ok 为 True,否则为 False
    if _, ok := map_name[n]; ok {
        // ...
    }
    

    switch 语句

    switch 语句执行的过程从上至下,直到找到匹配项

    和 C 语言等不同的是,go 的 switch 默认情况下 case 最后自带 break,不需要再显示的加 break。匹配成功后就不会执行其他 case,如果要执行后面的 case,需要使用 fallthrough 关键字。

    switch i {
        case 0: // 空的 case 体
        case 1:
            f() // 当i == 0 时,f 不会被调用!
    }
    
    switch i {
        case 0: fallthrough
        case 1:
            f() // 当i == 0 时,f 会被调用!
    }
    

    switch 后面置空,相当于一连串的 if-else-if-else 判断

    switch {
       case grade == "A" :
          fmt.Printf("优秀!\n" )    
       case grade == "B", grade == "C" :
          fmt.Printf("良好\n" )      
       case grade == "D" :
          fmt.Printf("及格\n" )      
       case grade == "F":
          fmt.Printf("不及格\n" )
       default:
          fmt.Printf("差\n" )
    }
    fmt.Printf("你的等级是 %s\n", grade)
    

    select 语句

    select 为 channel 相关的流程控制语句,会在后面介绍 channel 的时候详细介绍。

    for 循环语句

    go 的循环只有 for 循环这一种方式,没有其他语言中的 while,do while 等。

    第一种形式

    go 没有逗号表达式,所以如果要执行多个变量,要用平行赋值
    go 中 ++,-- 是语句而不是表达式,所以只能出现 i++,而 j = i++ 这种写法会报错

    for initialization; condition; post {
        // dosomething
    }
    
    // 不能写为 for i := 0, j := len(a) - 1; i < j; i++, j-- {}
    for i, j := 0, len(a) - 1; i < j; i, j = i + 1, j - 1 {
        a[i], a[j] = a[j], a[i]
    }
    

    第二种形式

    类似其他语言的 while 循环
    condition 也可以省略变成无限循环

    for condition {
        // dosomething
    }
    

    第三种形式

    实际开发中最常使用这种形式,用于遍历 array,slice,string, map, channel 等,每次循环迭代, range 产生一对值;索引以及在该索引处的元素值。

    类似 python 中的 for i, num in enumerate(nums)

    for i, num := range nums {
        // dosomething
    }
    
    // 如果不需要用到索引,则必须用 _ 空标识符(blank identifier)代替索引变量,因为Go语言不允许使用无用的局部变量(local variables,会导致编译错误
    for _, num := range nums {
        // dosomething
    }
    

    break / continue

    go 的循环语句可以使用 break 和 continue 来控制循环,使用方式和其他语言一样,使用 break 来中断循环,使用 continue 跳过本次循环进行下一次循环,此处不做赘述。

    比较有特色的是,go 的 break 可以指定跳出的标签,如下, 如果直接用 break,则跳出 j 循环,进入 i 循环,但是在 i 层添加了 tag,并且 break 到 tag 处,则直接跳出 i 循环。

    LOOP:
    for i < 10 {
    	for j < 10 {
    		j++
    		if j = 5 {
    			break LOOP
    		}
    	}
    }
    

    goto 跳转语句

    Go 语言的 goto 语句可以无条件地转移到过程中指定的行,通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。但是,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

    var a int = 10
     
    LOOP: for a < 20 {   // 设置标签
       if a == 15 {
          /* 跳过迭代 */
          a = a + 1
          goto LOOP  // 跳到标签 “LOOP” 的位置
       }
       fmt.Printf("a的值为 : %d\n", a)
       a++    
    }  
    
    展开全文
  • 三种循环结构语句

    千次阅读 2021-01-02 20:31:58
    三种循环结构语句 1.for循环 格式: for(初始化语句1; 判断语句2; 步进语句3){ 循环代码4 } 执行流程: 先执行1初始化语句 执行2判断语句,如果判断结果是true 执行4循环代码 执行3步进语句 继续回到2 4 3 ...

    三种循环结构语句

    1.for循环

    格式:
    	for(初始化语句1; 判断语句2; 步进语句3){
            循环代码4
    	}
    
    执行流程:
    	先执行1初始化语句
    	执行2判断语句,如果判断结果是true
    	执行4循环代码
    	执行3步进语句
    		继续回到2 4 3 2 4 3 
    		如果判断结果是false,代表循环结束
    注意:
    	初始化语句只在第一次循环中执行,之后不再执行
    

    代码

    public static void main(String[] args) {
            /*
            判断0-10的奇偶数
             */
            //偶数:能够被2整除的数字称为偶数
            // 0 是一个特殊的偶数
            for(int i=0;i<=10;i++){
                if (i%2 == 0){
                    System.out.println(i+"是偶数");
                }else {
                    System.out.println(i+"是奇数");
                }
            }
        }
    

    console

    0是偶数
    1是奇数
    2是偶数
    3是奇数
    4是偶数
    5是奇数
    6是偶数
    7是奇数
    8是偶数
    9是奇数
    10是偶数
    

    2.while循环

    格式:
    	初始化语句1;
    	while(判断语句2){
            循环代码3;
            步进语句4;
    	}
    
    执行流程:
    	1 初始化语句
    	2 执行判断语句,如果是true就执行大括号里面的代码,如果是false就结束循环
    	3 循环代码
    	4 步进语句
    	
    	再次循环执行2判断语句
    

    代码

    public static void main(String[] args) {
            /*
            求1-100的累加和
             */
            int x = 1;
            int sum = 0;
            while (x<=100){
                sum += x;
                x++;
            }
            System.out.println("1-100的累加和为:"+sum);
        }
    

    console

    1-100的累加和为:5050
    

    3.do-while循环

    格式:
    	初始化语句1;
    	do{
            循环语句2;
            步进语句3;
    	}while(判断语句4);
    
    执行流程:
    	1 初始化语句
    	2 循环语句
    	3 步进语句
    	4 判断语句 , 如果判断的结果是true就继续循环,如果判断的结果是false就结束循环
    注意:
    	do-while循环是先执行后判断,不管条件是否满足至少执行一次
    

    代码

    public static void main(String[] args) {
            /*
            输出1-10的和
             */
            int a = 1;
            int sum = 0;
            do {
                sum += a;
                a++;
            }while (a<=10);
            System.out.println("1-10的和为:"+sum);
        }
    

    console

    1-10的和为:55
    

    三种循环的使用场景

    三种循环结构均可实现相应的功能,按照实际需要选择更为简便的形式。以下为使用场景的总结:
    	1.明确循环次数的时候:建议使用for循环	
    	2.不明确循环次数的时候:建议使用while循环
    	3.do...while循环比较特殊,它先执行循环体,然后根据判断条件决定是否再次执行循环,即do...while至少执行一次循环
    

    循环嵌套

    代码1

    public static void main(String[] args) {
            /*
            循环嵌套:
                外层循环执行1次,内存循环执行一圈
             */
            /*
            循环出从0点0分-23点59分
             */
            //遍历小时
            for (int i=0; i<24; i++){
                //遍历分钟
                for (int j=0; j<60; j++){
                    System.out.println(i + "点" + j + "分");
                }
            }
    

    console

    0点0分
    0点1分
    0点2分
    ...
    23点57分
    23点58分
    23点59分
    

    代码2

    public static void main(String[] args) {
            for (int i = 1; i < 10; i++) {
                System.out.println("你是第" + i + "位顾客");
                while (true) {
                    System.out.println("请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买");
                    Scanner sc = new Scanner(System.in);
                    int a = sc.nextInt();
                    if (a == 1) {
                        System.out.println("您购买的是水果");
                    } else if (a == 2) {
                        System.out.println("你购买的是蔬菜");
                    } else if (a == 3) {
                        System.out.println("您购买的是饮品");
                    } else if (a == 4) {
                        break;
                    } else {
                        System.out.println("您输入的指令有错误");
                    }
                }
            }
        }
    

    console

    你是第1位顾客
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    1
    您购买的是水果
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    2
    你购买的是蔬菜
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    4
    你是第2位顾客
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    3
    您购买的是饮品
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    4
    你是第3位顾客
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    2
    你购买的是蔬菜
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    ...
    你是第9位顾客
    请选择你想要购买的商品:1.水果 2.蔬菜 3.饮料 4.结束购买
    2
    你购买的是蔬菜
    

    两种死循环的写法

    1.while(true){...}
    2.for(;;){...}
    
    展开全文
  • FPGA学习笔记(四)————Verilog HDL条件语句与循环语句 文章目录FPGA学习笔记(四)————Verilog HDL条件语句与循环语句1.if--else语句2.case语句3.forever语句4.repeat语句5.while语句6.for语句7.disable语句 1....

    FPGA学习笔记(四)————Verilog HDL条件语句与循环语句

    1.if–else语句

    • 其格式与C语言中的if–else语句类似,使用方法有以下3种:

      //形式1:只有if的形式
      if(表达式)  语句1;
      if(表达式)
          begin
              表达式1;
          end
      //形式2:if--else形式
      if(表达式)
          语句或语句块1;
      else
          语句或语句块2;
      //形式3:if--else嵌套形式
      if ( 表达式1)    语句1;     
      else if ( 表达式2 )  语句2;
      else if ( 表达式3 )  语句3;
      ........
      else if ( 表达式m )  语句m;
      else               语句n;
      //例如:
      if ( a > b )      out = int1;
      else if ( a == b)  out1= int2;
      else           out1 = int3; 
      
      
    • 表达式:一般为逻辑表达式或关系表达式,也可能是一位的变量。

    • 系统对表达式的值进行判断,若为0,x,z,按“假”处理;若为1,按“真”处理,执行指定语句。

    • 语句可是单句,也可是多句,多句时用“begin - end”语句括起来。对于if语句的嵌套,若不清楚if和else的匹配,最好用begin-end语句括起来。

    • 条件语句必须在过程块中使用:

      always@(a,b,int1,int2) 
           begin
          if(a>b)
              begin      
                  out1=int1;     
                  out2=int2;        
              end
          else
             begin       
                 out1=int2;       
                 out2=int1;      
             end
       end
      
    • 允许一定形式的表达式简写方式:

      if(expression) 等同于 if(expression == 1)

      if(!expression) 等同于 if(expression!= 1)

    • if语句的嵌套,即在if语句中又包含一个或多个if语句称为if语句的嵌套。应当注意if与else的配对关系,else总是与它上面的最近的if配对。

    • if-else 嵌套形式隐含优先级关系:

       always@(sela or selb or a or b or c)
          begin
            if(sela)  q=a;
            else if(selb) q=b;
      	      else q=c;
          end
      

    在这里插入图片描述

    2.case语句

    • Verilog语言提供的case语句直接处理多分支选择,通常用于描述译码器、数据选择器、状态机及微处理器的指令译码等,它的一般形式如下:

      case(表达式)
          分支表达式1:语句1;
          分支表达式2:语句2;
          ···
          分支表达式n:语句n;
          default: 语句n+1; //如果前面列出了表达式所有可能取值,default语句可以省略
      endcase      
      
    • case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。

    • 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句;如果所有的分支表达式的值都没有与控制表达式的值相匹配,就执行default后面的语句。

    • 分支表达式后面的语句也可以是由begin-end括起来的语句块。

    • default项可有可无,一个case语句里只准有一个default项。同样,case也只能在块语句中使用。

    //case语句实现3-8译码器的部分代码如下:
         wire[2:0] sel;
         reg[7:0]  res;
         always @ (sel or res)
          begin
    //case语句;
      case (sel)
           3’b000 : res=8’b00000001;
           3’b001 : res=8’b00000010;
           3’b010 : res=8’b00000100;
           3’b011 : res=8’b00001000;
           3’b100 : res=8’b00010000;
           3’b101:  res=8’b00100000;
           3’b110 : res=8’b01000000;
           default:  res=8’b10000000;
       endcase
     end
    
    • case语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进行对应位的比较。一个经常犯的错误是用’bx,'bz来替代n’bx,n’bz,这样写是不对的,因为信号x,z的默认宽度是机器的字节宽度,通常是32位。

    • 执行完case分项后的语句,则跳出该case语句结构,终止case语句的执行。

    • 在case语句中,表达式与分支表达式1到分支表达式n之间的比较是一种全等比较(===),必须保证两者的对应位全等。如果表达式的值和分支表达式的值同时为不定值或者同时为高阻态,则认为是相等的

      case01xz
      01000
      10100
      x0010
      z0001
      case ( a )
           2’b1x:out = 1;   // 只有a = 1x,才有out = 1
           2’b1z:out = 0;    // 只有a = 1z,才有out = 0
         ...
      endcase
      
    • case(select[1,2])
           2'b00: result   = 0;
           2'b01: result   = flaga;
           2'b0x,
           2'b0z: result   = flaga ? 'bx:0;
           2'b10: result   = flagb;
           2'bx0,
           2'bz0: result   = 0;
          default: result   = flagb ? 'bz:0;
       endcase
      //当多个分项可以共用一个语句或语句块。其分支表达式之间用“,”隔开。
      
    • case语句还有两种变种,即casez语句和casex语句。

    • casez:

      ​ 忽略比较过程中值为z的位,即如果比较的双方(表达式的值与分支表达式的值)有一方的某一位的值是z,那么对这些位的比较就不予考虑,只需关注其他位的比较结果。

    • casex:

      ​ 在casex语句中,则把这种处理方式进一步扩展到对x的处理,即将z和x均视为无关值。

      casez01xz
      01001
      10101
      x0011
      z1111
      //在分支表达式中,z常用?代替。
      casez(a)
               3'b1?? :  out1 = 1;//如果a=100、101、110、111或1xx,1zz等,都有out1 = 1。
           
               3'b0?1 :  out2 = 1; //如果a=001、011、0x1、0z1,都有out2 = 1
              .......
      endcase
      
      casex01xz
      01011
      10111
      x1111
      z1111
      例如:
          casex(a)
      	         2'b1x:out=1;  
                ..................
           endcase
      //如果a=10、11、1x、1z,都有out=1。
      
    • if语句条件不完备情况

      如果if语句和case语句的条件描述不完备,会造成不必要的锁存器 。

      一般不可能列出所有分支,因为每一变量至少有4种取值0,1,z,x。为包含所有分支,可在if语句最后加上else;在case语句的最后加上default语句。

    • 回顾一下锁存器和寄存器的区别:

    在这里插入图片描述

    always@(a or b) 
            begin 
               if(a == 1’b1)
                    y = b;
           end
    

    在这里插入图片描述

    always@(posedge clk) 
            begin 
              if(a == 1’b1)
                  y <= b;
           end
    //毛刺通过D触发器被滤除
    

    在这里插入图片描述
    在这里插入图片描述

    • 对FPGA来说,它的基本逻辑单元由多输入查找表、 D触发器构成,并不存在锁存器结构,因此如果在FPGA设计中使用锁存器,需要更多的资源来搭建锁存器,反而会更消耗资源。

    • 所以在FPGA设计中,应该避免锁存器。在时序逻辑电路中,可以将锁存器改为带使能端的D触发器;在组合电路中,可以通过更改代码以覆盖所有条件分支等方式避免产生锁存器。

       always @(al or d)
          begin
           if(al)
                q<=d;
          end
          //有锁存器
      always @(al or d)
        begin
          if(al)   q<=d;
          else    q<=0
        end
          //无锁存器
      
    • 检查一下上边的"always"块,if语句保证了只有当al=1时,q才取d的值。这段程序没有写出 al = 0 时的结果, 那么当al=0时会怎么样呢?

      在"always"块内,如果在给定的条件下变量没有赋值,这个变量将保持原值,也就是说会生成一个锁存器!

    • 避免偶然生成锁存器的错误。如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。

    3.forever语句

    forever语句的格式如下:
          forever   语句;
        或者:    
           forever
              begin            
                  语句1;
                  语句2;
                  ……
              end
    
    • forever表示永久循环,无条件地无限次执行其后的语句,相当于while(1),直到遇到系统任务$finish$stop,如果需要从循环中退出,可以使用disable

    • 循环语句多用于生成时钟等周期性波形,它与always语句不同之处在于不能独立写在程序中,而必须写在initial块中。

      initial
          begin
               clk = 0;
               forever #25 clk = ~clk;     
          end
      
    • forever应该是过程块中最后一条语句。其后的语句将永远不会执行。

    • forever语句不可综合,通常用于testbench描述。

      ...
      reg clk;
      initial
            begin
            clk = 0;
            forever //这种行为描述方式可以非常灵活的描述时钟,可以控制时钟的开始时间及周期占空比。仿真效率也高。
                  begin
                       #10 clk = 1;
                       #10 clk = 0;
                 end
      end
      ...
      

    4.repeat语句

    • repeat语句是最简单的循环语句,用于循环次数已知的情况。

      repeat语句的表达形式为:

      repeat(循环次数)
           begin
               操作1;
      	     操作2;
               ………
           end
      
    • 下例实现连续8次循环左移的操作:

      if (rotate == 1)
        repeat (8)     
         begin
             temp = data[15];
             data = {data << 1,temp};  // data循环左移8次
         end
      

    5.while语句

    • while语句通过控制某个变量的取值来控制循环次数。一般表达形式:

      while(条件)
          begin
                操作1;
                操作2;
                ………
           end
      

      在使用while语句时,一般在循环体内更新条件的取值,以保证在适当的时候退出循环。

    • 下例实现连续4次循环的操作

      i = 0;
      while(i < 4)
          begin
             a = a + 1;
             //更新条件取值,使循环4次退出循环
       	   i = i + 1; 
          end
      
    • 可见在while结构中只要表达式为真(不为0),则重复执行一条语句(或语句块)

      //其功能为:统计tempreg中 1 的个数
      . . .
      reg [7: 0] tempreg;
      reg [3: 0] count;
      . . .
            count = 0;
            while (tempreg) 
            begin
                  if (tempreg[0]) 
                      count = count + 1;
                  tempreg = tempreg >> 1; // Shift right
            end
      end
      . . .
      /*
      Tempreg:
       1011
       0101
       0010
       0001
       0000
      */
      

    6.for语句

    • for语句可以实现所有的循环结构。其表达形式如下:

      for(循环变量赋初值;条件表达式;更新循环变量)
             begin
                操作1:
                操作2;
                ………
             end
      
    • 它的执行过程如下:

      (1)先对循环变量赋初值。

      (2)计算条件表达式,若其值为真(非0),则执行for语句中指定的内嵌语句,然后执行下面的第(3)步。若为假(0),则结束循环,转到第5步。

      (3) 若条件表达式为真,在执行指定的语句后,执行更新循环变量。

      (4) 转回上面的第(2)步骤继续执行。

      (5) 执行for语句下面的语句。

    for(i = 0; i <4; i =i+1)
        begin 
    		a = a+1;
         end
    
    • 例:用for语句来实现8位数据中低4位左移到高4位;

          integer i;
          reg [7:0] datain;
      
         always @ (posedge clk)
           begin
                for(i=4;i<=7;i=i+1)
                    begin
                       datain[i]  <=  datain [i-4];
                    end
           end   
      
    • 例:编写 在一个时钟周期内用for语句计算出13路脉冲信号为高电平的个数。

         input clk,rst;
         input [12:0]  datain;    
         output [3:0]  numout;    
         reg [3:0] i;
         reg [3:0] num;
        always @ (posedge clk) 
          begin
              if ( !rst )  //重置信号
                   num <= 0;  
             else 
                begin
                    for ( i = 0; i < 13; i = i + 1)   //用for循环进行计算
                        if ( datain [i ] )  num  <= num +1;                   
                 end
          end
      

    7.disable语句

    • 在有些特殊的情况下,需要使用disable强制退出循环。
    • 使用disable语句强制退出循环,首先要给循环部分起个名字,方法是在begin后添加“: 名字”。即disable语句可以中止有名字的begin…end块和fork…join块。
    • 语句块可以具有自己的名字,这称为命名块。

    命名块的特点是:

    命名块中可以声明局部变量;

    命名块是设计层次的一部分,命名块中声明的变量可以通过层次名引用进行访问

    命名块可以被禁用,例如停止其执行。

     //命名块
     module top;
      initial
        begin : block1
           integer i;
           ……….
         end
       
     initial
        fork : block2
           reg i;
           ……….
           ……….
         join
    
    • Verilog通过关键字disable提供了一种中止命名块执行的方法。

      disable可以用来从循环中退出、处理错误条件以及根据控制信号来控制某些代码段是否被执行。

      对块语句的禁用导致本块语句终止执行,紧接在块后面的那条语句被执行。

    • 例:(在C语言中break和continue的区别)

      begin  :continue
            a = 0; b =0;
            for(i=0;i<4;i = i+1)
             begin
                a = a+1;
                if(i==2) disable continue;
                b = b+1;
             end
       end
       ……………….;//a做3次加1操作后强制退出循环;而b只做2次加1操作。
      
           a=0; 
           b=0;
           for( i=0; i<4; i=i+1)
             begin: continue
      	    a = a+1;
                     if( i ==2) disable continue;
                     b= b+1;
              end
            ……………………….;
      //中止一次循环,继续下一次循环; a做4次加1操作, b只做3次加1操作.
      
    展开全文
  • Fortran学习笔记4(循环语句

    万次阅读 2016-08-01 16:47:01
    逻辑运算 循环 Do语句 Do-While循环 循环控制 循环应用实例
  • 在语法篇(一)中学习了go中基本的数据类型、变量、常量等组成语言的基本要素,在...在具体编程的时候免不了需要使用一些特殊的语句实现某些功能,比如使用循环语句来进行迭代,使用选择语句控制程序的执行方式等。这些语
  • js循环语句与循环嵌套

    千次阅读 2017-08-01 10:52:21
    循环辅助语句 break 跳出所在的switck或循环结构 var n = Number(prompt("")); var m =Math.ceil(Math.sqrt(n));//根据数学相关的定理,判断范围可缩小至[2,sqrp(n)] var found = false;//找到因子的标记 ...
  • 选择语句+循环语句作业及答案

    千次阅读 2019-04-24 10:15:41
    1.Java中有两种类型的选择结构的控制语句,分别是if语句和________。 2.在Java JDK1.7之前,switch只能支持byte、short、char、int或者其对应的封装类以及Enum类型。在JDK1.7中又加入了________类型。 3.for循环的...
  • do while循环语句的学习以及练习

    万次阅读 2019-04-23 20:53:40
    今天学的是do while循环语句, 先执行循环体,直到条件的表达式为false。 与while循环语句的区别: while语句先判断条件,满足时执行循环体。 do while语句先执行循环体,满足条件在执行 语法: do { 循环体 }while...
  • C#中的主要流程控制语句之跳转语句

    千次阅读 2013-02-27 10:33:28
    跳转语句用于改变程序的...然后,控制被传递到循环或条件语句的嵌入语句后面的代码行。Break语句的语法极为简单,它没有括号和参数,只要将以下语句放到你希望跳出循环或条件语句的地方即可:  break; Break语句例子
  • 循环语句概述 反复执行的代码片段,本质就对重复代码的一种简化解决方案。 循环语句四要素 1.初始化语句 2.循环条件语句 3.循环体语句 4.控制条件语句 循环分类 1.while循环语句    格式:    1.初始化语句;  ...
  • Swift编程语言学习4.3—— 控制语句

    千次阅读 2014-07-14 11:00:47
    控制传递语句(Control Transfer Statements) 控制转移语句改变你代码的执行顺序,通过它你可以实现代码的跳转。Swift有四种控制转移语句。   continue break fallthrough return 我们将会在下面讨论continue、...
  • On error goto 捕捉错误语句

    千次阅读 热门讨论 2019-05-02 19:53:14
    On error goto 捕捉错误语句一般有下面三种 1.on error goto 0 :出现错误程序终止执行,报出错误信息 2.on error resume next:程序出现错误会跳过当前的错误语句,继续执行后面的语句,不会弹出错误提示信息 3.on ...
  • Java 循环语句练习题(2)

    万次阅读 2016-10-03 21:08:49
    1、循环输出1到100之间所有能被3或能被4整除的数。package com.hz.loop02;/** * 1、循环输出1到100之间所有能被3或能被4整除的数。 * @author ztw * */ public class Practice01 {public static void main...
  • python循环语句课堂练习及课后作业

    千次阅读 2018-11-22 12:05:11
    5. 如果用户猜测的数字等于系统给出的数字,打印"恭喜中奖100万",并且退出循环; while循环 import random x = random.randint(1,100) print(x) trycount = 0 while trycount tk = int(input('请输入你猜测的...
  • 会使用调试解决简单的程序错误 三目运算 a>10?100:200; 什么是循环?  循环就是重复做某件事情。 在我眼里就是一段代码持续的叫cpu去执行指定的次数。 三种循环: while循环结构 do-while循环结构 ...
  • 前言 我们要知道C语言是结构化的程序设计语言,这里的结构...通过这篇博客我们来详细的介绍分支语句和循环语句 分支语句 if switch 循环语句 while for do while goto语句 什么是语句? C语言中由一个分号...
  • swift之控制转移语句,continue,break,fallthrough,return,带标签的语句
  • 最近阿里出了一个java开发手册,里面涉及到很多工作规范的地方,有很多借鉴和参考的作用,也可以给新入行的工程师作为参考。...控制语句 【强制】在一个 switch 块内,每个 case 要么通过 bre
  • (7)控制语句1. 【强制】在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止; 在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使空...
  • 注:本文记录 WHUT-计算机学院-编译原理 课程 课内实践 ... 纸上得来终觉浅,觉知此事需躬行!...赋值语句的词法分析程序设计与实现 赋值语句的语义分析程序设计与实现 而课内实践的内容是:WHI...
  • 现象描述:在编写C语言程序时,需要使用scanf语句从键盘上输入一个整型的数时,当错误的输入了字符时,scanf语句就好像不会执行,但从键盘输入其他数字又无法获取。 问题分析:当定义scanf语句接收整型数值时,它就...
  • 第四章 VHDL的主要描述语句

    千次阅读 2007-04-23 08:51:00
    第四章 VHDL的主要描述语句 4.1 VHDL顺序语句 4.2 VHDL并行语句 用VHDL语言进行设计时,按描述语句的执行顺序进行分类,可将VHDL语句分为顺序执行语句(Sequential)和并行执行语句(Parallel)。 4.1 VHDL顺序...
  • switch语句

    万次阅读 多人点赞 2019-02-17 19:36:16
    1. 语句结构 语法形式 switch语句从字面上讲,可以称为开关语句,当然理解上不要以为就只有开和关,可以想象它是一个多路开关。它是一种多分支结构。 switch语句的语法形式为: switch(整型表达式) { case ...
  • Python的语法糖非常强大,比如Python中在for循环中嵌套使用if和else语句的技巧便十分给力,下面我们就举几个例子来看详细的用法: for…[if]…构建List (List comprehension) 1.简单的for…[if]…语句 Python中,for...
  • 循环结构

    千次阅读 2015-07-20 13:58:35
    for 语句用来描述已知重复次数的循环结构。 for 语句有两种形式: (1) for 循环变量:=初值 to 终值 do 语句; (2) for 循环变量:=初值 downto 终值 do 语句; 例:计算1+2+3+……+99+100的和 program ...
  • for...[if]...... 1.简单的for...[if]...语句 Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省略的。下面举几个简单的例子
  • break 语句用来终止循环语句,即循环条件没有 False 条件或者序列还没被完全递归完,也会停止执行循环语句。 break 语句用在 while 和 for 循环中。 如果您使用嵌套循环,break 语句将停止执行最深层的循环,并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,880
精华内容 55,952
关键字:

循环控制语句描述错误的是