第四周 循环控制
标签(空格分隔): 程序设计入门—C语言
4.1 for循环
- 阶乘
#include<stdio.h>
int main (){
int num =0;
scanf("%d",&num);
//while循环
// int i=2;
// int he=1;
// printf("%d!=1",num);
// while(i<=num){
// he*=i;
// printf("*%d",i);
// i++;
// }
// printf("=%d\n",he);
//do while循环
// int i=1;
// int he=1;
// do{
// he*=i;
// i++;
// }while(i<=num);
int i=1;
int he=1;
// for (i=2;i<=num;i++){
// he*=i;
// }
for(i=num;i>1;i--){
he*=i;
}
printf("%d!=%d",num,he);
return 0;
}
- for循环
- for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器达某值之前,重复执行循环体,而每执行一轮循环,计数器就以一定的步进进行调整
- for = 对于
- for (count=10;count>0;count–)
- 对于一开始的count=10,当count>0时,重复做循环体,每一轮循在做完循环体内语句后,使得count–
- 小套路
- 做求和的程序时,记录结果的变量应该初始化为0,而做求积的程序时,记录结果的变量应该初始化为1
- 循环控制变量i只在循环里被使用了,再循环外面它没有任何用处。因此我们可以把变量定义写到for语句里面去
for(int i=0; i<10; i++)
(only C99) - 同while相同,先做判断,for中每一个表达式都是可以省略的
int i=n; for( ; i>1; i--)
//for循环
for(初始值;循环条件;步进){
循环体;
}
- 循环的次数
- for(i=0; i<5; i++)
- for(i=1; i<=5; i++)
- 走的次数相同,但i值不同
- 循环的选择
- 如果有固定次数 用for
- 如果必须执行一次 用do-while
- 其他情况 用while
4.2 循环控制
4.2.1 循环控制
- 素数
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int i=2;
int sf = 1; //是否是素数
for ( ; i<n; i++ ){
if( n%i == 0 ){
sf=0;
break;
}
}
if ( sf ==1 ) {
printf("%d是素数\n",n);
} else {
printf("%d不是素数\n",n);
}
return 0;
}
- break VS continue
- break; 跳出循环
- continue; 跳过循环这一轮剩下的语句,进入下一轮
- break和continue都只能对它所在的那重循环做
4.2.2 逻辑运算
- 逻辑运算
- 逻辑运算是对逻辑量进行的运算,结果只有0和1
- 逻辑量是关系运算或逻辑运算的结果
运算符——描述——-示例
!———-逻辑非—–!a
&&——–逻辑与——a&&b
||———–逻辑或——a||b - 优先级
!>&&>||
- 如何判断一个字符c是否是大写字母
- c>=’A’ && c<=’Z’
!age<20
- 逻辑运算符优先级是普遍低于比较运算符的,但是!是单目运算符,单目运算符高于双目运算符。实际相当于(!age) < 20
优先级
- ( ) (从左往右)
- !、+、-、++、– (从右往左)
- *、/、% (从左往右)
- +、- (从左往右)
- <、<=、>、>= (从左往右)
- ==、!= (从左往右)
- && (从左往右)
- || (从左往右)
- =、+=、-=、*=、/=、%= (从右往左)
- 短路
- 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
- a==6 && b==1 如果a不等于6 右边就不会做了
- a==6 && b+=1 不要把赋值,包括复合赋值组合进表达式
- 对于&&,左边false,不做右边了
- 对于||,左边true,不做右边了
4.2.3 多重循环
- 100以内的素数
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int j =1;
for ( ; j<=n; j++){
int i=2;
int sf = 1; //是否是素数
for ( ; i<j; i++ ){
if( j%i == 0 ){
sf=0;
break;
}
}
if ( sf ==1 ) {
printf("%d,",j);
}
}
printf("\n");
return 0;
}
4.2.4 离开多重循环
- 接力break
- goto
- 建议只在多重循环的时候使用
- 建议只在多重循环的时候使用
4.3循环计算
//求和------------------------------------------------------------
#include<stdio.h>
int main(){
int n;
printf("请输入数字:") ;
scanf("%d",&n);
// f(n)=1+1/2+1/3+...
// int i=1;
// double sum=0;
// for(i=1;i<=n;i++) {
// sum+=1.0/i;
// }
// printf("f(%d)=%f\n",n,sum);
// f(n)=1-1/2+1/3+...
int i=1;
double sum=0;
double sign=1;
for(i=1;i<=n;i++) {
sum+=sign/i;
sign=-sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
//最大公约数------------------------------------------------------------
#include<stdio.h>
int main(){
int a,b;
printf("请输入两个数字:") ;
scanf("%d %D",&a,&b);
//枚举
// int min;//两个数小的一个,循环上限
// if(a>b){
// min=b;
// }else{
// min=a;
// }
//
// int i=2;
// int ret=1;//记录公约数
// for(;i<=min;i++){
// if(a%i==0 && b%i==0){ // 错误if(a%i==b%i==0)
// ret=i;
// }
// }
/*辗转相除法
1.如果b等于0,计算结束,a就是最大公约数
2.否则计算a除以b的余数,让a等于b,而b等于那个余数
3.回到第一步*/
int i;
while(b!=0){
i=a%b;
a=b;
b=i;
}
printf("最大公约数是%d",a) ;
return 0;
}
//正序分解整数------------------------------------------------------------
#include<stdio.h>
int main(){
int n;
printf("请输入数字:");
scanf("%d", &n);
> //整数逆序
> int t=0;
> do{
> int d = n%10;
> t=t*10+d;
> n=n/10;
> } while( n!=0 );
> printf("%d\n", t);
> //逆序分解
> do{
> int d = t%10;
> printf("%d", d);
> if( t>=10 ) {
> printf(" ");
> }
> t = t/10;
> } while(t>0);
> //只适用于末尾不是0的情况
int n;
scanf("%d", &n);
int wei=1;
int x=n;
while( x>=10 ){
wei*=10;
x /=10;
}
// printf("%d\n", wei);
> while( wei > 0) {
> int d = n/wei;
> printf("%d", d);
> if(n>=10){
> printf(" ");
> }
> n %= wei;
> wei/=10;
> }
do {
int d = n/wei;
printf("%d", d);
if(n>=10){
printf(" ");
}
n %= wei;
wei/=10;
} while( wei > 0);
printf("/over");
return 0;
}
第四周编程题
1素数和(5分)
题目内容:我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0
#include<stdio.h>
int main(){
int n,m;
scanf("%d %d",&n,&m);
int sum=0;
int i;
int x=0;//计数器
for(i=2;x<m;i++){
int a=2;
int isPrime=1;
for(;a<i;a++){
int x=i%a;
if(x==0){
isPrime=0;
break;
}
}
if(isPrime==1){
printf("%d ",i);
x++;
if(x>=n){
sum+=i;
}
printf("%d\n",x);
}
}
printf("素数和是%d ",sum);
return 0;
}
2念整数(5分)
题目内容:你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:fu er san si yi
输入格式:一个整数,范围是[-100000,100000]。
输出格式:表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例: -30
输出样例: fu san ling
#include<stdio.h>
int main(){
int n;
printf("请输入数字:") ;
scanf("%d",&n);
if(n<0){
printf("负 ");
n=-n;
}
int x=n;
int i=1;//位数
while(x>=10){
x/=10;
i*=10;
}
// printf("%d\n",i);
int p;
while(i>0){
p=n/i;
n%=i;
i/=10;
// printf("%d",p);
switch(p){
case 0:printf("零");break;
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
}
if(i>0){
printf(" ");
}
}
printf("/over");
return 0;
}
期中测试
- 在代码:while ( !e )中,!e等价于:e == 0
- 任何非0整数值就是逻辑的true,所以只有e是0的时候,!e才会是true
以下代码片段的输出是:
int j=4; for ( int i=j; i<=2*j; i++ ) { switch ( i/j ) { case 0: case 1: printf(“*”); break; case 2: printf(“#”); } } A.*# B.****## C.***# D.****#
对于以下代码:执行后,i会有几种可能性?(7)
int i;
scanf(“%d”, &i);
i %= 4- 以下表达式x&&1用在if的条件中时,和x是等价的(B)
A.x==1
B.x
C.x!=1
D.x==0
- 右边的1是确定的值,所以其实不起作用