第四天————1、循环 2、break,continue 3、数组 4、字符串处理相关的函数

1、循环
2、break,continue
3、数组(一维:整形 & 字符)
4、字符串处理相关的函数


循环:三大循环—》for while do_while
当需要重复做某件事情时,需要通过循环来做!

(1)for :
格式:
for(表达式1;表达式2;表达式3)
{
循环体//代码的实现过程
}

分析: 
     表达式1:赋初值,可以省略(基于己经被初始化过了),但是;不可以省略
	 表达式2:条件判断,不建议省略,(省略之后就会陷入死循环)		 
	 表达式3:条件更新,可以省略(放在循环体的内部,一般是最后一句话),但是;不可以省略 
	 
执行流程:
        先执行表达式1,在执行表达式2,如果表达式2成立,则进入循环体执行循环体中的内容,再去执行表达式3
		再次判断表达式2是否成立,成立则继续,否则终止循环。

(2)while
格式:
while(条件判断)
{
循环体;

条件更新!
}

注意:while循环必须先赋初值方可使用

执行流程:
先进行条件判断,当成立时,进入循环体,执行循环体之后再进行条件更新,再次判断如果成立则继续,否则终止循环。

(3)do_while
格式:
do
{
循环体
条件判断!!!
}while(条件判断);

执行流程:
先进入循环体,执行一边循环体的内容,并且进行条件更新,再进行while判断,如果成立则再次进入循环体,否则终止循环。

思考:
for和while的区别:
for针对的循环次数已经,while针对循环次数未知

while和do_while的区别:
while至少被执行0次
do_while至少被执行1次


break:结束本层循环
continue:结束本次循环(本次循环中剩余的语句块不再被执行),继续进入下一次循环。

书写死循环的方式:
while(1)
{
//循环体
}

for(;1;)
{
//循环体
}


练习:
1,有一个数字,加上100之后是一个完全平方数,再加上168之后还是一个完全平方数,求该数是谁(10000之内去查)
完全平方数:121 == 11 * 11 -----》开根:sqrt(数字)—> #include<math.h> ---->编译时需要在末尾添加 -lm 的选项
代码:

     1 #include <stdio.h>
  2 #include <math.h>
  3 
  4 int main(int argc, const char *argv[])
  5 {
  6     //求完全平方数(1-10000)
  7     //该数加上100之后,以及加上168均是完全平方数
  8     int i;
  9     int x,y;
 10     for(i=1;i<=10000;i++)
 11     {
 12         x = sqrt(i+100);
 13         y = sqrt(i+268);
 14         if((x * x == i+100) && (y * y == i+268))
 15         {                                                                   
 16             printf("%d是完全平方数!\n",i);
 17         }
 18     }
 19     return 0;
 20 }

数组:数据元素类型相同的一个集合

数组的特点:
(1)数据类型相同
(2)内存连续

一维整形数组:
定义一个数组?

定义普通变量?
存储类型 数据类型 变量名;
格式:
存储类型 数据类型 数组名[元素个数];
分析:
存储类型:数组中元素的存储位置,默认在栈区开辟空间(被auto修饰)
数据类型:数组中每一个元素的类型
数组名:当前该片连续空间的名称,见名知义
元素个数:当前数组中的元素总个数,注意该个数不能写变量。
一般该元素个数用常量代替(宏常量居多)

思考:
定义一个可以存放5个int类型元素的数组出来?
----》
int arr[5]; //在栈区开辟一片含有sizeof(int) * 5个字节的空间给你去使用
如何访问数组中每一个元素?
----》通过 数组名[下标] 注意:下标从0开始

总结:
(1)当数组在{}之内定义时,意味着是一个局部数组,当不赋值时,其值为随机值
(2)当数组在{}之外定义时,意味着是一个全局数组,当不赋值时,其值为0
(3)当数组满初始化时,元素会原样输出
(4)当数组部分初始化时,剩余未被赋值的元素默认补0
(5)可以利用(4)点的特性,实现清空一个数组:int arr[5] = {0};
(6)对于整形数组而言:一般通过循环完成元素的赋值以及输出


