《C语言程序设计教程》第三版 习题五

目录

一、习题

5.3 Fibonacci数列的前两个数为1, 1,以后每一个数都是其前两个数之和。求Fibonacci数列中的前20个数。用数组存放并按一行10个数的格式输出。

5.7 有17个人围成一圈(编号为1~17),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号?

5.8 编写程序在屏幕上画一条正弦曲线。

5.9 用筛选法求100以内的素数。

5.10 设计选择排序的C语言程序。

5.11 有一行文字,要求删去其中某个字符。此行文字和要删除的字符均由键盘输入。

5.12 编写一个函数atoi,其作用是将一个整数字符串转换成一个整数。

5.15 数字螺旋方阵的形式如图所示。请将螺旋方阵存放在n×n的二维数组中,并将其打印输出。要求n由程序读入,数字螺旋方阵由程序自动生成。

5.16 有3行文字,找出其中共有多少空格和多少单词(规定单词之间以一个或多个空格作为间隔)。

5.17 有n个学生,每人考m门课。(1)找出成绩最高的学生的学号和课程号。(2)找出有不及格课程的学生的学号及其各门课的全部成绩。(3)求全部学生全部课程总平均分。

5.19 有n个国家名,要求按字母先后顺序排列,并按顺序输出。

二、注意

2.1 折半查找

2.2 冒泡排序

2.3


一、习题

5.3 Fibonacci数列的前两个数为1, 1,以后每一个数都是其前两个数之和。求Fibonacci数列中的前20个数。用数组存放并按一行10个数的格式输出。

#include<stdio.h>
int main(){
	int arr[20] = {0};
	int i = 0;
	arr[0] = 1;
	arr[1] = 1;
	for(i = 2; i < 20; i++){
		arr[i] = arr[i - 1] + arr[i - 2];
	}
	for(i = 0; i < 20; i++){
		if(i != 0 && i % 10 == 0){
			printf("\n");
		}
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

5.7 有17个人围成一圈(编号为1~17),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号?

#include <stdio.h>
int main(){
	int num[50], n, *p, j, loop, i, m, k;
	printf("请输入这一圈人的数量:\n");
	scanf("%d", &n);
	p = num;//开始给这些人编号
	for (j = 0; j < n; j++){
		*(p + j) = j + 1;
	}
	i = 0;//i用于计数,即让指针后移
	m = 0;//m记录退出圈子的人数
	k = 0;//k报数1,2,3
	while(m < n - 1){//当退出的人数不大于总人数时,即留下的人数至少是一个人
		//这句不能写成m<n,因为假设有8人,当退出了6人时,此时还是进行人数退出,即m++,
		//这时是7<8,剩下的一个人自己喊1,2,3那么他也就退出了,将不会有输出
		if (*(p + i) != 0){//如果这个人的头上编号不是0就开始报数加1,这里采用的方法是报数为3的人头上编号重置为0
			k++;
		}
		if (k == 3){    
			k = 0;    //报数清零,即下一个人从1开始报数
			*(p + i) = 0;//将报数为3的人编号重置为0
			m++;    //退出人数加1
		}
		i++;      //指针后移
		if (i == n){//如果到了队尾,就要使指针重新指向对头//并且它只能放在i++后面,因为只有i++了才有可能i==n
			i = 0;
		}
	}
	printf("现在剩下的人是:");
	for (loop = 0; loop < n; loop++){
		if (num[loop] != 0){
			printf("%2d号\n",num[loop]);
		}
	}
	return 0;
}

5.8 编写程序在屏幕上画一条正弦曲线。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int radian; //10倍弧度
    double y;  //y为y轴,值为-1到+1,步长为0.1;
    int x; //用62列值代表x轴;62来源于2Pi*10约等于2*3.1*10;

    //用反正弦值求x更加方便于按行输出
    for(y=1; y>=-1; y-=0.1)
    {
        radian=asin(y)*10;

        for(x=0;x<=62;x++)
        {
            if((x==radian)||(x==(31-radian)||(x==radian+61))) 
				//反余弦函数值域[0,pi]
                printf("*");
            else if(radian==0)
                printf("-");
            else
                printf(" ");

        }
        printf("\n");
    }
    return 0;
}

5.9 用筛选法求100以内的素数。

#include<stdio.h>

//非筛选法
//int main(){
//	int i, j, flag = 1;
//	for(i = 2; i < 100; i++){
//		flag = 1;
//		for(j = 2; j < i; j++){
//			if(i % j == 0){
//				flag = 0;
//				break;
//			}
//		}
//		if(flag)
//			printf("%d ", i);
//	}
//	return 0;
//}

//筛选法
int main(){
	int i, j, a[100];
	for(i = 0; i < 100; i++){
		a[i] = i + 1;
	}
	a[0] = 0;//1不是素数,挖去
	for(i = 0; i < 100; i++){
		for(j = i + 1; j < 100; j++){
			if(a[i] != 0 && a[j] != 0){//跳过已挖去的数
				if(a[j] % a[i] == 0)
					a[j] = 0;
			}
		}
	}
	printf("1-100的素数是:\n");
	for(i = 0; i < 100; i++){
		if(a[i] != 0){
			printf("%d ", a[i]);
		}
	}
	printf("\n");
	return 0;
}

5.10 设计选择排序的C语言程序。

#include<stdio.h>
int main(){
	int arr[10] = {32,5,6,10,8,13,25,17,9,12};
	int i = 0, j = 0, min, temp;
	printf("排序前:");
	for(i = 0; i &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值