4.1 空语句
空语句:本身只包含一个分号,适用的场合就是语法要求出现一条完整的语句,但并不需要它执行任何任务。
4.2 表达式语句
C语言中并没有专门的“赋值语句”,而是通过表达式语句进行的。
x = y + 3;
ch = getchar();
表达式语句单独存在也是合法的:
y + 3;
x++;
4.3 代码块
代码块就是位于一对花括号之内的可选的声明和语句列表,可以用于要求出现语句的地方,它允许你在语法要求只出现一条语句的地方使用多条语句(for循环内)。代码块还允许你把数据的声明非常靠近它所使用的地方。例如,下面的代码是非法的:
#include <stdio.h>
int main(void)
{
int a = 5;
printf("hello world\n");
int b = 7;
return 0;
}
而下面的代码则是合法的:
#include <stdio.h>
int main(void)
{
int a = 5;
printf("hello world\n");
{
int b = 7;
}
return 0;
}
4.5 while语句
4.5.1 break和continue语句
在while循环中可以使用break语句,用于永久终止循环。在执行break语句后,执行流下一条执行的语句就是循环正常结束后应该执行的那条语句。
在while循环中也可以使用continue语句,它用于永久终止当前的那次循环。在执行continue语句之后,执行流接下来就是重新测试表达式的值,决定是否继续执行循环。
这两条语句的任何一条如果出现于嵌套的循环内部,它只对最内层的循环起作用,无法影响到最外层循环的执行。
4.9 goto语句
原则:坚决不用goto语句
在多层嵌套的循环中,goto语句起到一定的作用:
while (){
while (){
while (){
if (){
goto quit;
}
}
}
}
quit: ;
有两个方法来避免这种goto语句:
1. 使用状态标志,但麻烦的是在每个循环中状态标志都需要进行测试:
enum {EXIT, OK} status;
status = OK;
while (status == OK){
while (status == OK){
while (status == OK){
if (){
status = EXIT;
break;
}
}
}
}
2. 把所有的循环都放到一个单独的函数里,当灾难降临到最内层的循环时,你可以使用return语句离开这个函数。
习题:
1.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
float number;
float preNum = 1.0;
float curNum = 1.0;
scanf("%f", &number);
printf("\nthe result is:\n");
do{
curNum = (preNum + number / preNum) / 2.0;
}while ((fabs(curNum - preNum) > 0.00001) && (preNum = curNum));
printf("%.4f", curNum);
return 0;
}
备注:
1). 要用fabs而不是用abs对浮点型的数据进行求绝对值
2).必须让表达式执行一次,所以用到do...while循环。
2. 求质数的过程,不用非常高深的技术,这属于算法题。这里就简单的编写一下如何求质数即可。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define UPPER 100
#define LOWER 1
int main(void)
{
int i = 0;
int j = 0;
for ( i = LOWER; i < UPPER; i++ ){
for ( j = i - 1; j > LOWER; j-- ){
if (i % j == 0){
break;
}
}
if ( j == LOWER ){
printf("%d ", i);
}
}
return 0;
}
程序输出:
3.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int isAng( float x, float y, float z ){
if ( ( x + y < z ) || ( x + z < y ) || ( y + z < x ) ){
return 0;
}
return 1;
}
int main(void)
{
float x;
float y;
float z;
printf("please enter three number:");
scanf("%f%f%f", &x, &y, &z);
if ( isAng( x, y, z ) ){
if ( (x == y) || ( x == z ) || ( y == z ) ){
printf("等腰三角形\n");
if ( ( x == y ) && ( y == z ) ){
printf("等边三角形\n");
}
}
else{
printf("普通三角形");
}
}
return 0;
}
程序输出:
4. 以下代码是错误的,因为字符串常量无法被更改,先粘贴出来,做个对比:
#include <stdio.h>
#include <string.h>
void copy_n( char dst[], char src[], int n ){
int len = strlen(src);
int i = 0;
if (n <= len){
for ( i = 0; i < n; i++ ){
dst[i] = src[i];
}
dst[i] = '\0';
}
else{
for ( i = 0; i < len; i++ ){
dst[i] = src[i];
}
while ( i < n ){
dst[i] = '\0';
i++;
}
}
}
int main(void)
{
char *dst = "hello";
char *src = "python";
copy_n( dst, src, 6 );
printf("%s\n", dst);
copy_n( dst, src, 4 );
printf("%s\n", dst);
return 0;
}
因为字符串常量无法改变,所以只能用字符数组:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 128
void copy_n(char dst[], char src[], int n){
int len = strlen(src);
if ( n <= len ){
while ( n-- ){
*dst++ = *src++;
}
*dst = '\0';
}
else{
while ( *dst++ = *src++ ){
;
}
while ( len <= n ){
*dst++ = '\0';
}
}
}
int main(void)
{
char dst[MAXLINE];
char src[MAXLINE];
gets(src);
copy_n(dst, src, 12);
printf("%s", dst);
return 0;
}
程序输入输出:
5. 没从文件进行读取,但原理一样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 128
int main(void)
{
char preLine[MAXLINE];
char curLine[MAXLINE];
int isSame = 0;
while (gets(preLine) != NULL){
if (!strcmp(preLine, curLine)){
isSame = 1;
}
else{
if (isSame){
printf("the same line:%s\n", curLine);
isSame = 0;
}
strcpy(curLine, preLine);
}
}
return 0;
}
程序输出:
6.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 128
int substr(char dst[], char src[], int start, int len){
int arrLen = strlen(src);
int i = 0;
if (start >= arrLen){
return 0;
}
if (len + start >= arrLen){
len = arrLen - start;
}
for ( i = 0; i < len; i++ ){
dst[i] = src[start + i];
}
dst[i] = '\0';
return i;
}
int main(void)
{
char dst[MAXLINE];
char src[MAXLINE] = {'a', 'b', 'c', 'd', 'e', '\0'};
int len = 0;
len = substr( dst, src, 1 ,7 );
printf("%s\n", dst);
printf("%d", len);
return 0;
}
程序输出:
7.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 128
void deblank( char string[] ){
char temp[MAXLINE];
int len = strlen(string);
int isSpace = 0;
int i = 0;
int j = 0;
for ( i = 0; i < len; i++ ){
if ( ' ' == string[i] ){
isSpace = 1;
continue;
}
else{
if ( 1 == isSpace ){
isSpace = 0;
temp[j++] = ' ';
}
}
temp[j++] = string[i];
}
temp[j] = '\0';
strcpy(string, temp);
}
int main(void)
{
char string[MAXLINE];
while (gets(string) != NULL){
deblank(string);
printf("%s\n", string);
}
return 0;
}
程序输入输出: