复习题

1.写出执行完下列各行后quack的值是多少,后5行(第6行开始)中使用的是第1行quack的值。

答案见注释

  1. int quack = 2;//2
  2. quack += 5;//7
  3. quack *= 10;//70
  4. quack -= 6;//64
  5. quack /= 8;//8
  6. quack %= 3;//2

2.假设value是int类型,下面循环的输出是什么?如果value是double类型,会出现什么问题?

  1. for ( value = 36; value > 0; value /= 2)
  2. printf("%3d", value);

答:
value是int类型的情况下:
36 18 9 4 2 1
如果 value是 double类型,即使 value小于1,循环的测试条件仍然为真。循环将一直执行,直到浮点数下溢生成0为止。另外,value是 double类型时,号3d转换说明也不正确。

3.用代码表示以下测试条件

a.x大于5
b.scanf()读取一个名为x的doule类型值且失败
c.x的值等于
答:

  1. x > 5
  2. scanf("%lf", &x) != 1
  3. x == 5

4.用代码表示以下测试条件

a.scanf()成功读入一个整数x
b.x不等于5
c.x大于或等于20
答:

  1. scanf("%d", &x) == 1
  2. x != 5
  3. x >= 20

5.下面的程序有点问题,请找出问题所在。

  1. #include <stdio.h>
  2. int main(void)
  3. { /* 第3行 */
  4. int i, j, list(10); /* 第4行 */
  5. for (i = 1, i <= 10, i++) /* 第6行 */
  6. { /* 第7行 */
  7. list[i] = 2*i + 3; /* 第8行 */
  8. for (j = 1, j > = i, j++) /* 第9行 */
  9. printf(" %d", list[j]); /* 第10行 */
  10. printf("\n"); /* 第11行 */
  11. } /* 第12行 */

答:
第4行:应该是1ist[10],
第6行:逗号改为分号。i的范围应该是0~9,不是1~10。
第9行:逗号改为分号。>=改成<=,否则,当i等于1时,该循环将成为无限循环。
第10行:在第10行和第11行之间少了一个右花括号。该右花括号与第7行的左花括号配对,形成一个for循环块。然后在这个右花括号与最后一个右花括号之间,少了一行 return 0;
正确的如下

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int i, j, list[10];
  5. for (i = 1; i <= 10; i++)
  6. {
  7. list[i] = 2*i + 3;
  8. for (j = 1; j <= i; j++)
  9. printf(" %d", list[j]);
  10. printf("\n");
  11. }
  12. }

6.编写一个程序打印下面的图案,要求使用嵌套循环





答:

#include <stdio.h>

int main(void)
{
    int i, j;
    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 7; j++)
        {
            printf("$");    
        }
        printf("\n");
    }

    return 0;
}

7.下面的程序各打印什么内容?

a.

#include <stdio.h>
int main(void)
{
    int i = 0;
    while (++i < 4)
        printf("Hi! ");
    do
        printf("Bye! ");
    while (i++ < 8);
    return 0;
}

答:Hi! Hi! Hi! Bye! Bye! Bye! Bye! Bye!
b.

#include <stdio.h>
int main(void)
{
    int i;
    char ch;
    for (i = 0, ch = 'A'; i < 4; i++, ch += 2 * i)
        printf("%c", ch);
    return 0;
}

答:ACGM

8.假设用户输入的是Go west, young man! ,下面各程序的输出是什么?(在ASCII码中,!紧跟在空格字符后面)

a.

#include <stdio.h>
int main(void)
{
    char ch;
    scanf("%c", &ch);
    while (ch != 'g')
    {
        printf("%c", ch);
        scanf("%c", &ch);
    }
    return 0;
}

答:Go west, youn
b.

#include <stdio.h>
int main(void)
{
    char ch;
    scanf("%c", &ch);
    while (ch != 'g')
    {
        printf("%c", ++ch);
        scanf("%c", &ch);
    }
    return 0;
}

答:Hp!xftu-!zpvo
c.

#include <stdio.h>
int main(void)
{
    char ch;
    do {
        scanf("%c", &ch);
        printf("%c", ch);
    } while (ch != 'g');
    return 0;
}

答:Go west, young
d.

#include <stdio.h>
int main(void)
{
    char ch;
    scanf("%c", &ch);
    for (ch = '$'; ch != 'g'; scanf("%c", &ch))
        printf("%c", ch);
    return 0;
}

答:$o west, youn

9.下面的程序打印什么内容?

#include <stdio.h>
int main(void)
{
    int n, m;
    n = 30;

    while (++n <= 33)
        printf("%d|", n);

    n = 30;
    do
        printf("%d|", n);
    while (++n <= 33);

    printf("\n***\n");

    for (n = 1; n*n < 200; n += 4)
        printf("%d\n", n);

    printf("\n***\n");

    for (n = 2, m = 6; n < m; n *= 2, m += 2)
        printf("%d %d\n", n, m);

    printf("\n***\n");

    for (n = 5; n > 0; n--)
    {
        for (m = 0; m <= n; m++)
            printf("=");
        printf("\n");
    }
    return 0;
}

答:
31|32|33|30|31|32|33|

1
5
9
13

2 6
4 8
8 10
*
======
=====
====
===
==

10.考虑下面的声明

double mint[10];
a.数组名是什么?答:mint
b.该数组有多少个元素?答:10
c.每个元素可以储存什么类型的值?答:double
d.下面的哪一个scanf()的用法正确?
i.scanf(“%lf”, mint[2])
ii.scanf(“%lf”, &mint[2])答:这个是正确的
iii.scanf(“%lf”, &mint)

11.Noah先生喜欢以2计数,所以编写了下面的程序,创建了一个储存2、4、6、8等数字的数组。

这个程序是否有错误之处?如果有,请指出。

#include <stdio.h>
#define SIZE 8
int main(void)
{
    int by_twos[SIZE];
    int index;
    for (index = 1; index <= SIZE; index++)
        by_twos[index] = 2 * index;
    for (index = 1; index <= SIZE; index++)
        printf("%d ", by_twos);
    printf("\n");
    return 0;
}

答:
因为第1个元素的索引是0,所以循环的范围应该是0~SIZE-1,而不是1~SIZE。但是如果只是这样更改会导致赋给第1个元素的值是0,不是2。所以,应重写这个循环
for (index = 0; index < SIZE; index++)
by_twos[index] = 2 * (index + 1);
与此类似,第2个循环的范围也要更改。另外,应该在数组名后面使用数组索引
for (index = 0; index < SIZE; index++)
printf("%d ", by_twos[index]);
错误的循环条件会成为程序的定时炸弹。程序可能开始运行良好,但是由于数据被放在错误的位置,能在某一时刻导致程序不能正常工作

12.假设要编写一个返回long类型值的函数,函数定义中应包含什么?

答:该函数应声明为返回类型为1ong,并包含一个返回1ong类型值的return语句

long demo(void){
    return 0L;
}

13.定义一个函数,接受一个int类型的参数,并以long类型返回参数的平方值。

long square(int x)
{
    return ((long) x) * x;
}

14.下面的程序打印什么内容?

#include <stdio.h>
int main(void)
{
    int k;
    for (
        k = 1, printf("%d: Hi!\n", k); 
        printf("k = %d\n", k),k*k < 26; 
        k += 2, printf("Now k is %d\n", k))
        printf("k is %d in the loop\n", k);
    return 0;
}

答:
1 Hi!
k = 1
k is 1 in the loop
Now k is 3
k = 3
k is 3 in the loop
Now k is 5
k = 5
k is 5 in the loop
Now k is 7
k = 7


编程练习

1.存储并大小26个英文字母

编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。然后打印数组的所有内容。

#include <stdio.h>

#define SIZE 26

int main(void)
{
    char lcase[SIZE]
    int i;
    for (i = 0; i < SIZE; i++)
        lcase[i] = 'a' + i;
    for (i = 0; i < SIZE; i++)
        printf("%c", lcase[i]);
    printf("\n");
    return 0;
}

2.使用嵌套循环,按下面的格式打印字符

$

$

$

