Day 4

结论:
1.浮点数不能%(取余)运算,取余运算不能为小数。
printf("%f\n", 8%3); //编译时会报出警告,输出结果,此结果为0.000000
printf("%d\n", 8%3); //此结果为2
printf("%f\n", 8.8%3); //此编译时直接为错误,不能运行。

2.在 scanf中是不可指定精度的。
sacnf("%3.2%3.2", &a, &b); //此编译会警告,运行结果会出错。

3.匿名或临时变量都为右值,不能为左值
X4 = 1+2 = 3; //此表达式为错。 赋值运算是从右向左执行的,不能将匿名变量3 赋值给匿名变量 1+3

4.三目运算符 X ? y:z; X为表达式; 如果X为真则 输出y. 如果表达式为假则输出z.

5.double 转int 会小数截断;
double i = 2.8;
printf("%f\n", i); //此处输出的结果为 2.800000 小数点后面六位
printf("%d\n", (int)i); //此处输出的结果为 2 小数部分在类型强制转换后被截断
6. ++i 与 i++ (++i)表达式与变量都加过。 (i++)表达式没加过,变量已经加过。
7. 使用if…else 语句 来实现判断某年的某月有多少天:
分析: 先使用if,,,及 else 判断普通情况,然后对二月做特殊处理,根据年份来判断二月的天数。
int main(void)
{
int year ;
int month;
int days;
printf(“please input year and month:”);
scanf("%d%d", &year, &month);
printf(“year:%d month:%d\n”, year, month);
if(month > 0 && month < 13)
{
if(1 == month || 3 == month || 5 == month || 7 == month || 8 == month || 10 == month || 12 == month) //这种判断是否相等,把常量写左边,变量写右边。
{
//printf(“this month is 31 day!”);
days = 31;
}
else if(4 == month || 6 == month || 9 == month || 11 == month)
{
//printf(“this month is 30 day!”);
days = 30;
}
else
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{

			//printf("this month is 29 day!");
			days = 29;
		}
		else
		{
			//printf("this month is 28 day!");
			days = 28;
		}
	
	}
	
	printf("this month is %d days!\n", days);
	return 0;
}	

printf("input invaild!\n");
return 1;

}

  1. switch(整型常量表达式)
    {
    case 整型常量表达式1 : 语句1; break;
    case 整型常量表达式2 : 语句2; break;
    case 整型常量表达式3 : 语句3; break;
    default: 其它语句; break;
    }
    switch 为多分支选择语句 ,它会根据常量表达式来选择所要执行的语句,要重点注意的是,每个分支后面的 break 不能被省略,不然会顺序执行此分支及此分支以下的语句。
    例如: 语句1 语句2 缺少 break .如果条件是整型常量表达式1,则会执行 语句1 语句2 语句3 ; 如果条件是整型常量表达式2,则会执行 语句2, 语句3。

用 switch 语句 输出 某年的某月 有多少天:
分析:1.用 switch 分支来选择,如果条件表达式选择为年分的话,则年分太多,根本不可能。但月份每年只有12月,因此选择月份为条件来分支判断。
2. 1,3,5,7,8,10,12月都有31天
3. 6,4,9,11月都为30天
4. 2月比较特殊,如果闰年为29天,如果平年为28天
5.则先根据月份判断天数,在二月的分支时里面可以嵌入一个if判断语句,来判断是否为闰年,则会得出二月到底多少天。

int main(void)
{
int year = 2019, month = 19;
int days;
switch(month)
{
case 1: //多个case都执行同一语句时,可以并列case然后将语句放在最后一个case后面
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 2:
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //此处判断是否为闰年,判断条件,四年一闰,百年不闰,四百年再闰。
{
days = 29;
}
else
{
days = 28;
}
break;
default:
printf(“input invaild!\n”);
return 1;
break;
}

printf("this month is %d day!\n", days);
return 0;

}

9.循环语句:
goto 语句
*
**
***
****
*****
******
此处有一个特殊情况,当写 switch 中的 default :时一定要写正确,不然写成了 defualt : 编译器是检查不出错误的,它会以为 defualt : 是标签。因此运行时会出错,出现程序崩溃。

int main(void)
{
	int i = 0;
//此处为标签,标签名字遵循变量命名法,goto 为无条件跳转语句,一般这种语句都是不使用的,但极个别的情况,可以使用此语句来特殊处理。有些疑难杂症利用此语句的特殊性来解决正好。
label: 
	if(i <= 10)
	{
		printf("%d\n", i);
		++i;
		goto label;  //跳到前面标签处。
	}
	return 0;
}

结果会打印0 到 10
while() 语句
while()后面直接加; while(); 相当于while(){}

do
{

}while(表达式); //注意要写分号,此循环至少会执行一次,再判断。

int i;
for (i = 0; i < 10; ++i;)
1 2 3
{
4 //语句
}
此语句执行时 顺序是 1 2 4 3 2 4 3 如此反复直到循环执行的条件不满足就会跳出循环。

小结: 循环语句的三个要点:1.必须要有循环变量的初始化。
2.要有循环执行的条件。
3.要有使循环趋于结束的语句。
int i = 0;
for( ; i < 0; ++i)
{
//语句
}

求二元一次方程的两个实根:

#include <math.h> //后面用到了数学函数所以要包含此头文件
int main(void)
{
double a, b, c;
double ret, ret1;
double x1, x2;
printf(“please input a b c :\n”);
scanf("%lf%lf%lf", &a, &b, &c);
if(0 == a)
{
printf(“error!\n”);
printf(“please input a b c :\n”);
while(getchar() != ‘\n’)
{
}
scanf("%lf%lf%lf", &a, &b, &c);
// return 1;
}
printf(“receive abc is:%f %f %f\n”, a, b, c);
ret = b * b - 4 * a * c; // 此处的计算可以减少后面重复计算导致的效率低的问题。
ret1 = 2 * a;
if(ret > 0)
{
x1 = (-b + sqrt(ret))/ret1;
x2 = (-b - sqrt(ret))/ret1;
}
else if(0 == ret)
{
x1 = x2 = -b/ret1;
}
else
{
printf(“result error\n”);
return 2;
}
printf(“result:x1:%f x2:%f\n”, x1, x2);
return 0;

}

求100 内可以整除3 的数:

int main(void)
{
int i = 0;
// int sun = 0;
for(i = 0; i <= 100; i++)
{
if(0 == i % 3)
{
printf("%d, “, i);
}
}
printf(”\b\b \n"); //此处倒退两个然后补空格消除掉最后一个逗号。

/* do
{
printf("%d, “, i);
++i;
}while(i <= 100);
printf(”\b \n"); */
return 0;

}

计算打印1000以内的水仙花数:
153 = 1^3 + 5^3 + 3^3

int main(void)
{
int i;
for(i = 100; i < 1000; ++i)
{
int a, b, c;
int ret;
a = i % 10; //取个位
b = i / 10 % 10; //取十位
c = i / 100; //取百位
ret = c * c * c + b * b * b + a * a * a;
if(i == ret)
{
printf("%d,", i);
}
}
printf("\b \n");
return 0;
}

打印出10000之内的回文数:
121 1221
回文数,无论从前面向后,还是从后面向前都一样。(我为人人,人人为我)
分析:将一个数的个位十位百位取出来,然后,合成一个新的整数,然后与原来的数进行比较。看是否一致。
int main(void)
{

int i;
for(i = 0; i <=10000; ++i)
{	
	int m = 0;
	int x;
	x = i;

	while(x != 0)
	{
	   m = m * 10 +	x % 10;  // m = m * 10 + x % 10;  x /= 10;  核心语句。
	   x /= 10;
	}
	if(i == m)
	{
		printf("%d\n", i);
	
	}

}
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值