1. 编写一个程序, 创建一个包含26个元素的数组, 并在其中储存26个小写字母。 然
后打印数组的所有内容。
#include <stdio.h>
#define SIZE 26
int main(void)
{
char a[SIZE];
for(int i = 0; i < SIZE; i++)
{
a[i] = 'a' + i;
}
for(int i = 0; i < SIZE; i++)
{
printf("%c ",a[i]);
}
return 0;
}
2. 使用嵌套循环, 按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
#include <stdio.h>
int main(void)
{
for(int i = 0; i < 5; i++)
{
for(int j = 0; j <= i; j++)
{
printf("%c",'$');
}
printf("\n");
}
return 0;
}
3. 使用嵌套循环, 按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
#include <stdio.h>
int main(void)
{
for(int i = 0; i < 6; i++)
{
for(int j = 0; j <= i; j++)
{
printf("%c",'F'-j);
}
printf("\n");
}
return 0;
}
4. 使用嵌套循环, 按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
#include <stdio.h>
int main(void)
{
char ch = 'A';
int i,j;
for(i = 1; i <= 6; i++)
{
for(j = 1; j <= i; j++)
{
printf("%c",ch++);
}
printf("\n");
}
return 0;
}
5. 编写一个程序, 提示用户输入大写字母。 使用嵌套循环以下面金字塔型的格式打
印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
打印这样的图形, 要根据用户输入的字母来决定。 例如, 上面的图形是在用户输入E
后的打印结果。 提示: 用外层循环处理行, 每行使用3个内层循环, 分别处理空格、 以升
序打印字母、 以降序打印字母。 如果系统不使用ASCII或其他以数字顺序编码的代码, 请
参照练习3的解决方案。
#include <stdio.h>
int main(void)
{
char ch;
scanf("%c",&ch);
for(int i = 0; i <= ch - 'A'; i++)
{
for(int j = i; j < ch - 'A'; j++)
printf(" ");
for(int k = 0; k <= i; k++)
printf("%c",'A' + k);
for(int t = i; t >0; t--)
printf("%c",'A'+i-t);
printf("\n");
}
return 0;
}
6. 编写一个程序打印一个表格, 每一行打印一个整数、 该数的平方、 该数的立方。
要求用户输入表格的上下限。 使用一个for 循环。
#include <stdio.h>
int main(void)
{
int upper,lower;
printf("Please input number's upper: ");
scanf("%d",&upper);
printf("Please input number's lower: ");
scanf("%d",&lower);
printf("%-10s%-10s%-10s\n","number","square","cube");
for(int i = upper; i <= lower; i++)
{
printf("%-10d%-10d%-10d\n",i,i*i,i*i*i);
}
return 0;
}
7. 编写一个程序把一个单词读入一个字符数组中, 然后倒序打印这个单词。 提
示: strlen() 函数(第4章介绍过) 可用于计算数组最后一个字符的下标。
#include <stdio.h>
#include <string.h>
#define SIZE 10
int main(void)
{
char word[SIZE];
scanf("%10s", word);
for(int i = strlen(word) - 1; i >= 0; i--)
{
putchar(word[i]);
}
return 0;
}
8. 编写一个程序, 要求用户输入两个浮点数, 并打印两数之差除以两数乘积的结
果。 在用户输入非数字之前, 程序应循环处理用户输入的每对值。
#include <stdio.h>
int main(void)
{
double num1,num2;
printf("Please input two double numbers:(and q to quit)");
while(scanf("%lf%lf",&num1,&num2) == 2)
{
printf("%5.3f\n",(num1-num2)/(num1*num2));
printf("Please input two double numbers:(and q to quit)");
}
return 0;
}
9. 修改练习8, 使用一个函数返回计算的结果。
#include <stdio.h>
double function(double x,double y);
int main(void)
{
double num1,num2;
printf("Please input two double numbers:(and q to quit)");
while(scanf("%lf%lf",&num1,&num2) == 2)
{
printf("%5.3f\n",function(num1,num2));
printf("Please input two double numbers:(and q to quit)");
}
return 0;
}
double function(double x,double y)
{
return (x-y)/(x*y);
}
10. 编写一个程序, 要求用户输入一个上限整数和一个下限整数, 计算从上限到下限
范围内所有整数的平方和, 并显示计算结果。 然后程序继续提示用户输入上限和下限整
数, 并显示结果, 直到用户输入的上限整数等于或小于下限整数为止。 程序的运行示例如
下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done
#include <stdio.h>
int main(void)
{
int num1,num2;
int sum=0;
printf("Enter lower and upper integer limits:");
while(scanf("%d%d",&num1,&num2) == 2 && (num1 != num2))
{
for(int i = num1; i <= num2; i++)
{
sum += i*i;
}
printf("The sums of the squares fom %d to %d is %d\n",
num1*num1,num2*num2,sum);
sum = 0;
printf("Enter next set of limits:");
}
printf("Done");
return 0;
}
11. 编写一个程序, 在数组中读入8个整数, 然后按倒序打印这8个整数。
#include <stdio.h>
#define SIZE 8
int main(void)
{
int a[SIZE];
for(int i = 0; i < SIZE; i++)
scanf("%d",&a[i]);
printf("The array is:\n");
for(int i = 0; i < SIZE; i++)
printf("%-3d ",a[i]);
printf("\n");
for(int i = SIZE - 1; i >= 0; i--)
printf("%-3d ",a[i]);
return 0;
}
12. 考虑下面两个无限序列:
1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + …
1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + …
编写一个程序计算这两个无限序列的总和, 直到到达某次数。 提示: 奇数个-1相乘
得-1, 偶数个-1相乘得1。 让用户交互地输入指定的次数, 当用户输入0或负值时结束输
入。 查看运行100项、 1000项、 10000项后的总和, 是否发现每个序列都收敛于某值?
#include <stdio.h>
int main(void)
{
int count;
double sum1 = 0,sum2 = 0;
printf("Please input the number total:(and input <= 0 "
"to quit)");
while(scanf("%d",&count) == 1 && count > 0)
{
for(int i = 1; i <= count; i++)
{
sum1 += (double)1/i;
if(i % 2 == 1)
{
sum2 += (double)1/i;
}
else
{
sum2 -= (double)1/i;
}
}
printf("The 1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + ..."
"= %.3f\n",sum1);
printf("The 1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + ..."
"= %.3f\n",sum2);
sum1 = 0;
sum2 = 0;
printf("Please input the number total:(and input <= 0 "
"to quit)");
}
return 0;
}
13. 编写一个程序, 创建一个包含8个元素的int 类型数组, 分别把数组元素设置为2
的前8次幂。 使用for 循环设置数组元素的值, 使用do while 循环显示数组元素的值。
#include <stdio.h>
#include <math.h>
#define SIZE 8
int main(void)
{
int a[SIZE];
int value = 1;
for(int i = 0; i < 8; i++)
{
a[i] = value;
value *= 2;
}
int k = 0;
do
{
printf("%-5d",a[k++]);
} while (k < SIZE);
return 0;
}
14. 编写一个程序, 创建两个包含8个元素的double类型数组, 使用循环提示用户为
第一个数组输入8个值。 第二个数组元素的值设置为第一个数组对应元素的累积之和。 例如, 第二个数组的第4个元素的值是第一个数组前4个元素之和, 第二个数组的第5个元素
的值是第一个数组前5个元素之和(用嵌套循环可以完成, 但是利用第二个数组的第5个元
素是第二个数组的第4个元素与第一个数组的第5个元素之和, 只用一个循环就能完成任
务, 不需要使用嵌套循环) 。 最后, 使用循环显示两个数组的内容, 第一个数组显示成一行, 第二个数组显示在第一个数组的下一行, 而且每个元素都与第一个数组各元素相对
应。
#include <stdio.h>
#include <math.h>
#define SIZE 8
int main(void)
{
double array1[SIZE],array2[SIZE];
double value = 0;
printf("Please input eight double numbers: ");
for(int i = 0; i < SIZE; i++)
{
scanf("%lf",&array1[i]);
}
for(int j = 0; j < SIZE; j++)
{
value += array1[j];
array2[j] = value;
}
for(int i = 0; i < SIZE; i++)
{
printf("%-8.3f",array1[i]);
}
printf("\n");
for(int i = 0; i < SIZE; i++)
{
printf("%-8.3f",array2[i]);
}
printf("\n");
return 0;
}
15. 编写一个程序, 读取一行输入, 然后把输入的内容倒序打印出来。 可以把输入储
存在char类型的数组中, 假设每行字符不超过255。 回忆一下, 根据%c转换说明, scanf()函数一次只能从输入中读取一个字符, 而且在用户按下Enter 键时scanf()函数会生成一个换行字符(\n) 。
#include <stdio.h>
#include <math.h>
#define SIZE 255
int main(void)
{
char array[SIZE];
int i = 0;
do
{
scanf("%c",&array[i]);
} while (array[i] != '\n' && ++i && i < SIZE);
for(i--; i >= 0; i--)
{
printf("%c",array[i]);
}
return 0;
}
16. Daphne以10%的单利息投资了100美元(也就是说, 每年投资获利相当于原始投
资的10%) 。 Deirdre以5%的复合利息投资了100美元(也就是说, 利息是当前余额的
5%, 包含之前的利息) 。 编写一个程序, 计算需要多少年Deirdre的投资额才会超过
Daphne, 并显示那时两人的投资额。
#include <stdio.h>
#include <math.h>
#define RATE1 0.1
#define RATE2 0.05
int main(void)
{
double daphne_count = 100,derirdre_count = 100;
int year = 0;
while(daphne_count >= derirdre_count)
{
daphne_count += 100 * RATE1;
derirdre_count += derirdre_count * RATE2;
year++;
}
printf("After %d years,Deirdre's count is lager than Daphne's"
"count\n",year);
printf("The Daphne's count is $%.2f\n",daphne_count);
printf("The Derirdre's count is $%.2f\n",derirdre_count);
return 0;
}
17. Chuckie Lucky赢得了100万美元(税后) , 他把奖金存入年利率8%的账户。 在每
年的最后一天, Chuckie取出10万美元。 编写一个程序, 计算多少年后Chuckie会取完账户的钱?
#include <stdio.h>
#include <math.h>
#define RATE 0.08
#define INIT_MONEY 100
#define TAKE_OUT_MONEY 10
int main(void)
{
int year = 0;
double balance = INIT_MONEY;
do
{
balance += balance * RATE;
balance -= 10;
year++;
} while (balance > 0);
printf("After %d years,The balance is 0\n",year);
return 0;
}
18. Rabnud博士加入了一个社交圈。 起初他有5个朋友。 他注意到他的朋友数量以下
面的方式增长。 第1周少了1个朋友, 剩下的朋友数量翻倍; 第2周少了2个朋友, 剩下的朋友数量翻倍。 一般而言, 第N周少了N个朋友, 剩下的朋友数量翻倍。 编写一个程序, 计算并显示Rabnud博士每周的朋友数量。 该程序一直运行, 直到超过邓巴数(Dunbar’s
number ) 。 邓巴数是粗略估算一个人在社交圈中有稳定关系的成员的最大值, 该值大约
是150。
#include <stdio.h>
#include <math.h>
#define DUNBAR_NUMBER 150
int main(void)
{
int week = 0;
int friends_number = 5;
while (friends_number <= DUNBAR_NUMBER)
{
week++;
friends_number -= week;
friends_number *= 2;
if(friends_number <= DUNBAR_NUMBER)
printf("After %d week,the friend's number is %d\n",
week, friends_number);
}
printf("After %d week,the friend's number is over Dunbar's number\n",
week, friends_number);
return 0;
}