知识点1【作业讲解】
作业1:
void test01()
{
char ch =0x85 ;//1000 0101>>4
//逻辑右移: 1000 0101>>4 == 0000 1000 == 0x08
//算术右移:1000 0101>>4 == 1111 1000 == 0xf8
ch = ch>>4;
printf("ch = %#x\n",ch);//0xf8是算术右移
//逻辑右移、算术右移是编译器决定 我们只能测试 不能改变
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
作业:
void test02()
{
//需求:请输入1~7的数 判断是星期几
int date = 0;
printf("请输入1~7的数:");
scanf("%d", &date);
switch(date)
{
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("请输入有效数值\n");
break;
}
}
int main(int argc,char *argv[])
{
test02();
return 0;
}
知识点2【for循环】
for( 初始语句; 循环条件 ; 步进条件)
{
//循环语句
}
//初始语句:只在循环开始时 执行一次
//循环条件:每次循环都要执行 如果循环条件为真 进入循环体 如果为假 退出循环
//步进条件:每次循环结束的时候 要执行的语句
案例:求1~100的和
void test03()
{
//1+2+3+4+ ...+ 100
int i=0;
int sum = 0;
for(i=1 ; i<=100 ; i++)//i++ ==> i=i+1
{
sum = sum+i;
}
printf("sum = %d\n",sum);//5050
}
案例:
void test03()
{
//1+2+3+4+ ...+ 100
int i=1;
int sum = 0;
//如果变量 提前初始化了 for的初始化语句 可以省略
for( ; ; )//建议别这么做
{
//如果for省略循环条件 必须在循环语句中实现 退出循环的条件
if(i>100)
break;//跳出循环
sum = sum+i;
i++;//如果for省略步进条件 必须在循环语句中实现 步进动作
}
printf("sum = %d\n",sum);//5050
}
int main(int argc,char *argv[])
{
test03();
return 0;
}
案例:
void test04()
{
for(;;)
{
for(;;)
{
break;//只能跳出离它最近的一层循环
}
}
}
案例:
void test05()
{
int i=0;
int sum = 0;
for(i=1 ;i<=100 ; i++)
{
//sum = sum+i;
if(i == 50)
continue;//结束本次循环 立即从当前位置直接 进入下一次循环
sum += i;
}
printf("sum = %d\n",sum);//5000 仅仅是少加了一个50
}
案例:求出0~100的所有偶数的和
void test06()
{
//求0 2 4 6 8......100的和
int i=0;
int sum = 0;
for(; i<=100 ; i=i+2)//步进条件不是单纯的 ++i
{
sum += i;
}
printf("sum = %d\n",sum);//2550
}
循环嵌套循环(了解)
void test07()
{
int i=0;
int j=0;
//总结 外层循环的次数 * 内层循环的次数 == 总循环次数
for(i=0;i<10;i++)//0~9 =10
{
for(j=0;j<10; j++)//0~9 =10
{
printf("i=%d, j=%d\n", i,j);//循环100次
}
}
}
作业:
1、求出1~100中能被7整除的数。
知识点3【while 循环、do…while】
while
while(循环条件)
{
//循环语句
}
//如果“循环条件”为真 就进入循环体执行循环语句
注意:
1、while没有初始化语句 用户提前初始化好。
2、while没有步进语句 用户必须在循环语句中 写好 步进语句。
案例:
void test08()
{
int i=1;//提前初始化
int sum = 0;//局部变量如果不初始化 内容不确定
while(i<=100)
{
sum += i;
i++;//不仅条件
}
printf("sum = %d\n", sum);//5050
}
do…while();
do
{
//循环语句;
}while(循环条件);
先执行循环语句 再判断循环条件是否为真 如果为真 进行下次循环 如果为假 直接退出循环
void test09()
{
int num = 0;
do
{
printf("ok\n");
}while(num>0);
}
goto 跳转
void test10()
{
printf("-------001-------\n");
printf("-------002-------\n");
goto here;
printf("-------003-------\n");
printf("-------004-------\n");
printf("-------005-------\n");
here:
printf("-------006-------\n");
printf("-------007-------\n");
}
运行结果:作业:重复输入1~7的数值判断 星期几,注意输入0,就结束程序,如果是0或1~7以外的数,请提示“请重新输入有效数值”。
总结:for while 我们如何选择呢?
如果循环的次数是确定的 建议选择for。
如果循环的次数不确定,知道退出的条件 建议选择while.
知识点4【数组的概述】知识点5【一维数值数组】
1、数组的定义
需求:请定义一个数组 该数组 有10个元素 每个元素为int
在定义的时候:
a、arr[] arr和[]结合是数组
b、将确定的元素的个数放入 []中
c、用元素的类型 定义一个普通变量
d、从上往下整体替换。
int arr[10];
注意:
1、数组名 arr 不能和其他变量名 同名
2、数组的元素小标是从0开始:0~9
3、数组的元素 分别是:arr[0]、arr[1]~arr[9], 如果访问arr[10]数组越界。
4、数组的元素 等价于 普通变量
5、在定义数组的时候 ,[]里面的值 不能是变量(c89)。
案例:遍历数组:
void test01()
{
//局部数组 如果不初始化 内容不确定
int arr[10];
int i=0;
//遍历数组
for(i=0;i<10; i++)
{
printf("%d ",arr[i]);//输出的都是不确定的值
}
printf("\n");
}
运行结果:案例:数组的初始化
初始化:定义的时候 给变量 或数组元素 赋值的动作 叫初始化。
全部初始化
int arr[5] = {10,20,30,40,50};
//如果是 全部初始化 数组元素的个数 可以省略 实际的元素个数由 初始化个数决定
int arr[] = {10,20,30,40,50};//少用
//错误显示
int arr[];//错误无法确定数组的大小
部分初始化
//部分初始化 未被初始化 部分自动补0 (重要)
int arr[5] = {10,20,30};
//初始化数组 常见的操作(将数组的所有元素清零)
int arr[5] = {0};//只初始化arr[0]=0,未被初始化部分 自动补0
int arr[5] = {2};//2 0 0 0 0
扩展:初始化
int arr[5]={[2]=3, [4]=7};//0 0 3 0 7
//[2]=3将数组的第2个元素 初始化为3
//[4]=7将数组的第4个元素 初始化为7
数组的空间大小:(重要)
//arr数组名 作为数组类型 代表的是数组空间的总大小
int arr[5] = {10,20,30,40,50};
int n = 0;
//数组的总大小 = 元素的个数 * 每个元素的大小
printf("数组的总大小=%d\n",sizeof(arr));//20
//数组元素的大小 arr[0]是数组的第0个元素
printf("数组元素的大小 = %d\n",sizeof(arr[0]));//4
//数组元素的个数 = 数组总大小/每个元素的大小
n = sizeof(arr)/sizeof(arr[0]);
printf("数组元素的个数为:%d\n", n );
案例:
void test05()
{
int arr[] = {10,20,30,40,50,1,2,10};
int n = sizeof(arr)/sizeof(arr[0]);//是求数组的元素个数
int i=0;
//遍历数组
for(i=0;i<n; i++)
{
printf("%d ",arr[i]);//输出的都是不确定的值
}
printf("\n");
}
int main(int argc,char *argv[])
{
test05();
return 0;
}
运行结果:案例:
void test06()
{
int arr1[5]={1,2,3};
int arr2[]={1,2,3};
char arr3[5]={1,2,3};
int arr4[]={[5]=7};
printf("%d\n",sizeof(arr1));//20
printf("%d\n",sizeof(arr2));//12
printf("%d\n",sizeof(arr3));//5
printf("%d\n",sizeof(arr4));//24 //vc++6.0不支持
}
int main(int argc,char *argv[])
{
test06();
return 0;
}
数组元素的操作
数组的元素 等价于 普通变量
void test07()
{
int arr[5]={1,2,3,4,5};
int n = sizeof(arr)/sizeof(arr[0]);
int i=0;
//给数组元素 赋值
arr[0] = 100;
//num++
arr[1]++;//arr[1]=arr[1]+1;
//scanf("%d",&num)
scanf("%d",&arr[2]);
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
案例:定义数组 5个元素 每个元素int类型 获取键盘输入
void test08()
{
//数值数组 只能逐个元素操作 不能整体操作
int arr[5]={0};
int n = sizeof(arr)/sizeof(arr[0]);
int i=0;
printf("请输入%d个int数据\n", n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);//&arr[i] 表示取第i个元素的地址
}
for(i=0;i<n;i++)
{
printf("%d ", arr[i]);//arr[i] 访问数组的第i个元素
}
}
作业:定义数组 5个元素 每个元素int类型 获取键盘输入 请求出数组的最大值、最小值、平均值。
知识点6【二维数组】
二维数组的定义
int arr[3][4];
//第一个[]里面的值 表示行数 ,第二个[]里面的值 表示列数
//arr数组有3行4列
//3行:0~2行 4列:0~3列
二维数组的遍历:
int i=0;
for(i=0;i<3;i++)
{
//遍历第i行
int j = 0;
for(j=0;j<4; j++)
{
printf("%d ",arr[i][j])
}
}
案例:
void test01()
{
int arr[3][4];//局部数组不初始化元素内容不确定
int i=0,j=0;
for(i=0;i<3;i++)//行的变化
{
for(j=0;j<4;j++)//列的变化
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
运行结果:二维数组的初始化
分段初始化:用{}里面的{}明确的表示一行
int arr[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
连续初始化:放满一行 才能放下一行
int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
案例:
void test01()
{
int arr1[3][4]={{1,2},{3},{4,5}};
int arr2[3][4]={1,2,3,4,5};
printf("%d\n", arr1[1][2]+arr2[1][2]);
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
作业:定义int arr[3][4]的二维数组,获取键盘输入,并求出每一行的平均值。