c专接本第二章
print输出
c格式符
printf("%c",xxx);
一个整数只要它的值在0-255范围里,也可以用字符形式输出,在输出前将整数转换成相应的ASCII字符;反之一个数据也可以用整数形式输出
s格式符——用来输出一个字符串
printf("%s",xxx);
- %s:按原长度输出字符串 也可以将char数组转化为字符串输出
- %ms: 输出的字符串占m列,如果字符串长度大于m突破限制,小于m左边补空格“ xxxx”
- %-ms: 如果串长小于m,向右补空格 “xxxx ”
- %m.ns:输出占m列,但只取字符串中左端n个字符。输出在列的右侧,左补空格。如果n>m则自动取值,保证字符正常输出
-
%-m.ns:m,n同上n在左侧输出,空格补在右面
数组名是地址值常量,指针是地址值变量
//给数组赋值
int a[10];
for(i=0;i<10;i++) scanf('%d:,& a[i]);
f格式符——以小数形式输出
e格式——以指数形式输出
用作于scanf输入时候可以接收小数
g格式——用来输出实数
以数值大小自动选择f格式或者e格式,自动选择宽度较小的格式,不输出无意义零(若果f格式输出是保留六位小数,可能会有无意义0,而实数选择f格式后后面的无意义零会被变成空格)
例:
- f格式:“32.133000”
- g格式:“32.133 ”
scanf输入
输入规范
scanf越简单越好scanf(%d%c%d),输入时就不能有空格,如:10c20,并且较为复杂计算机容易出错,故不推荐这种复杂的输入形式
注意:
- 不能加空格是因为中间是字符数据,空格也算是一个变量,%d%d这用形式要以空格和回车分割
- %3d%3d这样格式就不需要空格分隔了,但也可以空格分隔
输入说明
- %后的“*”附加说明符,用来表示跳过它对应的数据
- 例 scanf("%2d,%*3d,%2d",&a,&b);
- 输入 12,456,67
- 结果 a=12 b=67
- 输入数据不能规定精度
- scanf("%7.2f",&a);
- 结果 0.000000
- 字符数据中间不能空格划分,空格也算是一个字符
各种程序结构
顺序结构
概念:每条语句必须执行切只能执行一次,没有执行不到或执行多次的语句
#in inclued<maht.h>中含有sqrt(int a),将数值a开方
例题1:知道三角形三条边求面积
#include <math.h>
#include <stdio.h>
int main()
{
float a,b,c,s,area;
scanf("%f%f%f",&a,&b,&c);//获取三条边
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));//调用开方
printf("%f",area);
}
例题2:求ax*x+bx+c=0的根,a,b,c由键盘输入,设b*b-4ac>0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKzGboBA-1617259390637)(en-resource://database/6269:1)]
公式如上:
#include <math.h>
#include <stdio.h>
int main()
{
float a,b,c,disc,x1,x2,p,q;
scanf("%f%f%f",&a,&b,&c);
disc=b*b-4*a*c;//判别式
p=-b/(2*a);//公式一部分
q=sqrt(disc)/(2*a); //公式一部分
x1=p+q;x2=p-q; //求解
printf("x1=%f,x2=%f",x1,x2);
}
选择结构程序设计
内容:
- 逻辑运算符与逻辑表达式
- if语句的使用
- 条件运算符与switch语句的运用
1. 关系运算符
运算符:> < = >= <= != ==
比较大小运算符优先级高于判断是否相等运算符
结合性:自右向左
2. 逻辑运算符
运算符:
- ! 非
- && 与
- || 或
逻辑运算符要大于赋值运算符
规则:
- Expl&&exp2:先算expl,若值为零(0就是false)停止往后运算
- Expl||exp2:先算expl,若其值为1(1就是true),停止往后运算
用处:可以减少一次判断,提高运行效率
3. 常用要求表达式
-
ch是小写英文字母
- ch>=‘a’&&ch<=‘z’
-
ch是大写英文字母
- ch>=‘A’&&ch<=‘Z’
-
ch是数字符
- ch>=‘0’&&ch<=‘9’
- Year是闰年,闰年是能被4整除不能被100整除,或者能被400整除的数字(考试不会解释闰年是什么,这个一定要记住!!!)
4. if(表达式)语句
解释:表达式为真,那么执行语句2
if语句的变种:
- if (表达式) 语句1; else 语句2;
- if( 表达式) 语句1 ;else if(表达式) 语句2.;。。。
注意:语句最好括上大括号
if语句的嵌套:
if(条件一){
if(条件二){
y
}
}}
else配对if原则:一个else应与其之前距离最近的且没有与其他else配置
对的if配对
三目运算符:表达式1(关系运算符)表达式2 ? 成立时执行:不成立执行;
三目运算符可以简化if语句的开发
例子:
if(a>b){输出a};
else {输出b}
//上面等效于下面
a>b?输出a:输出b;
下面是if语句的练习
例题1 :比较三个数的大小
#include <math.h>
#include <stdio.h>
int max(int a,int b,int c); //创建max函数
int main()
{
int max1=max(1,6,9);
printf("%d",max1);
}
//设置max函数的方法
int max(int a,int b,int c){
a=a>b?a:b;
a=a>c?a:c;
return a;
}
例题2 :把输入字符中的小写字符转化成大写并输出
#include <stdio.h>
int main()
{
char ch;
scanf("%c",&ch);
ch=(ch>'a'&&ch<'z')?ch-32:ch;
printf("%c",ch);
}
5. switch语句
使用形式:
switch(变量)
{
case 常量表达式1:语句序列1;//判断变量是否满足表达式1,满足则继续执行
case 常量表达式2:语句序列2 ;break;//判断变量是否满足表达式2,满足则跳出循环
case 常量表达式3:语句序列3;break;//判断变量是否满足表达式3,满足则跳出循环
case 常量表达式4:语句序列4;break;//判断变量是否满足表达式4,满足则跳出循环
//可以写无限个
default: 语句序列n+1//都不要满足执行default语句,这里执行完后switch语句结束,不需要break;
}
注意有无break的区别
例题阶段
例题1:小明要运送w吨货物,货物公司现有如下优惠,
- 250<=w<=500 %2折扣
- 500<=w<=1000 %5折扣
- 1000<=w<=2000 %8折扣
- 2000<=w<=3000 %10折扣
- 3000<=w %15折扣
问基本运维为p,距离为s,折扣为d,总运费为f=p*w*s*(1-d),运费为多少钱
#include <stdio.h>
int main()
{
int w,s1;
float p,s,d,f;
scanf("%f%d%f",&p,&w,&s);
s1=w/250;
switch(s1)
{
case 1 : d=0.02;break;
case 2 : d=0.05;break;
case 3 : break;
case 4 : d=0.08;break;
case 5 : break;
case 6 : break;
case 7 : break;
case 8 : break;
case 9 : d=0.1;break;
case 10 : break;
case 11 : break;
case 12 : d= 0.15;break;
default : d=0.15;
}
f=p*w*s*(100-d*100)/100;
printf("需要花费%f",f);
}
问题例题:
- 若有定义:inta=18,b=5,c;,执行语句c=a/b+0.4;后,c的值为?
- 解: a和b都是整型,所以a/b=3,会把0.6省略掉,3+0.4=3.4;
- 若变量a是int 类型,并执行了语句:a=‘B’ +1.6,那么a的值为多少,是什么类型
- 解:int 类型占用4个字节,而float类型也是占用4个字节,不不会发生类型转换,结果是‘B’的ASCII值加上1
- 已知:int a=4;下列表达式的值,哪一个等于0?
- a%6 (4)
- a/4 (1)
- a?a+5:a-5 (这里涉及到一个知识点,非零值为真)(9)
- !a (非零量取反结果为0)
- 设 m,n,a,b,c,d均为2,(m=a==b)||(n=c==d),m,n的值为
- a==b成立,故为真,m值为1
- 左侧成立,右边不计算
- n保持原样,值为2
上一篇: 【汇编语言】筛选非负数+冒泡排序
下一篇: 寻找三个数的和为0