c primer plus
6.16编程练习
/*
编写一个程序,创建一个包含26个元素的数组,并在其中存储26个小写字母。
然后打印数组的所有内容
*/
#include <stdio.h>
#define SIZE 26
int main(void)
{
char alphabet[SIZE];
int index;
for (char ch = 'a', index = 0; ch <= 'z'; ch++, index++)
alphabet[index] = ch;
for (int index = 0; index < SIZE; index++)
printf("%c \n", alphabet[index]);
return 0;
}
/*
使用嵌套循环(nested loop)按照下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
*/
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < i+1; j++)
printf("$");
printf("\n");
}
return 0;
}
/*
使用嵌套循环nested loop,按下面的格式打印字母
F
FE
FED
FEDC
FEDCB
FEDCBA
此程序可以修改CH来打印各种字符递减的三角形
比如当CH改为H时,输出效果如下:
H
HG
HGF
HGFE
HGFED
HGFEDC
HGFEDCB
HGFEDCBA
*/
#include <stdio.h>
#define CH 'F'
int main(void)
{
char ch = CH;
for (int i = 0; i <=CH - 'A'; i++)
{
for (int j = 0, ch = CH; j<= i; j++, ch--)//从F开始打印,第一次打印1个
printf("%c", ch); //第二次打印两个,利用与外层循环变量i的关系控制
printf("\n");
}
return 0;
}
- 此程序提供了3个版本,依次改进
/*
使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
*/
#include <stdio.h>
int main(void)
{
const char end = 'U';
char start;
for (int i=0, start = 'A'; ch <= 'U'; i++)
{
for (int j=0; j <= i; j++) //利用行数与打印字符之间的关系
{
printf("%c", start);
start++; //每打印一个字符,字符递增至下一个字符
}
printf("\n"); //每一行结束后,换行
}
return 0;
}
//*************************************************************************
/*
下面是增强版,简化了代码行数,并可让用户输入指定字符
打印三角形至输入字符所在行
如输入V,则打印:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZ[\
*/
#include <stdio.h>
int main(void)
{
char end;
char start;
printf("Enter an character: \n");
scanf("%c", &end);
for (int i = 0, start = 'A'; start <= end; i++)
{
for (int j=0; j<=i; j++, printf("%c", start), start++);
printf("\n");
}
return 0;
}
//*************************************************************************
/*
进了上个程序,使其只会打印至用户输入的字符处,不同于上个程序
会完整输出字符所在的整行
*/
#include <stdio.h>
int main(void)
{
char start;
char end;
printf("Enter an end of the character: \n");
scanf("%c", &end);
for (int i = 0, start = 'A'; start <= end; i++)
{
for (int j = 0; j <= i; j++,start++)
{
if (start<= end)
printf("%c", start);
}
printf("\n");
}
return 0;
}
/*
编写一个程序,提示用户输入大写字母
使用嵌套循环以下面金字塔型的格式打印字母
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
打印这样的图形,要根据用户输入的字母来决定。
例如,上面的图形是在输入E后的打印结果。
*/
#include <stdio.h>
int main(void)
{
char start = 'A';
char end;
char ch = start;
printf("Enter an character i will give you a surprise now: \n");\
scanf("%c", &end);
printf("It's your own alphabet tree(haha): \n");
for (int i = 0; i <= end-start; i++, ch = start)
{
for (int j = 0; j < end - start - i; j++)
printf(" ");
for (int k = 0; k <= i; k++)
{
printf("%c", ch);
ch++;
}
ch -= 2;
for (int c = 0; c < i; c++)
{
printf("%c",ch);
ch--;
}
printf("\n");
}
return 0;
}
//*************************************************************************
//下面利用for loop的特性,使代码更加紧凑
#include <stdio.h>
int main(void)
{
char end;
char start = 'A';
char ch = start;
printf("Enter an character i will give you a surprise now: \n");
scanf("%c", &end);
printf("It's your own alphabet tree(haha): \n");
for (int i = 0; i <= end-start; i++, ch = start)
{
for (int j = 0; j < end - start - i; j++)
printf(" ");
for (int k = 0; k <= i; k++, ch++)
printf("%c", ch);
ch = ch - 2;
for (int c = 0; c < i; c++, ch--)
printf("%c",ch);
printf("\n");
}
return 0;
}
//小结一下,此题还是利用的是内外层循环的数值关系,搞清楚当中的关系也就不难了
/*
编写一个程序打印一个表格,每行打印一个整数、该数的平方、该数的立方
要求用户输入表格的上下限。使用一个for loop
*/
#include <stdio.h>
int main(void)
{
int start;
int end;
printf("Enter a number as start: \n");
scanf("%d", &start);
printf("Enter a number as end: \n");
scanf("%d", &end);
printf("_____________________________________\n");
for (printf("original \t suqare \t cube\n"), start; start <= end; start++)
{
printf("%8d %14d %13d\n", start, start*start, start*start*start);
}
printf("_____________________________________\n");
printf("That's all");
return 0;
}
/*
编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。
提示strlen()函数可用于计算数组最后一个字符的下标。
*/
#include <stdio.h>
#include <string.h>
#define SIZE 40
int main(void)
{
char words[SIZE];
int end_index;
printf("Please enter a word that"
"you want to know it's revers order: \n");
scanf("%s", words);
end_index = strlen(words);
for (end_index--; end_index >= 0; end_index--)
printf("%c", words[end_index]);
return 0;
}
/*
编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果
在用户输入非数字之前,程序应循环处理用户输入的每对值。
*/
// 使用 do while loop 可以处理用户的非法输入,但是没有控制结束的方法......读错题了
//正确的答案在下面,可以看看
#include <stdio.h>
int main(void)
{
float f_op;
float s_op;
do
{
printf("Please enter two number: \n");
fflush(stdin); //用来清除输入缓冲区,否则如果输入非float类型的值,这个值将在输入缓冲区中一直被失败读取,导致无限循环“Please enter two number:”
}while ((scanf("%f %f", &f_op, &s_op)) != 2);
printf("(%.3g - %.3g) / (%.3g * %.3g) = %.5g",f_op, s_op, f_op, s_op, (f_op-s_op) / (f_op * s_op));
return 0;
}
//*************************************************************************
// 使用 while loop 当用户输入非数值类型时,结束
#include <stdio.h>
int main(void)
{
double n, m;
double res;
printf("Enter a pair of numbers: ");
while (scanf("%lf %lf", &n, &m) == 2)
{
res = (n - m) / (n * m);
printf("(%.3g - %.3g) / (%.3g * %.3g) = %.5g \n", n, m, n, m, res );
printf("Enter next pair (non-numeric to quit)");
}
}
/*
修改练习8,使用一个函数返回计算的结果。
*/
#include <stdio.h>
float func1(float f_op, float s_op);
int main(void)
{
float f_op;
float s_op;
int states;
do
{
printf("Please enter two number: \n");
fflush(stdin);
states = scanf("%f %f", &f_op, &s_op);
}while (states != 2);
printf("Result: %f \n", func1(f_op, s_op));
return 0;
}
float func1(float f_op, float s_op)
{
return (f_op-s_op) / (f_op * s_op);
}
/*
编写一个程序,要求用户输入一个上限整数和一个下限整数,
计算从上限到下限范围内所有整数的平方和,并显示计算结果
直到用户输入的上限整数小于下限整数为止。
程序的运行示例如下:
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 lower_num;
int upper_num;
printf("Enter lower and upper integer limits: ");
scanf("%d %d", &lower_num, &upper_num);
while (upper_num > lower_num)
{
int sum = 0;
for (int count = lower_num; count <= upper_num; count++)
{
sum += count * count;
}
printf("The sums squares frome %d to %d is %d \n",
lower_num * lower_num, upper_num * upper_num, sum);
printf("Enter lower and upper integer limits: ");
scanf("%d %d", &lower_num, &upper_num);
}
printf("Done\n");
return 0;
}
/*
编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
int num[SIZE];
printf("Start:");
printf("Please enter %d integers.\n", SIZE);
for (int i = 0; i < SIZE; i++)
scanf("%d", &num[i]);
printf("Here, in reverse order, are the values you entered:\n");
for (int j = SIZE-1; j >= 0; j--)
printf("%d \n", num[j]);
printf("Done! \n");
return 0;
}
/*
考虑下面两个无限序列:
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
让用户交互的输入指定的次数,当用户输入0或负值时结束输入
查看运行100项、1000项、10000项后的总和,是否发现每个序列都收敛于某值?
*/
#include <stdio.h>
int main(void)
{
int times;
float count1 = 1.0f;
float count2 = 1.0f;
float sum1 = 0.0;
float sum2 = 0.0;
printf("How many times adddtion you want : \n");
scanf("%d", ×);
for (int i = 1; i <= times; i++, count++)
{
sum += 1.0 / count;
}
for (int j = 1; j <= times; j++, count2++)
{
if (j % 2 == 0)
{
sum2 -= 1.0 / count2;
}
else
{
sum2 += 1.0 / count2;
}
}
printf("The first infinite series: %f\n", sum1);
printf("The second infinite series: %f \n", sum2);
return 0;
}
第二个级数是收敛的,第一个级数不收敛,数学过程怎么证明来着我忘了 = =待我看完书再补上ORZ
13.
/*
编写一个程序,创建一个包含八个元素的int类型数组,
分别把数组元素设置为2的前8次幂。
使用for循环设置数组元素的值,使用do while循环显示数组的值
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
int num[SIZE];
int power_of_two;
int index = 0;
for (int i = 0; i < SIZE; i++)
{
power_of_two = 1;
for (int j = 1; j <= i+1; j++)
power_of_two = power_of_two * 2;
num[i] = power_of_two;
}
do
{
printf("%d \n", num[index]);
index++;
} while (index < SIZE);
return 0;
}
/*
编写一个程序,创建两个包含8个元素的double类型数组
使用循环提示用户为第一个数组输入8个值。
第二个元素的值设置为第一个数组对应元素的累积之和。
例如:第二个数组的第4个元素是第一个数组前4个元素之和
(利用嵌套循环完成,但是第二个数组的第5个元素是第二个数组的第4个元素
与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套循环)
最后,使用循环显示两个数组的内容,每个数组各占一行且相应元素上下对齐
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
double arr1[SIZE];
double arr2[SIZE];
printf("Please input the value of the first array: \n");
for (int i = 0; i < SIZE; i++)
{
scanf("%lf", &arr1[i]);
for (int j = 1 ; j <= i; j++)
{
arr2[0] = arr1[0]; //这条初始化语句放在for loop里会报错,原因尚不得知
arr2[j] = arr2[j-1] + arr1[j] ;
}
}
printf("Good job ! \n");
printf("————————————————————————————————————————\n");
for (int i = 0; i < SIZE; i++)
{
printf ("%7.2f", arr1[i]);
}
printf("\n");
for (int i = 0; i < SIZE; i++)
{
printf ("%7.2f", arr2[i]);
}
printf("\n————————————————————————————————————————\n");
return 0;
}
//*************************************************************************
//法2 待补充
/*
编写一个程序,读取一行输入,让后把输入的内容倒序打印出来。
可以把输入储存在char类型的数组中,假设每行字符不超过255.
回忆一下,根据%c转换说明(conversation specification)
scanf()每次只能中输入中读取一个字符,
而且在用户按下Enter键时,scanf()会生成一个换行字符(\n).
*/
#include <stdio.h>
#define SIZE 256
int main(void)
{
char str[SIZE];
int index = -1;
printf("Please input everyting your like,"
" but no more than 255 characters: \n");
for (int i = 0; i < SIZE; i++)
{
scanf("%c", &str[i]);
index++; //统计字符个数
if (str[i] == '\n')
break; //用到了后一章的break,暂时没找到用前几章的解法
}
for (int j = index - 1; j >= 0; j--) //从index处倒序打印
printf("%c", str[j]);
return 0;
}
/*
Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)
Deirdre以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包含之前的利息)
编写一个程序,计算需要多少年Deirade的投资额才会超过Daphne,并显示那时两人的投资额
*/
#include <stdio.h>
#define SIMP_RATE 10%
#define COM_RATE 5%
int main(void)
{
int base_money = 100;
float simple_interest = (float)base_money;
float compound_interest = (float)base_money;
int years = 0;
while (compound_interest <= simple_interest)
{
simple_interest += base_money * (10.0 / 100);
compound_interest *= (105.0 / 100);
years++;
printf("The %d year \n", years);
printf("simple interest: %16.3f \n", simple_interest);
printf("compound interest: %14.3f \n", compound_interest);
printf("---------------------------------\n");
}
printf("finally it spend %d Years.", years);
return 0;
}
/*
Chuckie Lucky 赢得了100万美元(税后),他把奖金存入年利率8%的账户。
在每年的最后一天,Chuckie取出10万美元。
编写一个程序,计算需要多少年后Chuckie会取完账户的钱?
*/
#include <stdio.h>
int main(void)
{
int base_money = 100;
const float RATE = 108.0 / 100;
float total = 100;
int years;
while (total > 0)
{
total *= RATE;
total -= 10;
years++;
printf("%4d years %f\n", years, total);
}
printf("%4d years later you have no money in the bank", years);
return 0;
}
/*
Rabnud博士加入了一个社交圈。起初他有5个朋友,他注意到他的朋友以下面的方式进行增长
第1周少了1个朋友,剩下的朋友数量翻倍;第二周少了两个朋友,剩下朋友数量翻倍
一般而言,第N周少了N个朋友,剩下的朋友数量翻倍。
编写一个程序,计算并显示Rabnud博士每周朋友的数量。
该程序一直运行,直到超过邓巴数(Dunbar's number)。
邓巴数是粗略估计一个人在社交圈中有稳定关系的成员的最大值,该值大约是150
*/
#include <stdio.h>
#define DUNBAR 150
int main(void)
{
int start_f = 5;
int total_f = start_f;
int weeks = 1;
while (total_f < DUNBAR)
{
total_f = (total_f - weeks) * 2;
printf(" %d weeks later, %d friends\n", weeks, total_f);
weeks++;
}
printf("After %d weeks your have touch the Dunbar. \n", weeks-1);
return 0;
}
相关阅读
在QQ群跟一帮朋友们瞎侃,有个家伙问了个问题:“五腾蓝是什么?”我不加思索,这有啥,还有goole百度不知道的吗?于是贴进去搜了一下,居然没
1、web 是一种基于超文本和http的、全球性的、动态交互的、跨平台的分布式图形信息系统 是建立在Internet上的一种网络服务。 现
iTunes备份文件在哪?如何改变默认备份文件目录?答案都在
iTunes和iCloud这两个东西,相信苹果用户都很熟悉,由于iCloud的服务器在国外,所以它虽然可以在手机内操作,但是那备份恢复手机数据
1、Coding Games
免费在线打字练习网站 网站传送门:91uu在线打字网一、无须注册 网站无须注册,首次打字即可自动生成用户。打开网站,就可以开始打字练