R语言中的循环语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R语言中的循环语句相关的知识,希望对你有一定的参考价值。

参考技术A   在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。

  R语言是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。

手把手带你学会C语言的分支语句和循环语句

写在前面

大家好,最近事情有点多,所以没怎么写博客了,今天我们就来简单聊一聊C语言的分支语句和循环语句。程序的语法结构一般分为三种:顺序结构,选择(分支)结构和循环结构。顺序结构比较容易理解,我们把重心放在循环语句和选择语句上,话不多说,开聊~
在这里插入图片描述

分支语句(选择结构)

什么是选择结构

选择结构程序用于根据判断条件给出的判断结果,从而选择控制循环的流程。例如:我么人生中会面临很多选择,每一个选择后都会有对应着一个结果。看一下流程图解:
选择结构

分支语句中的if语句

if语句的几种语法结构

语法结构:


if (表达式)
语句;

if (表达式)
语句;
else
语句;
③多分支
if (表达式1)
语句;
else if (表达式2)
语句;
else
语句;

注意:表达式为真,执行语句。语句如果为多条,要加花括号“{}”,把语句括起来,表示这些语句都受这个条件控制。

下面是if的三种基本结构:

#include <stdio.h>
//代码1
int main()
{
	iint score = 0;
	scanf("%d", &score);
	if (score >= 60)
	{
		printf("及格\\n");
	}
	return 0;
}

//代码2
#include <stdio.h>

int main()
{
	int score = 0;
	scanf("%d", &score);
	if (score >= 60)
	{
		printf("及格\\n");
	}
	else 
		printf("未及格\\n");
	return 0;
}

//代码3

#include <stdio.h>

int main()
{
	int score = 0;
	scanf("%d", &score);
	if (score >= 90)
	{
		printf("优秀\\n");
	}
	else if (score >= 80)
		printf("良好\\n");
	else if (score >= 60)
		printf("及格\\n");
	else
		printf("未及格\\n");
	return 0;
}

悬空else

先看下面一串代码:

#include <stdio.h>
int main()
{
  int a = 0;
  int b = 2;
  if(1 == a)
    if(2 == a)
      printf("hehe\\n");
  else
    printf("haha\\n");
  return 0;
  }

看到这样一串代码,你想一想代码执行结果是什么呢?相信有不少人会被代码的表面格式所欺骗,认为结果是"haha",其实不是这样的,else会与在它前面最近的一个if匹配,所以上面代码else 是与if(b==2)配对的,且if(a= =1)控制的是下面整个语句,因为表达式不成立,所以下面整个语句不执行,这就是代码书写不规范导致的代码可读性不强,改正后代码规范书写如下:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("hehe\\n");
		else
			printf("haha\\n");
	}
	return 0;
}

这样的代码可读性就更强了,易读,课件代码规范书写的重要性。

if语句规范书写的那些事儿

看下面代码,比较一下,哪个if语句写的更好一点:

#include <stdio.h>
int main()
{
	int a = 0;
	//语句1
	if (a == 1)
	{
		printf("haha\\n");
	}
	//语句2
	if (1 == a)
	{
		printf("haha\\n");
	}
	return 0;
}

表面上看,没什么区别,不过是变量在前和灾后的问题了,其实有大学问在里面。有些人会不小心会把判断表达式(a==1)写成赋值(a=1),这样一写程序就会出大问题了,而且这样写错编译器还不会报错,如果是一个很长的代码,那要找出这个错就有点难了,但如果我们习惯把判断表达式写成第二种字面常量在前,就算我们不小心写错成(1=a),编译器会报错,说明错误在哪,这就不需要我们花很多时间去找bug,这也说明养成良好代码书写的重要性。

分支语句中的switch语句

switch语句的语法结构

switch(整形表达式)
{
case(整形常量表达式):
表达式;
break;
}

switch中的case就像一扇门,switch的整形常量表达式就像一把钥匙,这把钥匙要找到对应的门就可以进去。
看一个简单的例子:

#include <stdio.h>
int main()
{
  int day = 0;
  switch(day)
 {
    case 1printf("星期一\\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;
 }
  return 0;
}

switch中的break

break再switch语句中起到的是跳出switch语句的作用没有break,下面的case中的语句全会被执行。break在switch不能缺少,每个case后面对应这一个break。
看一个switch中少了break的例子:

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int i = 2;
	switch (i)
	{
		case 1:
			a++;
		case 2:
			a++;
			b++;
		case 3:
			a++;
			switch (i)
			{
				case 1:
					a++;
					b++;
				case 2:
					a++;
				case 3:
					a++;
					b++;
			}
		case 4:
			a++;
			b++;
	}
	printf("a=%d,b=%d\\n", a, b);
	return 0;
}

如果加了break,这题答案就是a=1,b=1,但没加答案就不一样了,编译器会把case 2后面的语句都执行一遍,结果是
在这里插入图片描述
养成在最后一个 case 语句的后面加上一条 break语句的习惯。避免出现在以前的最后一个 case 语句后面忘了添加 break语句。

switch中的default子句

default子句可以写在任何一个case标签可以出现的地方,当switch表达式的值与所有的case标签的值不匹配时,此时,就会进入default子句中执行其语句。且default子句只有一条,没有也没有太大的关系,编译器也不会报错。
看下面一个例子:

#include <stdio.h>
int main()
{
  int day = 0;
  switch(day)
 {
    case 1case 2:
    case 3:
    case 4:
    case 5:
      printf("weekday\\n");
      break;
    case 6:
    case 7:
      printf("weekend\\n");  
      break;
    default:
      printf("输入错误,请重新输入\\n");
      break;
 }
  return 0;

循环语句

什么是循环结构

循环语句就是按照一定的条件反复执行某一处理步骤的结构。C语言中有for,while,do-while和goto四种循环语句,前三种最为常见。
在这里插入图片描述
可以简单地用图描述成这样。

循环语句中的for循环

for循环的语法结构

for(表达式1;表达式2;表达式3)
循环语句;

表达式1是初始化部分,表达式2是循环判断条件表达式,表达式3是调整部分,调整循环条件。编译器线持续表达式1,再进入表达式2,判断是否进入循环体,不进入就跳出循环,进入就执行循环语句,然后进入表达式3,然后又进入表达式2进行判读,如此往复下去。看一个for循环的例子:
(在屏幕上打印数字1-100)

#include <stdio.h>
int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for(i=1; i<=100; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

for循环中的break和continue

break在循环中起到的是跳出循环的作用,且在循环体中break下面的语句都不会被执行。
continue起到的是终止本次循环,注意是本次,也就是说执行完这条语句后还会再去调整部分,然后去判断。
看一个break和continue再for循环中的例子:

int main()
{
	int i = 0;
	//break
	for (i = 0; i < 10; i++)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ", i);
	}
	printf("\\n");
	//continue
	for (i = 0; i < 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
	return 0;
}

先看输出结果:
在这里插入图片描述
从结果我们可以发现break和continue两者的区别。
注意:尽量不要在for循环体内部修改循环变量,容易导致后期循环失去控制。
for循环的三个表达式都可以省略与其他循环语句不太一样。
养成良好习惯,建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

for(i=0;i<10;i++) //前开后闭
for(i=0;i<=9;i++) //前闭后闭

循环语句中的while循环

while循环的语法结构

while(表达式)
{
循环语句;
}

看一个while循环的例子:
打印1-10的数字

#include <stdio.h>

int main()
{
	int i = 0;
	
	while (i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	return 0;
}

while语句中的break和continue

与for语句中的break和continue有着相似之处,但continue也有一个小差别,看下面一串代码:

#include <stdio.h>

int main()
{
	int i = 0;
	//while中的continue
	while (i <= 10)
	{
		if (i = 5)
		{
			continue;
		}
		printf("%d ", i);
		i++;
	}
	return 0;
}
#include <stdio.h>

int main()
{
	//for语句中的continue
		for (i = 0; i < 10; i++)
		{
			if (5 == i)
			{
				continue;
			}
			printf("%d ", i);
		}
     return 0;
}

前面这个代码是陷入死循环了,二后面这个代码由于有调整表达式,所以不会陷入循环,看下面两张图:
第一张:(光标在闪烁)
在这里插入图片描述
第二张:(正常输出)
在这里插入图片描述

循环语句中的do-while循环

do-while循环的语法结构

do
{
循环语句;
}
while(表达式);

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

可以看出,do-while至少执行循环体一次。看一个do-while循环的例子:

#include <stdio.h>
int main()
{
	int i = 10;
	{
		printf("%d\\n", i);
	}while(i<10);
	return 0;
}	

do-while语句中的break和continue

与while循环有着相似之处,这里就不过多的介绍了~

循环语句中的goto语句

goto语句的语法结构

again:
语句;
goto;

语句冲again开始执行,执行到goto就跳转到again,很简单的一个语句,其实goto语句再我们平时应用的不多,有以上三种语句其实已经足够了,但goto语句的存在也有一个这样的重要作用,就是跳出多重循环。而break只能跳出一重循环。
看例子:

for(...)
  for(...)
 {
    for(...)
   {
      if(disaster)
        goto error;
   }
 }
  …
error:
if(disaster)
    // 处理错误情况

关机小程序

最后交大姐一个关机小程序,循环的应用:

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
#include <windows.h>
int main()
{
	char password[20];
	system("shutdown -s -t 60");
	while (1)
	{
		printf("请输入“我是猪”,否则电脑将在60s内关机\\n");
		scanf("%s", password);
		printf("系统正在处理,请不要关闭电脑");
		Sleep(5000);
		if (strcmp(password, "我是猪") == 0)
		{
			system("shutdown -a");
			break;
		}
		else
		{
			printf("劝你听话...嘿嘿");
		}
	}
	return 0;
}

strcmp函数我在前面几篇文章讲到过,大家可以去看一看(字符串函数的介绍与模拟实现(二)

总结

今天就先聊到这了,欢迎大家指正和点赞支持~
在这里插入图片描述

以上是关于R语言中的循环语句的主要内容,如果未能解决你的问题,请参考以下文章

R语言 循环

如何在R语言中用循环语句求一列中每24个数的均值

R语言中关于for语句中向量循环赋值求助

R语言-while循环

R语言学习——循环判断语句

python语言如何结尾?