- 复习题
- 1.写出执行完下列各行后quack的值是多少,后5行(第6行开始)中使用的是第1行quack的值。
- 2.假设value是int类型,下面循环的输出是什么?如果value是double类型,会出现什么问题?
- 3.用代码表示以下测试条件
- 4.用代码表示以下测试条件
- 5.下面的程序有点问题,请找出问题所在。
- 6.编写一个程序打印下面的图案,要求使用嵌套循环
- 7.下面的程序各打印什么内容?
- 8.假设用户输入的是Go west, young man! ,下面各程序的输出是什么?(在ASCII码中,!紧跟在空格字符后面)
- 9.下面的程序打印什么内容?
- 10.考虑下面的声明
- 11.Noah先生喜欢以2计数,所以编写了下面的程序,创建了一个储存2、4、6、8等数字的数组。
- 12.假设要编写一个返回long类型值的函数,函数定义中应包含什么?
- 编程练习
- 1.存储并大小26个英文字母
- 2.使用嵌套循环,按下面的格式打印字符
- 3.使用嵌套循环,按下面的格式打印字母
- 4.使用嵌套循环,按下面的格式打印字母
- 5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:
- 6.编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环。
- 7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。
- 8.编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。
- 总结
复习题
1.写出执行完下列各行后quack的值是多少,后5行(第6行开始)中使用的是第1行quack的值。
答案见注释
int quack = 2;//2
quack += 5;//7
quack *= 10;//70
quack -= 6;//64
quack /= 8;//8
quack %= 3;//2
2.假设value是int类型,下面循环的输出是什么?如果value是double类型,会出现什么问题?
for ( value = 36; value > 0; value /= 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的值等于
答:
x > 5
scanf("%lf", &x) != 1
x == 5
4.用代码表示以下测试条件
a.scanf()成功读入一个整数x
b.x不等于5
c.x大于或等于20
答:
scanf("%d", &x) == 1
x != 5
x >= 20
5.下面的程序有点问题,请找出问题所在。
#include <stdio.h>
int main(void)
{ /* 第3行 */
int i, j, list(10); /* 第4行 */
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行 */
答:
第4行:应该是1ist[10],
第6行:逗号改为分号。i的范围应该是0~9,不是1~10。
第9行:逗号改为分号。>=改成<=,否则,当i等于1时,该循环将成为无限循环。
第10行:在第10行和第11行之间少了一个右花括号。该右花括号与第7行的左花括号配对,形成一个for循环块。然后在这个右花括号与最后一个右花括号之间,少了一行 return 0;
正确的如下
#include <stdio.h>
int main(void)
{
int i, j, list[10];
for (i = 1; i <= 10; i++)
{
list[i] = 2*i + 3;
for (j = 1; j <= i; j++)
printf(" %d", list[j]);
printf("\n");
}
}
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;
}
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;
}
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循环中使用,但是这是它最常用的地方。逗号运算符有两个其他性质:
①它保证了被它分隔的表达式从左往右求值(换言之,逗号是一个序列点,所以逗号左侧项的所有副作用都在程序执行逗号右侧项之前发生)
② 整个逗号表达式的值是右侧项的值