- 'A'=65,'a'=97;
- 转义字符:'\''表示一个单引号,'\\'表示一个反斜杠,'\ddd'1到3位八进制,'\xhh'1到2位16进制。
#include<stdio.h>
int main()
{
char ch;
//黑窗口输入字符,函数返回值就是该字符,回车符结束输入
ch=getchar();
ch=ch+32;
putchar(ch);
putchar('\n');
}
输出:
B
b
#include<stdio.h>
int mian()
{
const double pi=3.14159;
double r,circle,area;
scanf("%lf",&r);
circle=2*pi*r;
area=pi*r*r;
printf("%f,%f\n",circle,area);
printf("%7.2f,%7.2f\n",circle,area);
/*
域宽为7位,正数向右对齐,小数位为2位,小数点也占一个字符位.
*/
}
输出:
33.300854,88.247263
? ? 33.30,? ? 88.25
在用函数scanf()输入数值型数据时,以下几种情况认为输入结束:
- 遇到空格符、回车符、制表符
- 达到输入域宽
- 遇到非法字符输入
scanf("%d %d",&a,&b); 12 34
scanf("%d,%d",&a,&b); 12,34
scanf("a=%d,b=%d",&a,&b); a=12,b=34
scanf("%2d%2d",&a,&b); 1234
scanf("%d*c%d",&a,&b);//以任意字符作为分隔符:12 34,12-34,12 34
scanf("%2d%*2d%2d",&a,&b)
输入:123456
输出: a=12,b=56
从键盘输入一个整数加法算式:
#include<stdio.h>
int main()
{
int a,b;
char c;
scanf("%d%c%d",&a,&c,&b);
printf("%d%c%d=%d\n",a,c,b,a+b);
}
输出: 12 + 3????????????????//数字与加号之间有空格,所以空格赋值给了c 12 3129????????//在使用%c读入字符时,空格、转义字符都会当作有效字符读入
解决办法就是输入时不需要空格。
scanf()函数的%c格式符存在问题的解决方法:
#include<stdio.h>
int main()
{
int a;
char b;
float c;
scanf("%d",&a);
printf("%d\n",a);
getchar();//将存入缓冲区的回车符(转义字符)读入,避免在后面作为有效字符读入
scanf("%c",&b);
//scanf(" &c",&b);在%c前面加一个空格,将存入缓冲区的回车符读入
printf("%c\n",b);
scanf("%f",&c);
printf("%f\n",c);
}
//单分支,求两个整数的最大值
if(a>b)
max=a;
if(a<=b)
max=b;
//双分支
if(a>b)
max=a;
else
max=b;
条件运算符和条件表达式 max=a>b?a:b;
多分支求二元一次方程的根:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define ESP 1e-6
/*
浮点数并非真正意义上的实数,只是某种范围的近似,因此也只能用某种近似的方法将实数与0进行比较。
*/
int main()
{
float a,b,c,disc,p,q;
scanf("%f,%f,%f",&a,&b,&c);
if(fabs(a)<=1e-6)
{
exit(0);//终止程序的执行,返回操作系统。
}
disc=b*b-4*a*c;
p=-b/(2*a);
q=sqrt(fabs(disc))/(2*a);
//实数和0比较,只能用接近0的实数来比较,不能用整数0
if(fabs(disc)<=ESP)
{
printf("x1=x2=%.2f\n",p);
}
else
{
if(disc>ESP)
{
printf("x1=%.2f,x2=%.2f",p+q,p-q);
}
else
{
printf("x1=%.2f+%.2fi,x2=%.2f-%.2fi\n".p,q,p,q);
}
}
}
switch分支结构进行加减乘除:
#include<stdio.h>
int main()
{
int date1,date2;
char op;
scanf("%d%c%d",&date1,&date2,&op);
switch(op)
{
case '+':
printf("%d\n",date1+date2);
break;
case '*':
printf("%d\n",date1*date2);
break;
case '-':
printf("%d\n".date1-date2);
break;
case '/:
if(date2==0)
{
printf("error!\n");
}
else
{
printf("%d\n",date1/date2);
}
break;
default:
printf("error!\n");
}
}
&&和||短路特性 a>1&&b++>2,如果a>1为假,就不执行后面的部分了。
5.2扩充内容
白盒测试:对每条语句,每个分支进行测试,用于测试的早期。 黑盒测试:对每个功能进行测试,不一定覆盖每条语句,用于测试的晚期。
三角形的判断:
#include<stdio.h>
#include<math.h>
#define ESP 1e-1
int main()
{
float a,b,c;
int flag=1;
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
if(a-b<=ESP&&a-c<=ESP&&b-c<=ESP)
{
printf("等边");//一定先判断等边,然后再判读等腰。
flag=0;
}
else
{
if(a-b<=ESP||b-c<=ESP||a-c<=ESP)
{
printf("等腰");
flag=0;
}
}
if(fabs((a*a-b*b-c*c)<=ESP)||
fabs((a*a-b*b-c*c)<=ESP)||
fabs((a*a-b*b-c*c)<=ESP))
{
printf("直角");
flag=0;
}
if(flag==1)
{
printf("一般");
}
printf("三角形!\n");
}
else
{
printf("不是三角形!\n");
}
}
将百分制成绩改成5分制成绩:
#include<stdio.h>
int main()
{
int score,mark;
scanf("%d",&score);
mark=score>100||score<0?-1:score/10;//注意临界值的判断
switch(mark)
{
case 10:
case 9:
printf("%d->A\n",score);
break;
case 8:
printf("%d->B\n",score);
break;
case 7:
printf("%d->C\n",score);
break;
case 6:
printf("%d->D\n",score);
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:
printf("%d->E\n",score);
break;
default:
printf("error!");
}
}
计算输出两个整数的最大值:
#include<stdio.h>
int main()
{
int a,b,max,ret;
# 返回的是输入参数赋值成功的个数
ret=scanf("%d%d",&a,&b);
if(ret!=2)
{
printf("error!");
# 清空输入缓冲区
fflush(stdin);
}
else
{
max=a>b?a:b;
printf("max=%d\n",&max);
}
}
5.3位运算符
- 按位与:&,只有11才为1 。
- 按位或:|,只有00才为0 。
- 按位异或:^,只有01才为1 。
- 按位取反:~,0变为1 。
- 左移位:x<<n,左移n位。00001111左移3位->01111000 。
- 右移位:x>>n,右移n位。 有符号位,左边补上符号位的数,无符号位左边补0,00001111右移3位->0000001,11110001右移三位->11111110。
5.4习题
任意输入三条边,看是否构成三角形,并计算它的面积:
#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,s,area;
s=(a+b+c)/2;
if(a+b>c&&a+c>b&&b+c>a)
{
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%f\n",area);
}
else
{
printf("不能构成三角形\n");
}
}
输入某年某月,确定该月的天数:
#include<stdio.h>
#include<stdlib>
int main()
{
int year,month,flag=0;
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d%d",&year,&month);
if(month<1&&month>12)
{
printf("输入错误\n");
exit(0);
}
else
{
if(year%400==0||year%4==0&&year%100!=0)
{
flag=1;//为闰年
}
if(flag&&month==2)
{
printf("days=29\n");
}
else
{
printf("days=%d\n",days[month-1]);
}
}
}
|