第三周 循环
标签(空格分隔): 程序设计入门—C语言
3.1 循环
3.1.1 循环
//数数几位数----------------------------------------------------------------
#include<stdio.h>
int main() {
int num ;
int n=0;
n++;
scanf("%d",&num);
//根据范围判断
if(num>999)
{
n=4;
} else if(num>99)
{
n=3;
}else if (num>9)
{
n=2;
}
printf ("%d\n",n);
//题目明确四位及以下的整数,简化了判断,反过来不行
//用">"来判断的时候,从高处往下走,因为从高处往下判断,不需要判断上限
//while循环
num/=10;
while (num>0){
n++;
num/=10;
}
printf ("%d\n",n);
//do while循环
do
{
n++;
num/=10;
}while(num>0);
printf ("%d\n",n);
return 0;
}
- 复合赋值
- 5个算术运算符,+-*/%,可以和赋值运算符”=”结合起来,形成复合赋值运算符:
+=、-=、*=、/=、%=
total +=(sum+100)/2; --> total = total + (sum+100)/2;
total *= sun+12; --> total = total*(sum + 12);
- 5个算术运算符,+-*/%,可以和赋值运算符”=”结合起来,形成复合赋值运算符:
- 递增递减运算符
- ”++”和”–”是两个很特殊的运算符,它们是单目运算符,这个算子还必须是变量,这两个运算符分别叫做递增和递减运算符,它们的作用是给这个变量+1或-1
count++; count += 1; count = count + 1;
- 前缀后缀
- ++和–可以放在变量前面,叫做前缀形式,也可以放在变量后面,叫做后缀形式
- a++的值是a+1以前的值,++a的值是a+1以后的值,无论哪个
3.1.2 while循环
while (条件){
语句;
}
//------------------------
do{
<循环体>
}while(循环条件);
//两种循环的区别是在什么时候做判断,判断的条件是什么
- while循环
- 循环体内要有改变条件的机会
- 如果我们把while翻译成当,那么一个while循环的意思就是:当条件满足时,不断的重复循环体内的语句
- 循环之前判断是否继续循环,所以有可能循环一次也没有被执行
- 条件成立是循环继续的条件
- 看程序运行结果
人脑模拟计算机的运行,在纸上列出所有的变量,随着程序的进展不断重新计算变量的值。当程序运行结束时,留在表格最下面的就是程序的最终结果。 - 验证
- 测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等
- 个位数,10,0,负数
- 在程序适当的地方插入printf输出变量内容,来调适程序
- 在程序中输出hr1 hr2看程序运行到哪
3.1.4 do-while循环
- do-while循环
在进入循环的时候不做检查,而是在执行完循环体的一段代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环 - 两种循环
- do-while循环和while循环很像,区别是在循环体结束的时候才来判断条件。也就是说,无论如何,循环体都会至少执行一遍,然后再来判断条件。
- 与while循环相同的是,条件满足时执行循环,条件不满足时结束循环
3.2 循环计算
- 小套路
- 计算之前先保存原始的值,后面可能有用
//求平均数----------------------------------------------------------------
#include<stdio.h>
int main(){
int num;
int sum=0;
int n=0;
scanf("%d",&num); /*这个要先读一遍,否则将scanf写在循环体第一行,输入-1会在sum中-1*/
while (num != -1){
sum+=num;
n++;
scanf("%d",&num);
}
double average=1.0*sum/n;
printf("%f\n",average);
return 0;
}
//猜数游戏--------------------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand(time(0));
int num=rand()%100+1; //生成一个随机数,%100即得到一个0-99的数字
int count=0;
int b;
printf("告诉我你猜的1-100之间的数字");
do{
scanf("%d",&b);
count++;
if (b>num){
printf("猜的数字大了!告诉我你猜的:");
}else if(b<num){
printf("猜的数字小了!告诉我你猜的:");
}
}while(num!=b);
printf("\n***恭喜你,猜对了!***\n*** 一共猜了%d次 ***",count);
//逆序的整数----------------------------------------------------------------
#include<stdio.h>
int main(){
int num ;
scanf("%d",&num);
int a;//取每一位 700-->007
int ret=0;//结果 700-->7
do{
a=num%10;
num=num/10;
printf("%d",a);
ret=ret*10+a;
}while(num>0);
printf("\n%d",ret);
return 0;
}
第三周编程题
1奇偶个数(5分)
- 题目内容:你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
- 输入格式:一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
- 输出格式:两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
- 输入样例: 9 3 4 2 5 7 -1
- 输出样例: 4 2
#include <stdio.h>
int main()
{
int i;
int ji = 0, ou = 0;
scanf("%d", &i);
while( i != -1){
if( i%2 == 0){
ou = ou + 1;
}else{
ji = ji + 1;
}
scanf("%d", &i);
}
printf("%d %d", ji, ou);
}
2数字特征值(5分)
题目内容:对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
这里的计算可以用下面的表格来表示:
数字 | 3 | 4 | 2 | 3 | 1 | 5 |
---|---|---|---|---|---|---|
数位 | 6 | 5 | 4 | 3 | 2 | 1 |
数字奇偶 | 奇 | 偶 | 偶 | 奇 | 奇 | 奇 |
数位奇偶 | 偶 | 奇 | 偶 | 奇 | 偶 | 奇 |
奇偶一致 | 0 | 0 | 1 | 1 | 0 | 1 |
二进制位值 | 32 | 16 | 8 | 4 | 2 | 1 |
- 按照二进制位值将1的位的位值加起来就得到了结果13。
- 你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
- 提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
- 输入格式:一个非负整数,整数的范围是[0,100000]。
- 输出格式:一个整数,表示计算结果。
- 输入样例: 342315
- 输出样例: 13
#include <stdio.h>
int main()
{
int num, sum;//计数和输出
int i, j=1; //记录数字和数位
int n=1; //二进制位值
scanf("%d", &num);
while (num > 0){
i = num % 10;
if( i%2 == j%2 ){
sum = sum + n;
}
n = n * 2;
j = j + 1;
num = num/10;
}
printf("%d",sum);
}