#include <stdio.h>
#define ROW 5

int main(void)
{
    int i, j;
    for (i = 1; i <= ROW; i++)
    {
        for (j = 0; j < i; j++)
        {
            printf("$");
        }
        printf("\n");
    }    
    return 0;
}

3.使用嵌套循环,按下面的格式打印字母

F
FE
FED
FEDC
FEDCB
FEDCBA
注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:
char lets[27] = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”;

#include <stdio.h>
#define END_CHAR 'F'
#define START_CHAR 'A'
int main(void)
{    
    int i, j, size;
    for (i = END_CHAR; i >= START_CHAR; i--)
    {
        for (j = END_CHAR; j >= i; j--)
        {
            printf("%c", j);
        }
        printf("\n");
    }    
    return 0;    
}

4.使用嵌套循环,按下面的格式打印字母

A
BC
DEF
GHIJ
KLMNO
PQRSTU
如果你的系统不使用以数字顺序编码的代码,请参照练习3的方案解决。

#include <stdio.h>
#define START_CHAR 'A'
#define ROW 6

int main(void)
{
    int i, j;
    char temp = START_CHAR;
    for (i = 1; i <= ROW; i++)
    {
        for (j = 0; j < i; j++)
        {    
            printf("%c", temp + j);
        }
        temp += j;
        printf("\n");
    }

    return 0;
}

5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:

A<br />   ABA<br />  ABCBA<br /> ABCDCBA<br />ABCDEDCBA<br />打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。
#include <stdio.h>
#define END_CHAR 'A'
#define SPACE ' '
//根据输入的字母正反打印一行
void print_row(char ch);
//打印空格
void print_space(int num);

int main(void)
{
    int size, i;
    char ch;
    printf("请输入一个大写字母:");
    scanf("%c", &ch);

    size = ch - END_CHAR;

    for (i = 0; i <= size; i++)
    {
        print_space(size - i);
        print_row(END_CHAR + i);
        printf("\n");
    }    

    return 0;
}

void print_space(int num)
{
    int i;
    for (i = 0; i < num; i++)
    {
        printf("%c",SPACE);
    }
}

void print_row(char ch)
{
    int i;
    for (i = END_CHAR; i < ch; i++)
    {
        printf("%c", i);
    }
    for (i = ch; i >= END_CHAR; i--)
    {
        printf("%c", i);
    }
}

6.编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环。

#include <stdio.h>
int main( void )
{
    int lower, upper, index;
    int square, cube;

    printf("Enter starting integer: ");
    scanf("%d", &lower);
    printf("Enter ending integer: ");
    scanf("%d", &upper);

    printf("%5s %10s %15s\n", "num", "square", "cube");
    for (index = lower; index <= upper; index++)
    {
        square = index * index;
        cube = index * square;
        printf("%5d %10d %15d\n", index, square, cube);
    }
    return 0;
}

7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char word[40];
    int length = 0, i = 0;
    printf("请输入一个英文单词:");
    scanf("%s", word);

    length = strlen(word);
    for (i = length; i >=0; i-- )
    {
        putchar(word[i]);
    }
    putchar('\n');
    return 0;
}

8.编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。


总结

1.函数原型是为了方便编译器查看程序中使用的函数是否正确,函数定义描述了函数如何工作。

2.while循环,不确定循环和计数循环。for循环专为计数循环设计的。

3.for循环执行顺序

for(初始化表达式;条件判断;计数递增) 语句。initialize表达式在执行for语句之前只执行一次;然后对test表达式求值,如果表达式为真(或非零),执行循环一次;接着对update表达式求值,并再次检查test表达式。for语句是一种入口条件循环,即在执行循环之前就决定了是否执行循环。因此,for循环可能一次都不执行。

4.逗号运算符。

逗号运算符并不局限于在for循环中使用,但是这是它最常用的地方。逗号运算符有两个其他性质:
①它保证了被它分隔的表达式从左往右求值(换言之,逗号是一个序列点,所以逗号左侧项的所有副作用都在程序执行逗号右侧项之前发生)
② 整个逗号表达式的值是右侧项的值