C语言基础–条件和循环
条件结构
if-else结构:
if(条件语句){执行体};
if(条件语句1){执行体1};
else if(条件语句2){执行体2};
else if(条件语句3){执行体3};
else {执行体4}
switch-case结构:
- swicth中表达式一定是整型
- case中语句结束前要加Break,否则后面的case语句仍会执行。
- 多case可以执行同一组语句
- case后面不能加声明,不然会报错。
- default语句可以在任意位置
switch()
{
case():case():case():{;break;}
default:break;
}
区别:
- if是区间(范围值)的判断,switch是点(精确值)的判断
- if表达式可以判断不同的内容或复合逻辑,switch只能判断单个选项
循环结构
while语句
- while语句
while(条件表达式)
{
循环体
}
题1 阶乘
/*阶乘*/
int main()
{
int n,sum=1;
scanf("%d",&n);
n++;
while(--n)
sum*=n;
printf("%d\n",sum);
}
区别:
while(n–){循环体}//执行while条件语句后执行n-1,然后再进入执行体
while(–n){循环体}//执行while条件语句前执行n-1,然后再进入执行体
题2 输出键盘输入字符个数
/*输出键盘输入字符个数 方法一*/
int main()
{
int n=0;
//连续输入一串字符一直到回车为止
while(getchar()!='\n'){
n++; //每输入一个字符,n加1
}
printf("%d\n",n);
}
/*输出键盘输入字符个数 方法二*/
int main()
{
char array_num[100] ;
int i = 0, length;
do
{
scanf("%c", &array_num[i]);
i++;
} while (array_num[i - 1] != '\n');
length = i-1;
for (i = 0; i < length; i++)
printf("%c", array_num[i]);
getchar();//VS2017中特殊设置,解决CMD窗口闪退问题
return 0;
}
char s[50];
gets(s);//将输入放进数组
先判断条件,再执行循环体
- do-while语句
do{
循环体
}
while(条件表达式);
先执行循环体,再判断条件。
for语句
for( : : ){} 条件为空时默认恒成立
for(表达式1;表达式2;表达式3)
{
循环体4
}
//执行顺序1-2-4-3-2-4-3...2-4-3-2
break,continue是针对一个循环体来说的
题:最大公约数,最小公倍数
/*
公约数:取余法
32%20-->12
20%12-->8
12%8-->4
8%4-->0,4为最大公约数
*/
int num1,num2,m,n,mid; //求num1,mun2的最大公约数
scanf("%d%d",&num1,&num2);
m=num1,n=num2; //m为较大的数
for(i=m;i>=1;--i){
mid=n;
n=m%n;
m=mid;
if(n==0)break;
}
printf("%d和%d的最大公约数为:%d",num1,num2,m)
/*方法二:直接从小的数向下逐个寻找最大公约数*/
for(i=n;i>0;--i){
if(m%i==0 && n%i==0)break;
}
printf("%d和%d的最大公约数为:%d",num1,num2,i)
/*寻找最大公倍数*/
for(i=1;i<=m;i++){
if(m%i==0 && n%i==0){m/=i,n/=i,sum*=i;}
}
printf("%d和%d的最小公倍数为:%d",num1,num2,m*n*sum)
题:一秒打印一次时间
/*
sleep函数,在头文件<unistd.h>
time获取时间函数,在头文件<time.h>
*/
#include<stdio.h>
#include<unistd.h>
#include<time.h>
time_t t=0
while(1){
t=time(NULL);
printf("%s",ctime(&t));
sleep(1);
}
题:金字塔pyramid
int main()
{
int x,y,i,tall;
printf("输入金字塔层数:");
scanf("%d",&tall);
for(x=0;x<=tall;x++){ //x层
for(y=0;y<tall-x;y++)printf(" "); //星号前面空格数tall-x
for(i=0;i<2*x-1;i++){ //打印星号数量
if(i%2==0)printf("*"); //利用判断语句,一个隔一个打印星号
else printf(" ");
}
printf("\n"); //回车完成一层输出
}
}
或者
int main()
{
int x,y,i,tall;
printf("输入金字塔层数:");
scanf("%d",&tall);
for(x=0;x<=tall;x++){ //x层
for(y=0;y<tall-x;y++)printf(" "); //星号前面空格数tall-x
for(i=1;i<=x;i++){ //打印星号数量
printf("* "); //将"* "作为一个整体,个数和层数相同
}
printf("\n"); //回车完成一层输出
}
}
/*
输入金字塔层数:8
*
* *
* * *
* * * *
* * * * *
* * * * * *
* * * * * * *
* * * * * * * *
*/
题:字母金字塔
int main(void)
{
char ch,ch1='\0';
int x,y;
printf("输入字母:");
ch=getchar();
if(ch>='a'&&ch<='z')ch-=32;
if(ch>='A'&&ch<='Z')
{
for(ch1='A';ch1<=ch;ch1++)
{
for(x=0;x<ch-ch1;x++)printf(" ");
for(y=1;y<=(ch1-'A')*2+1;y++)printf("%c",ch1);
printf("\n");
}
}
else printf("error");
printf("\n");
}
/*
输入字母:g
A
BBB
CCCCC
DDDDDDD
EEEEEEEEE
FFFFFFFFFFF
GGGGGGGGGGGGG
题:99乘法表
int main()
{
int x,y;
for(x=1;x<10;x++)
{
for(y=1;y<=x;y++)
printf("%d×%d=%-3d\t",y,x,x*y);
printf("\n");
}
}
/*
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
*/
题:calendar
计算日期为星期几–基姆拉尔森计算公式
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400+1)%7