1.一对字符输入/输出函 数:getchar()和putchar()
getchar()函数不带任何参数,它从输入队列中返回下一个字符。
例如, 下面的语句读取下一个字符输入,并把该字符的值赋给变量
ch: ch = getchar();
该语句与下面的语句效果相同:
scanf("%c", &ch);
putchar()函数打印它的参数。例如,下面的语句把之前赋给ch的值作为 字符打印出来: putchar(ch);
该语句与下面的语句效果相同:
printf("%c", ch);
由于这些函数只处理字符,所以它们比更通用的scanf()和printf()函数更快、更简洁。而且,注意 getchar()和 putchar()不需要转换说明,因为它们只 处理字符。这两个函数通常定义在 stdio.h头文件中(而且,它们通常是预处 理宏,而不是真正的函数)
2.条件运算符:?:
带一个运算对象的运算符称为一元运算符
带两个运算 对象的运算符称为二元运算符
以此类推,带 3 个运算对象的运算符称为三 元运算符
条件运算符是C语言中唯一的三元运算符
下面的代码得到一个 数的绝对值:
x = (y < 0) ? -y : y;
在=和;之间的内容就是条件表达式,该语句的意思是“如果y小于0,那 么x = -y;否则,x = y”。
用if else可以这样表达:
if (y < 0) x = -y;
else x = y;
条件表达式的通用形式如下:
expression1 ? expression2 : expression3
如果expression1为真,整个条件表达式的值是expression2的值;
否则, 是expression3的值。
示例:
(5 > 3) ? 1 : 2 值为1
(3 > 5) ? 1 : 2 值为2
(a > b) ? a : b 如果a >b,则取较大的值
3. 循环辅助:continue和break
1.continue语句
3种循环都可以使用continue语句。
执行到该语句时,会跳过本次迭代的 剩余部分,并开始下一轮迭代。
如果continue语句在嵌套循环内,则只会影响包含该语句的内层循环。
2.break语句
程序执行到循环中的break语句时,会终止包含它的循环,并继续执行 下一阶段。
4.多重选择:switch和break
switch在圆括号中的测试表达式的值应该是一个整数值(包括char类 型)。case标签必须是整数类型(包括char类型)的常量或整型常量表达式 (即,表达式中只包含整型常量)。不能用变量作为case标签。switch的构造如下:
switch ( 整型表达式)
{
case 常量1:
语句 <--可选
case 常量2:
语句 <--可选
default :
语句 <--可选
}
顺带一提,break语句可用于循环和switch语句中,但是continue只能用 于循环中。尽管如此,如果switch语句在一个循环中,continue便可作为 switch语句的一部分。这种情况下,就像在其他循环中一样,continue让程序 跳出循环的剩余部分,包括switch语句的其他部分。
5.何时使用switch?何时使用if else?
何时使用switch?何时使用if else?你经常会别无选择。如果是根据浮 点类型的变量或表达式来选择,就无法使用 switch。如果根据变量在某范围 内决定程序流的去向,使用 switch 就很麻烦,这种情况用if就很方便: if (integer < 1000 && integer > 2) 使用switch要涵盖以上范围,需要为每个整数(3~999)设置case标 签。但是,如果使用switch,程序通常运行快一些,生成的代码少一些。
6.编程练习
1.编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。一行打印8个字符。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
#include <stdio.h>
#include <ctype.h>
int main(void ){
int count = 0;
char ch = 0 ;
int charactors = 0;
while ((ch=getchar()) != '#'){
printf("%d:%c ",ch,ch);
count++;
if(count%8==0){
printf("\n");
}
}
}
2.编写一个程序,读取整数直到用户输入 0。输入结束后,程序应报告用户输入的偶数(不包括 0)个数、这些偶数的平均值、输入的奇数个数及其奇数的平均值。
#include <stdio.h>
#include <ctype.h>
int main(void ){
int doublecount = 0;
int alldbcount = 0;
int singlecount = 0;
int allsigcount = 0;
int ch = 0 ;
int charactors = 0;
printf("Enter your numbers end of 0:");
while ((scanf("%d",&ch))&&ch!=0){
//主要是这一行代码的&&,如果要使用scanf函数只能用这种写法,其他方式尝试过,会无法终止循环
if(ch%2==0){
doublecount++;
alldbcount = alldbcount + ch;
}else{
singlecount++;
allsigcount =allsigcount+ch;
}
}
printf("count even:%d,svgeven: %.2f\n",doublecount,1.0*alldbcount/doublecount);
printf("count odd:%d,svg odd :%.2f",singlecount,1.0*allsigcount/singlecount);
}
3.编写程序读取输入,读到#停止,报告ei出现的次数
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch;
int count = 0, f = 0;
while((ch = getchar()) != '#')
{
switch(ch)
{
case 'e':
f = 1;
break;
case 'i':
if(f)
{
count++;
f = 0;
}
break;
default:
break;
}
}
printf("\n%d\n", count);
return 0;
}