冒泡排序:
做法:从左到右,两两依次进行比较。如果按照升序来排,当左边比右边大时,需要进行交换位置
每一趟执行完之后,可以选出一个最大的数,但是剩余的数的关系不能保证,需要重复以上动作,直到剩余一个人

int arr[5] = {90,23,67,12,82};
—>目的:按照升序进行排列
思想:冒泡排序
原始数据:90,23,67,12,82

第一趟:23,67,12,82,90
第一次:23,90,67,12,82
第二次:23,67,90,12,82
第三次:23,67,12,90,82
第四次:23,67,12,82,90

第二趟:23,12,67,82,90
第一次:23,67,12,82,90
第二次:23,12,67,82,90
第三次:23,12,67,82,90
第三趟:12,23,67,82,90
第一次:12,23,67,82,90
第二次:12,23,67,82,90
第四趟:
第一次:12,23,67,82,90

第一趟:
伪代码:
for(i=0;i<5-1-0;i++)
{
if(arr[i] > arr[i+1])
{
//交换----?借助于一个中间变量
int Temp;
Temp = arr[i];
arr[i] = arr[i+1];
arr[i] = Temp;
}
}

第二趟:
for(i=0;i<5-1-1;i++)
{
if(arr[i] > arr[i+1])
{
//交换----?借助于一个中间变量
int Temp;
Temp = arr[i];
arr[i] = arr[i+1];
arr[i] = Temp;
}
}

第三趟:
for(i=0;i<5-1-2;i++)
{
if(arr[i] > arr[i+1])
{
//交换----?借助于一个中间变量
int Temp;
Temp = arr[i];
arr[i] = arr[i+1];
arr[i] = Temp;
}
}

第四趟:
for(i=0;i<5-1-3;i++)
{
if(arr[i] > arr[i+1])
{
//交换----?借助于一个中间变量
int Temp;
Temp = arr[i];
arr[i] = arr[i+1];
arr[i] = Temp;
}
}

对以上代码进行整合:
//定义一个变量,用来控制趟数
for(i=0;i<5-1;i++)
{
//用来控制每一趟中需要交换的次数
for(j=0;j<5-1-i;j++)
{
if(arr[j] > arr[j+1])
{
int Temp;
Temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = Temp;
}
}
}

一维字符数组:

思考:
定义一个可以存放20个字符的一维字符数组?
----》char str[20];
char str[20] = {‘h’,‘e’,‘l’,‘l’,‘o’}; //在栈区开辟了20个字节的空间
char str[20] = {“hello”};
char str[20] = “hello”;

char str[20] = {’\0’};
char str[20] = {0};

注意:一维字符数组的本质:—》就是一个字符串

字符串特性函数(只能针对字符串)
gets();
函数原型:
char *gets(char *s);
三步走:
功能:从键盘获得一个字符串
参数:数组名
返回值:首地址(成功之后的字符串)

简易版:
#include <stdio.h>

gets(数组名);

puts();
函数原型:
int puts(const char *s);
简易版:
puts(数组名);

总结:
(1)对于scanf和gets:
scanf:遇到空格,回车,Tab减均代表输入结束
gets:只有遇到回车才代表输入结束

(2)对于printf和puts:
printf:不会添加换行符,需要手动添加’\n’
puts:自动换行

(3)gets是一个非常危险的函数:因为gets没有越界检查的功能,它的获取没有上限,需要注意。

(4)注意:字符串一般都会有一个结束标志:’\0’
如果一个字符串中没有’\0’,那么在打印出会无限打印,只有遇到’\0’才会终止打印
故:需要给’\0’留一个字节的空间出来。eg: char str[5] = {’\0’};
此时最对可以输入4个有效字符

(5)一维数组的元素个数可以省略的,当省略之后,则会按照所赋值的元素个数为准来判断当前被省略的数字是多少。

