C语言程序设计第三、四天/操作符\输入输出\强制类型转换 算术双目操作运算符、-、*、/、%、-、*、/、%均为双目操作运算符即14、ab、num1num2都有两个操作数所以叫双目操作符注当除数与被除数都是整型时结果也为整型若想要得到浮点型的结果两个运算数必须至少有一个为浮点型并且使用%f#include stdio.h int main(){ int a5; printf(%d,a/2); return 0; } //结果为2而不是2.5 #include stdio.h int main(){ int a5; printf(%f,a/2.0); return 0; } //结果为2.500000%为取余运算符即返回两个整数相除的余值。只能用于整型之间的运算无法在浮点型中使用#include stdio.h int main(){ printf(%d\n, 5 % 2); //5除2余1 结果得1 printf(%d\n, 10 % 4);//10除4余2 结果得2 return 0; }赋值操作运算符 创建变量时给一个值称初始化创建好后再给一个值称赋值#include stdid.h int main(){ int num1 199 //初始化 num1 299 //赋值 return 0 }赋值操作符可以随时给变量赋值复合赋值符对一个变量进行自增或自减#include stdio.h int main(){ int sum 3; int _sum1 3; int sub 4; int _sub1 4; int mul 5; int _mul1 5; int div 6; int _div1 6; sum sum3; _sum1 3; sub sub-4; _sub1 - 4; mul mul * 5; _mul1 * 5; div div / 6; _div1 / 6; return 0; } 输出 6 6 0 0 25 25 1 1a a3也可以表示为a 3同理加减乘除都可以还有、、、|、^后面学到单目运算符自增、--自减、正号、-负号自增自减使变量值加1或减1。#include stdio.h int main(){ int sum 3; int _sum1 3; int sub 3; int _sub1 3; int j , f; j sum; //sum的值先赋给j再进行自增 printf(%d\n,j); j _sum1; //sum的值先自增再进行赋给j printf(%d\n,j); f sub--; //sub的值先赋给f再进行自减 printf(%d\n,f); f--_sub1; //sub的值先自减再进行赋给f printf(%d\n,f); return 0; } 输出 3 4 3 2强制类型转换#include stdio.h int main(){ int a; a (int)3.14; //浮点型强制转换整型 printf(%d\n,a); float b; b (float)2; //整型强制转换浮点型 printf(%f,b); return 0; } 输出 3 2.000000强制类型转换不到万不得已不用使用。输入输出printf、scanfprintfprintf()的作用是将参数文本输出到屏幕。它名字里面的f代表format(格式化)表示可以定制输出文本的格式。使用printf()函数时必须添加头文件stdio.h。#include stdio.h int main(){ printf(hellow %s,world); return 0; }在行尾自动添加换行符运行结束后光标就停留在输出结束的地方不会自动换行。为了让光标移到下一行的开头可以在输出文本的结尾添加一个换行符\n。占位符printf()可以在输出文本中指定占位符。也就是这个位置可以用其他值代入。printf(hellow %s,world); 中的%s就是占位符其中world可以改为任何字符串%a:十六进制浮点数字母输出为小写。%A:十六进制浮点数字母输出为大写。%c:字符。//char%d:十进制整数(有符号的10进制整数)。//int%e:使用科学计数法的浮点数指数部分的e为小写。%E:使用科学计数法的浮点数指数部分的E为大写。%i:整数基本等同于%d。%f:小数(包含float类型和double类型)。//float %f double -%lf%g:6个有效数字的浮点数。整数部分一旦超过6位就会自动转为科学计数法指数部分的e为小写。%G:等同于%g唯一的区别是指数部分的E为大写。%hd:十进制 short int类型。%ho:八进制 short int类型。%hx:十六进制short int类型。%hu:unsigned short int 类型.%ld:十进制 long int 类型。%1o:八进制long int类型。%1x:十六进制long int类型。%lu:unsigned long int 类型.%11ld:十进制 long long int 类型。%1lo:八进制long long int类型。也可在同一条语句中使用多个占位符#include stdio.h int main(){ printf(%s say : it%d oclock,zhang san,4); return 0; } //运行结果 //zhang san say : it4 oclockprintf()参数与占位符是一一对应关系如果有n个占位符printf()的参数就应该有n1个。如果参数个数少于对应的占位符printf()可能会输出内存中的任意值。像这样限定宽度#include stdio.h int main(){ printf(%d\n,12345); printf(%5d\n,123); printf(%-5d\n,123); printf(%-4s,abc); printf(%s,def); return 0; } /*输出 12345 123 123 abc def*/在例中%5d表示这个占位符至少有5位如果不够5位对应的值前面会添加空格。可以发现当不够时输出内容是右对齐在%后面插入-就变成了左对齐也就是“%-5d”小数限定宽度#include stdio.h int main(){ printf(%10f,1.5); return 0; } /*输出 1.500000 */%f在打印小数时默认小数点后打印六位加上小数点和整数部分为八位设定为10位所以输出结果开头空两位。小数限定位数如果希望小数点后只保留一位占位符可以写成%.1f也可以与其他功能复合使用。#include stdio.h int main(){ printf(%f\n,1.5); printf(%.1f\n,1.5); printf(%.1f\n,-1.5); printf(%8.2f\n,3.1415); return 0; } /* 1.500000 1.5 -1.5 3.14 */用*替代最小宽度和最小位数这两个限定值都可以用*替代。#include stdio.h int main(){ printf(%*.*f\n,10,4,3.1415); return 0; } /*输出 3.1415 */%*.*f中的两个*通过printf中的参数10、4传入解读为限定宽度10、限定位数4打印带正负号的浮点型3.1415。输出部分字符串%s为默认全部输出字符串可以用%.[m]s指定输出长度m为数字表所输出的长度#include stdio.h int main(){ printf(%.5s, helloworld); return 0; } /*输出 hello */总是显示正负号默认情况下printf()不显示号(正)只显示-号(负)。改为总是显示可在占位符%后加上#include stdio.h int main(){ printf(%f\n,1.5); printf(%f\n,1.5); printf(%f\n,-1.5); printf(%d\n,1); printf(%d\n,1); printf(%d\n,-1); return 0; } /*输出 1.500000 1.500000 -1.500000 1 1 -1 */scanf写法#include stdio.h int main(){ int i; printf(输入:); scanf(%d,i); printf(是:%d,i); return 0; }如果我们的代码中使用了scanf s那么你的代码在其他的编译器上是编译不通过的也就失去了跨平台一次输入多个类型#include stdio.h int main(){ int i0; int j0; float x 0; float y 0; scanf(%d%d%f%f,i, j, x, y); printf(i %d\n,i); printf(j %d\n, j); printf(x%f\n,x); printf(y %f\n, y); return 0; } /* 输入 1 2 3 4 输出 i 1 j 2 x3.000000 y 4.000000 */scanf在处理占位符时会自动过滤空白字符包括空格、制表符、换行符等所以在用户输入的数据之间有一个或多个空格等上面提到的不影响解读。scanf原理scanf ()处理用户输入的原理是用户的输入先放入缓存中等到按下回车键后按照占位符对缓存进行解读。解读用户输入时会从上一次解读遗留的第一个字符开始直到读完缓存或者遇到第一个不符合条件的字符为止。scanf返回值scanf返回的值是成功读取变量的个数如果没有读取到任何变量或匹配失效则返回0如果在成功读取任何数据之前发生了读取错误或者读取到文件结尾则返回常量EOF-1#include stdio.h int main(){ int a,b; float f ; int r scanf(%d %d %f,a , b , f); printf(a %d , b %d , f %f\n,a,b,f); printf(r %d\n,r); return 0; } /*输入2、3、5后scanf返回值为3*/ /*输入1、去、2后scanf返回值为1因为在读取第二个变量时就已经失败*/ /*输入ctrlz快捷键后scanf返回值为-1*/由此可写一个循环加法计算器当按下ctrlz时退出程序#include stdio.h int main(){ int a0,b0; //初始化 while (scanf(%d,%d,a,b) !EOF ) //循环当scanf返回值不等于-1时退出 { int c a b; printf(%d,c); } //ctrlz后返回值为-1 不等于2退出 //读取时第一个或第二个数字不属于整型退出 return 0; }scanf的占位符scanfprintffloat %fdouble %lflong double %Lffloat %fdouble %lf、%flong double %Lf可以看到scanf与printf的占位符基本一致double类型时有明显区别。%c字符//上面所有占位符之中除了%c以外都会自动忽略起首的空白字符。%c不忽略空白字符总是返回当前第一个字符无论该字符是否为空格%d整型%f float浮点型%lf double浮点型%Lflong double 浮点型%s字符串%[ ]在方括号中指定一组匹配的字符如%[0-9]遇到不在集合中的字符时匹配将会停止%[ ]是scanf的字符集匹配占位符用于读取指定字符集中的字符并不能用int、float、double之类的占位符。基本用法%[characters] -方括号内列出允许读取的字符 -只会读取给定的字符遇到不在集合中的字符时停止。char strl[100];// 读取只包含字母的字符串 scanf(%[a-zA-Z],str1); // 只接受a-z和A-Z char str2[100];//读取数字字符串 scanf(%[e-9], str2);// 只接受数字 scanf(%[a-zA-Z0-9], str2);//读取字母和数字 否定形式 使用^否定排除某些字符://读取除换行符外的所有字符 scanf(%[^\n], str);//读取整行(不含换行符) 常见用法 scanf(%s, str);// 读取到第一个空格为止的单词例如下面的代码中str1并没有使用是因为str1是数组数组本来就是地址所以不需要再用取地址#include stdio.h int main(){ char str1[100]; scanf(%[a-zA-Z],str1); //只接受a-z和A-Z printf(%s,str1); return 0; } 输入 qwer1234qwer 输出 qwer /**************************************************/ #include stdio.h int main(){ char str1[100]; scanf(%[0-9],str1); //只接受0-9的字符并不是int整型 printf(%s,str1); return 0; } 输入 1234twer 输出 1234注在上面所有占位符之中除了%以外都会自动忽略起首的空白字符。%c不忽略空白字符总是返回当前第一个字符无论该字符是否为空格。如要强制跳过字符前的空白字符可以写成scanf( %c,ch);在%c前面加上一个空格表示跳过零个或多个空白字符。而%s它不能简单地等于字符串。它的规则是从当前第一个非空白字符开始读起直到遇到空白字符(即空格、换行符、制表符等)为止。因为%s不会包含空白字符所以无法用来读取多个单词除非多个%s一起使用。这也意味着scanf()不适合读取可能包含空格的字符串比如书名或歌曲名。另外scanf()遇到%s占位符会在字符串变量末尾存储一个空字符\0。#include stdio.h int main(){ char str1[100]; scanf(%[0-9],str1); //只接受0-9的字符并不是int整型 printf(%s,str1); return 0; } 输入 12 34 输出 12当使用scanf将字符串读入数组时scanf不会检测字符串是否超过了数组长度为了防止这种情况使用%s占位符时应指定读入字符的最长长度写作%[m]s[m]代表读取字符串的最大长度后面的字符将不读取#include stdio.h int main(){ char arr[6]; scanf(%s,arr); printf(%s,arr); return 0; } #include stdio.h int main(){ char arr[6]; scanf(%6s,arr); printf(%s,arr); return 0; }数组长度只有6时我输入了很多字符虽然可以打印但是编译器已经报错。使用下半部分代码时可以正常打印且不会报错。赋值忽略符有时用户输入的格式可能不符合预定代码#include stdio.h int main(){ int year 0,month 0,day 0; scanf(%d-%d-%d,year,month,day); printf(%d %d %d,year,month,day); }使用不同格式进行输入后只要在任何占位符的后面加上*该占位符就不会返回值解析后将被丢弃。#include stdio.h int main(){ int year 0,month 0,day 0; scanf(%d %*c %d %*c %d,year,month,day); printf(%d %d %d,year,month,day); }