一、选择题
1、关于while(条件表达式) 循环体,以下叙述正确的是( )? (假设循环体里面没有break,continue,return,goto等等语句)
A.循环体的执行次数总是比条件表达式的执行次数多一次
B.条件表达式的执行次数总是比循环体的执行次数多一次
C.条件表达式的执行次数与循环体的执行次数一样
D.条件表达式的执行次数与循环体的执行次数无关
答案解析:
正确答案:B
while语句:条件表达式为真,才执行后面的循环语句,否则不执行。-->选项B对
知识点:
1、循环语句:
(1)while语句--->先判断,再执行
//语法结构:
while(条件表达式)
{
循环体;
}
我们可以while语句和if语句相似:
①条件表达式为真,才执行后面的循环语句,否则不执行。(注if语句只会执行一次,但while语句可以重复执行)
②while后面只能控制一条语句,循环体如果要包含一个以上的语句,必须使用代码块(复合语句)
(2)for语句--->与while一样的效果,但是形式更优
//语法结构:
for(初始化部分;循环条件部分;调整部分)
{
循环体;
}
理解for的三个部分:
①初始化部分:用来初始化循环变量,注只在循环开始时,执行一次
②循环条件部分:用来判断循环什么时候终止(每次循环都要执行,如果循环条件为true,进入循环体,如果为false,退出循环)
③调整部分:用于循环条件的调整,每次循环结束的时候执行(使循环条件趋于false的语句)
(3)do……while语句--->先执行,在判断(至少执行一次)
//语法结构:
do
{
循环体;
}while(条件表达式);
循环的使用:for>while>do……while(具体按实际情况使用)
2、总结一个循环有着三个重要组成:
①循环初始化部分
②循环条件判断部分
③循环调整部分(使循环条件趋于false的语句,如果无此语句,则循环变量始终不改变,可能无限循环)
2、程序的输出结果是?( )
#include <stdio.h> int main() { int a = 0, b = 0; for (a = 1, b = 1; a <= 100; a++) { if (b >= 20) break; if (b % 3 == 1) { b = b + 3; continue; } b = b-5; } printf("%d\n", a); return 0; }
A.10
B.9
C.8
D.7
答案解析:
正确答案:C
知识点:
1、break的作用和应用
①break只在switch和循环中应用
②作用:在switch中break的作用是实现分支;在循环中的作用是终止循环
③应用:当某种情况(条件)满足时,想让循环提前终止
2、continue的作用和应用
①continue只在循环中应用
②作用:终止本次循环,进入下一次循环
③应用:当某种情况(条件)满足时,这一次循环内部后面的代码我不想它执行
二、编程题
1、在屏幕上输出9*9乘法口诀表
//在屏幕上输出9*9乘法口诀表
//1*1=1
//2*1=2 2*2=4
//3*1=3 3*2=6 3*3=9
//4*1=4 4*2=1 4*3=12 4*4=16
/*
思路:两个循环进行控制
外层循环控制打印几行
内层循环控制一行打印几列以及表达式内容
分析:①行控制列,行等于列
②为了打印整齐,i*j的结果的格式控制用%2d,
*/
#include<stdio.h> int main() { int i = 0;//行 int j = 0;//列 //打印9行 for (i = 1; i <= 9; i++) { //一行打印几列 for (j = 1; j <= i; j++) { printf("%d*%d=%2d ", i, j, i * j); } //打印完一行换行 printf("\n"); } return 0; }
运行结果:
2、求10 个整数中最大值
/*
分析:①10个整数--->定义一个整形数组
②要求一个集合中的最大值max,先假设集合中的第一个元素为max,
再与集合中的每个元素一一比较。
注:max的初值不能用集合外的元素。
步骤:
①定义一个整形数组
②采用循环的方式输入一个数组
③max赋初值
④采用循环的方式依次获取数组中的每一个元素,
与max进行比较,if(arr[i]>max)更新max标记的最大值
数组遍历结束后,max中保存的即为数组中的最大值
*/
#include<stdio.h> int main() { int arr[10] = { 0 }; //给数组赋值 int i = 0;//下标 for (i = 0; i < 10; i++) { scanf("%d", &arr[i]); } int max = arr[0];//使用max标记最大值,并赋初值 //遍历数组,找到数组中的最大值 for (i = 0; i < 10; i++) { if (max < arr[i]) { max = arr[i]; } } //输出 printf("%d\n", max); return 0; }
3、分数求和:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,打印出结果
/*
分析:
①表达式有100项,分母1~100
②‘/’操作符:
a.整数除法:两个操作数都为整数
b.浮点数除法:只要有操作数是浮点数即可
c.计算结果是商
③正负交替(用flag标记控制):一个正数*1还是一个正数,*-1变成负数
或用if……else语句判断“奇正偶负”
*/
#include<stdio.h> //代码1:用flag标记控制“正负交替" int main() { int i = 0;//分母 double sum = 0.0;//求和结果 int flag = 1; //设置循环i:1~100 for (i = 1; i <= 100; i++) { sum += flag * (1.0 / i);//累加 flag *= -1; } //输出 printf("%lf\n", sum); return 0; } //代码2:if……else语句判断“奇正偶负” //int main() //{ // int i = 0; // double sum = 0.0; // // for (i = 1; i <= 100; i++) // { // if (i % 2 == 1) // { // sum += 1.0 / i; // } // else // { // sum -= 1.0 / i; // } // } // // printf("%lf\n", sum); // // return 0; //}
运行结果:
4、编写程序数一下 1到 100 的所有整数中出现多少个数字9
/*
分析:
①循环从1遍历到100
②判断每一个数据9的个数,将所有9的个数统计在count计数中
a.通过%10的方式取的当前数据的个位,判断个位数据是否为9
是则,给计数器+1
b.通过/10的方式取的当前数据的十位,判断十位数据是否为9
是则,给计数器+1
注意:判断个位和十位是两件不同事情,是有两个if语句分别判断
循环结束,所有数据判断完,所有9的个数已经统计在count计数器中
*/
#include<stdio.h> int main() { int i = 0;//存储数据 int count = 0;//计数器 //遍历1~100 for (i = 1; i <= 100; i++) { //判断个位数据是否为9 if (i % 10 == 9) { count++; } //判断十位数据是否为9 if (i / 10 == 9) { count++; } } //输出9的个数 printf("%d\n", count); return 0; }
5、编写代码在一个整形有序数组中查找具体的某个数
要求:找到了就打印数字所在的下标,找不到则输出:找不到。
/*
二分查找:
前提:在一个有序数组
准备:计算出右下标:right=sizeof(arr)/sizeof(arr[0])-1;//元素个数-1
具体找的方式:
1、找到数组的中间位置:mid=(left+right)/2
2、判断中间位置的数据是否与要查找的数据key相等
①相等,找到,打印下标,跳出循环
②key<arr[mid],则key可能在arr[mid]的左半侧,继续到左半侧进行二分查找
新的right:right=mid-1;
③key>arr[mid],则key可能在arr[mid]的右半侧,继续到右半侧进行二分查找
新的left:left=mid+1;
如果找到返回下标并退出,否则继续,直到区间中没有元素时(left>right)
说明key不在数组中,打印找不到
*/
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int key = 7;//查找的数 int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1; //二分查找 while (left <= right) { int mid = (left + right) / 2; if (key == arr[mid]) { printf("找到了,下标为%d\n", mid); break;//跳出循环 }//判断是否相等 else if (key < arr[mid]) { right = mid - 1; }//判断key是否小于中间数据,是则需要改变右边界 else { left = mid + 1; }//最后一种情况就是key大于中间数据,需要改变左边界 } //判断是否为直到数组元素查找完left>right,是则说明key不再数组,找不到 if (left > right) { printf("找不到\n"); } return 0; }