(6)赋值时,直接以"wangjia"这个形式赋值时,默认是自带’\0’这个结束标志
eg:
char str[] = {“wangjia”} —>sizeof(str) = 8 //OK
char str[] = {‘w’,‘a’,'n,‘g’,‘j’,‘i’,‘a’};---->sizeof(str) = 7 //不可取


作业:

一,输入年月日,判断这一天是这一年的第几天?(考虑闰年)

#include<stdio.h>

int main()
{
	int day, month, year, sum, n;
	printf("请输入年月日\n");
	scanf("%d%d%d",&year,&month,&day);
	switch(month){   //先计算某月以前月份的总天数 
	case 1:
		sum = 0;
	break;
	case 2:
		sum = 31;
	break;
	case 3:
		sum = 59;
	break;
	case 4: 
		sum = 90;
	break;
	case 5:
		sum = 120;
	break;
	case 6:
		sum = 151;
	break;
	case 7:
		sum = 181;
	break;
	case 8:
		sum = 212;
	break;
	case 9:
		sum = 243;
	break;
	case 10:
		sum = 273;
	break;
	case 11:
		sum = 304;
	break;
	case 12:
		sum = 334;
	break;
	default:
		printf("data error!");
	break;
	}
	sum = sum + day;    //再加上某天的天数 
	if(year%400==0||(year%4==0&&year%100!=0))
	{  //判断是不是闰年 
		n = 1;
	}
	else
	{
		n = 0;
	}
	if(n == 1&&month > 2)
	{  //如果是闰年且月份大于2,总数加1天 
		sum++;
	}
	printf("这是第 %d天\n",sum);
}

二,求整形数组中的最大值
三,求数组中的次大值或者次小值

#include <stdio.h>
#define N 5

int main(int argc, const char *argv[])
{
	int i;
	int arr[N]={0};
	printf("请输入各元素的值\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&arr[i]);
	}
	int max,cimax;
	if(arr[0]>arr[1])
	{
		cimax=arr[1];
		max=arr[0];
	}
	else 
	{
		cimax=arr[0];
		max=arr[1];
	}
	for(i=2;i<N;i++)
	{
		if(arr[i]>max)
		{
			cimax=max;
			max=arr[i];
		}
		else if(arr[i]>cimax)
			cimax=arr[i];
	}
	printf("%d",cimax);
	return 0;
}

四,打印出如下图案(菱形)
*
**
******
****
*

#include<stdio.h>

int main(int argc, const char *argv[])
{
	int i,j,n=7;//i为要打印的行数,j是控制输出打印空格和星号,n是菱形为菱形的行数
	for(i=1;i<=n/2+1;i++) //先打印上半部分
	{
		for(j=1;j<=n-i;j++) //打印空格
		{
			printf(" ");
		}
		for(j=1;j<=2*i-1;j++)//打印星号
		{
			printf("*");
		}
		printf("\n");
	}
	for(i=n/2;i>=1;i--) 
	{
		for(j=1;j<=n-i;j++) //打印空格
		{
			printf(" ");
		}
		for(j=1;j<=2*i-1;j++)//打印星号
		{
			printf("*");
		}
		printf("\n");
	}
return 0;
}

五,实现99乘法表

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int x=1,y=1;
	int z=1;
	for(x;x<10;x++)
	{
		for(y=1;y<=x;y++)
		{
			printf("%d * %d = %d",y,x,y*x);
			printf(" ");
		}
	
	printf("\n");	
	}
	return 0;

六,求100 - 200之间的所有素数,进行打印
素数:只能被1和其本身整除的数字

#include <stdio.h>
//打印100-200之间的素数
int main(int argc, const char *argv[])
{
	int i=0,j=0;
	for(i=100;i<=200;i++)
	{
	int j=0;
		for(j=2;j<=i;j++)
		{
			if(i%j==0)
			break;
		}
	if(i==j)
		printf("%d ",i);
	}
	printf("\n");
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值