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;
}