一.介绍getchar()和putchar()
我们已知使用scanf()和printf()来以%c说明符来读写字符,现在接触专门为面向字符I/O而设计的一对C函数:getchar()和putchar()。
- getchar()函数没有参数,它返回来自输入设备的下一个字符。
ch=getchar(); //相当于 scanf("%c",&ch);
- putchar()函数打印它的参数。
putchar(ch); //相当于printf("%c",ch);
例如:
/*改变输入,只保留其中的空格*/ char ch; ch=getchar(); while(ch!=' ') { if(ch==' ') putchar(ch); else putchar(ch+1); ch=getchar(); } putchar(ch);
如果只改变字母或者数字或者小写字母等等,可以使用ctype.h头文件,包含了这些函数原型。这些函数接受一个字符作为参数,如果该字符属于某特定的种类则返回非零值(真),否则返回零(0)。例如,isalpha()接受一个字母,返回真,islower()接受一个小写字母,返回真......
该头文件含有字符映射函数:tolower()若参数是大写字母,返回相应的小写字母;否则,返回原参数。toupper()反之。这种函数不改变原参数,只返回改变后的值。
二.给定一个整数,显示所有能整除它的约数;如果没有约数,则报告该数是个素数。
首先进行总体设计,使用一个循环来让程序检验一个新数时不用每次重新运行程序。比如使用scanf()返回值达到这一目的
其次,需要计划来找到约数,如下:
for(div=2;div<num;div++)
if(num%div==0)
printf("%d is divisible by %d
",num,div);
循环检查2到num之间的所有数。但是这种方法浪费计算机的时间。我们知道约数必定是成对的,例如144,它的约数有:2和47,3和48,4和36,6和24,8和18,9和16,12和12。你会发现,在得到12后就可以停止,因为后面必与前面的重复。这样节省了大量的循环周期。
归纳以后,可以确定必须测定的数达到num的平方根即可,于是如下:
for(div=2;(div*div)<=num;div++)
if(num%div==0)
printf("%d is divisible by %d and %d
",num,div,num/div);
为了避免重复输出两个12,可用嵌套循环使其只打印一个:
for(div=2;(div*div)<=num;div++)
{
if(num%div==0)
{
if(div*div!=num)
printf("%d is divisible by %d and %d
",num,div,num/div);
else
printf("%d is divisible by %d
",num,div);
}
}
最后,怎样知道一个数是素数呢?如果是,程序进不了if语句。可以在循环外设置一个变量为某一值,例如1,在if语句将这个变量重设为0.循环完成后,可以检查该变量是否仍为1.如果是,则从没进过if语句,该数是素数。这样的变量通常称为标志。可以使用_Bool型变量极佳符合这种需求。
最终结果为:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
unsigned long num;
unsigned long div;
bool isPrime;
printf("Please enter a number: ");
while(scanf("%lu",&num)==1)
{
for(div=2,isPrime=true;(div*div)<=num;div++)
{
if(num%div==0)
{
if(div*div!=num)
printf("%d is divisible by %d and %d
",num,div,num/div);
else
printf("%d is divisible by %d
",num,div);
isPrime=false;
}
}
if(isPrime)
printf("%lu is prime.
",num);
printf("Please enter a number: ");
}
printf("Bye!
");
return 0;
}
三.条件运算符?:
例如:得到一个数的绝对值
x = (y < 0) ? -y : y
“如果y小于0,那么x=-y;否则,x=y”
expression1 ? expression2 : expression3
如果expression1为真,整个条件表达式的值和expression2的值相同,否则和expression3的值相同。
四.break和continue
1.break
导致程序终止包含它的循环,并进行程序的下一个阶段。如果位于嵌套循环里,它只影响包含它的最里层的循环。
int p,q;
scanf("%d",&p);
while(p>0)
{
printf("%d
",p);
scanf("%d",&q);
while(q>0)
{
printf("%d
",p*q);
if(q>100)
break; //跳出里层循环
scanf("%d",&q);
}
if(q>100)
break; //跳出外层循环
scanf("%d",&p);
}
2.continue
导致程序跳过包含它的循环的剩余部分,开始下一循环周期。若在嵌套循环中,也只作用于里层循环。
五.一个统计字数的程序
//统计字符、单词和行
#include <stdio.h>
#include <ctype.h> //为isspace()函数提供原型
#include <stdbool.h> //为bool、true和false提供定义
#define STOP '|'
int main(void)
{
char c; //读入字符
char prev; //前一个读入字符
long n_chars=0L; //字符数
int n_lines=0; //行数
int n_words=0; //单词数
int p_lines=0; //不完整的行
bool inword=false; //如果c在一个单词中,则inword等于true
printf("Enter text:
");
prev='
'; //用于识别完整的行
while((c=getchar())!=STOP)
{
n_chars++; //统计字符
if(c=='
')
n_lines++; //统计行
if(!isspace(c)&&!inword)
{
inword=true; //开始一个新单词
n_words++; //统计单词
}
if(isspace(c)&&inword)
inword=false; //到达单词的尾部
prev=c; //保存字符值
}
if(prev!='
')
p_lines=1;
printf("characters=%ld,words=%d,lines=%d,",n_chars,n_words,n_lines);
printf("partial lines=%d
",p_lines);
return 0;
}
ctype.h系列字符函数为创建基于分类字符的判断表达式提供了便利的工具。