精华内容
下载资源
问答
  • 2019-06-16 00:27:29

    谭浩强 C程序设计第五版 第五版课后答案

    点我看视频讲解+可运行源码
    记得一键三连哦

    c程序设计

    第一章

    在这里插入图片描述

    1.什么是程序?什么是程序设计?

    • 程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作

    • 程序设计:是指从确定任务到得到结果、写出文档的全过程

    2.为什么需要计算机语言?高级语言有哪些特点?

    • 为什么需要计算机语言:计算机语言解决了人和计算机交流是的语言问题,使得计算机和人都能识别

    • 高级语言有哪些特点:
      2.1 高级语言的数据结构要比汇编和机器语言丰富;
      2.2 高级语言与具体机器结构的关联没有汇编以及机器语言密切;
      2.3 高级语言更接近自然语言更容易掌握;
      2.4 高级语言编写的程序要经过编译或解释计算机才能执行;

    3.正确理解以下名词及其含义:

    (1)源程序,目标程序,可执行程序。

    • ​源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令

    • 目标程序:为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名

    • 可执行程序:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体,生成一个可供计算机执行的目标程序,成为可执行程序

    (2)程序编辑,程序编译,程序连接。

    程序编辑:上机输入或者编辑源程序。

    程序编译:

    • 先用C提供的“预处理器”,对程序中的预处理指令进行编译预处理
    • 对源程序进行语法检查, 判断是否有语法错误,直到没有语法错误未知
    • 编译程序自动把源程序转换为二进制形式的目标程序

    程序连接:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体的过程称之为程序连接

    (3)程序,程序模块,程序文件。

    • 程序:一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具

    • 程序模块:可由汇编程序、编译程序、装入程序或翻译程序作为一个整体来处理的一级独立的、可识别的程序指令

    • 程序文件:程序的文件称为程序文件,程序文件存储的是程序,包括源程序和可执行程序

    (4)函数,主函数,被调用函数,库函数。

    • 函数:将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,来完成一定功能

    • 主函数:又称main函数,是程序执行的起点

    • 被调用函数:由一个函数调用另一个函数,则称第二个函数为被调用函数

    • 库函数:一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是

    ​ 编译器特定的库函数

    (5)程序调试,程序测试。
    • 程序调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程

    • 程序测试:是指对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行

    4.编写一个C程序,运行时输出

    Hello World!
    这个程序是一些国外C教材中作为第一个程序例子介绍的,一般称为Hello程序。

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	printf("%s\n", "Hello World!");
    	return 0;
    }
    

    运行截图:

    C程序设计第五版谭浩强第4题答案

    5.编写一个C程序,运行时输出以下图形:

    ****

    ****

    ​ ****

    ​ ****

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	for (int i = 0; i < 4; i++)
    	{
    		for (int j = 0; j < i; j++)
    		{
    			printf("%s", "  ");
    		}
    		printf("%s\n", "*****");
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强第5题答案

    6.编写一个C程序,运行时输人a,b,c三个值,输出其中值最大者。

    代码示例:

    #include<stdio.h>
    
    int main()
    {
    	int a, b, c, max;
    	printf("请输入三个数:\n");
    
    	scanf("%d%d%d", &a, &b, &c);
    	if (a > b)
    	{
    		max = a;
    	}
    	else
    	{
    		max = b;
    	}
    
    	if (c > max)
    	{
    		max = c;
    	}
    	printf("三个数中最大的数为:%d", max);
    	return 0;
    
    }
    

    运行截图:

    C语言程序设计第五版谭浩强第6题答案

    7.看懂《C程序设计(第五版)学习辅导》第16章中介绍的用Visual Studio 2010对C程序进行编辑、编译、连接和运行的方法,并进行以下操作:

    (1)建立一个新项目,定名为project1.

    C语言程序设计第五版谭浩强第6题答案

    (2)建立一个新文件,定名为test1。

    C语言程序设计第五版谭浩强课后答案 第二题

    (3)向test1 文件输人源程序(此源程序为读者自己编写的程序)。

    C语言程序设计第五版谭浩强课后答案 第三题

    (4)编译该源程序,如发现程序有错,请修改之,直到不出现“编译出错”为止。

    (5)连接并运行, 得到结果。分析结果。

    C程序设计第五版课后答案

    点我看视频讲解+可运行源码
    记得一键三连哦

    更多相关文章

    C程序设计第五版谭浩强课后习题答案 第一章
    C程序设计第五版谭浩强课后习题答案 第二章
    C程序设计第五版谭浩强课后习题答案 第三章
    C程序序设计第五版谭浩强课后习题答案 第四章
    C语言程序设计第五版谭浩强课后习题答案 第五章
    C语言程序设计第五版谭浩强课后习题答案 第六章
    C语言程序设计第五版谭浩强课后习题答案 第七章
    C语言程序设计第五版谭浩强课后习题答案 第八章
    C语言程序设计第五版谭浩强课后习题答案 第九章
    C语言程序设计第五版谭浩强课后习题答案 第十章

    更多相关内容
  • C语言程序设计第五版_谭浩强_课后习题答案完整版
  • 高等学校计算机应用规划教材 《C语言程序设计第五版)》 宋广军 主编
  • 高等学校计算机应用规划教材 《C语言程序设计第五版)》 宋广军 主编 谭小球 陈荣品 张建科 侯志凌 副主编
  • C语言程序设计第五版)谭浩强》学习笔记
  • 课后练习题答案 Chapter 1 1.1 1.2 b c 1.3 ad 1.4 semicolon printf math.h \n Chapter 2 2.1 2.2 typedef 255 external const Chapter 3 3.1 3.2 integer modula 6 logical sizeof paratheses typeconversion ...
  • C语言程序设计第五版)》 宋广军 主编 谭小球 陈荣品 张建科 侯志凌 副主编
  • C语言程序设计第五版谭浩强第九章答案 1.定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。2.写一个函数days,实现第1 题的计算。由主函数将年、月、日传递给days函数,计算后将日子数...

    C语言程序设计第五版谭浩强第九章答案


    在这里插入图片描述

    1.定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。

    解题思路及答案:

    • 用一个日期数组保存每一月的天数,二月的天数记为28天,后面根据输入的时间确定是否是闰年的二月,如果是,天数在加1。
    #include <stdio.h>
    
    struct Date{
    	int year;
    	int month;
    	int day;
    };
    
    int main(){
    	struct Date date;
    	printf("Please give date: ");
    	scanf("%d%d%d", &date.year, &date.month, &date.day);
    	int Days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    	
    	int i, days = 0;
    	for (i = 1; i < date.month; i++)
    		days += Days[i];
    	days += date.day;
        //如果包含闰年的二月,天数加1
        if(date.month > 2)
        {
           if (date.year%400 == 0 || (date.year%4 == 0 && date.year%100 != 0)){
                ++days;
    		} 
        }
    	printf("It's day %d in the year.\n", days);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    2.写一个函数days,实现第1 题的计算。由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。

    #include <stdio.h>
    
    struct Date{
    	int year;
    	int month;
    	int day;
    };
    
    int Days(struct Date date)
    {
    	static int Days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    
    	int i, days = 0;
    	for (i = 1; i < date.month; i++)
    		days += Days[i];
    	days += date.day;
    	//如果包含闰年的二月,天数加1
    	if (date.month > 2)
    	{
    		if (date.year % 400 == 0 || (date.year % 4 == 0 && date.year % 100 != 0)){
    			++days;
    		}
    	}
    	return days;
    }
    
    int main(){
    	struct Date date;
    	printf("Please give date: ");
    	scanf("%d%d%d", &date.year, &date.month, &date.day);
    	int days = Days(date);
    	printf("It's day %d in the year.\n", days);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    3.编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输人这些记录,用print函数输出这些记录。

    #include <stdio.h>
    
    #define NAMLEN 20
    //定义一个student结构体数组,包含5个元素
    struct student_t{
    	int num;
    	char name[NAMLEN];
    	int score[3];
    } students[5];
    
    void print(struct student_t *stu);
    
    int main(){
    	for (int i = 0; i < 5; i++){
    		scanf("%d%s%d%d%d", &students[i].num, students[i].name, &students[i].score[0],
    			&students[i].score[1], &students[i].score[2]);
    	}
    	print(students);
    	return 0;
    }
    
    void print(struct student_t *stu){
    	for (int i = 0; i < 5; i++){
    		printf("%d %s %d %d %d\n", students[i].num, students[i].name, students[i].score[0],
    			students[i].score[1], students[i].score[2]);
    	}
    }
    

    运行截图

    C语言程序设计第五版谭浩强课后答案第三题

    4.在第3题的基础上,编写一个函数input,用来输人5个学生的数据记录。

    #include <stdio.h>
    
    #define NAMLEN 20
    //定义一个student结构体数组,包含5个元素
    struct student_t{
    	int num;
    	char name[NAMLEN];
    	int score[3];
    } students[5];
    
    void print(struct student_t *stu);
    void input(struct student_t *stu);
    
    int main(){
    	input(students);
    	print(students);
    	return 0;
    }
    
    void input(struct student_t *stu)
    {
    	for (int i = 0; i < 5; i++){
    		scanf("%d%s%d%d%d", &students[i].num, students[i].name, &students[i].score[0],
    			&students[i].score[1], &students[i].score[2]);
    	}
    }
    
    void print(struct student_t *stu){
    	for (int i = 0; i < 5; i++){
    		printf("%d %s %d %d %d\n", students[i].num, students[i].name, students[i].score[0],
    			students[i].score[1], students[i].score[2]);
    	}
    }
    

    运行截图:

    在这里插入图片描述

    5.有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩,从键盘输人10个学生数据,要求输出3门课程总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。

    #include <stdio.h>
    
    #define NAMLEN 20
    #define STUCNT 10
    
    typedef struct student_t{
    	int num;
    	char name[NAMLEN];
    	int score[3];
    } student;
    
    int main(){
    	student students[STUCNT];
    	int maxi = 0, maxsum = 0;
    	double aver_0 = 0, aver_1 = 0, aver_2 = 0;
    	for (int i = 0; i < STUCNT; i++){
    		scanf("%d%s%d%d%d", &students[i].num, students[i].name, &students[i].score[0], &students[i].score[1], &students[i].score[2]);
    		int sum = students[i].score[0] + students[i].score[1] + students[i].score[2];
    		if (sum > maxsum){
    			maxsum = sum;
    			maxi = i;
    		}
    		aver_0 += students[i].score[0];
    		aver_1 += students[i].score[1];
    		aver_2 += students[i].score[2];
    	}
    	aver_0 /= STUCNT;
    	aver_1 /= STUCNT;
    	aver_2 /= STUCNT;
    	printf("%lf %lf %lf\n", aver_0, aver_1, aver_2);
    	printf("%d %s %d %d %d %lf\n", students[maxi].num, students[maxi].name, students[maxi].score[0], students[maxi].score[1], students[maxi].score[2],
    		(students[maxi].score[0] + students[maxi].score[1] + students[maxi].score[2]) / 3.0);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    6.13个人围成一圈,从第1个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。要求用链表实现。

    解题思路及答案:

    创建一个环形链表,给链表中的每一个节点从1~13编号,然后开始淘汰过程,对于淘汰的节点,序号置为0,淘汰完成之后,找到序号不为0的即为最后留下的。

    #include <stdio.h>
    #define NUM 13
    typedef struct people
    {
    	int num;
    	struct people *next;
    } people;
    
    int main()
    {
    	int count = NUM;
    	people p[NUM];
    	people *head;
    	head = p; //head 指向p[0]
        //1~13编号
    	for (int i = 0; i < NUM; i++)
    	{
    		head->num = i + 1;
    		head->next = &p[i + 1];
    		head = head->next;
    	}
        //最后一个元素指向第一个元素 , 形成环
    	p[NUM - 1].next = p; 
    
    	int i = 1;
    	head = p;
    	while (count > 1)
    	{
            //跳过已经被淘汰的节点
    		if (head->num == 0)
    		{
    			head = head->next;
    			continue;
    		}
    		if (i == 3)
    		{
                //被淘汰的节点,num置为0
    			printf("第 %d 位置被淘汰\n", head->num);
    			head->num = 0;
    			count--;
    		}
    		head = head->next;
    		i++;
    		if (i > 3)
    		{
    			i = 1;
    		}
    	}
    	printf("--------------\n");
    	while (head->num == 0)
    	{
            //非0节点即为最后留下的
    		head = head->next;
    		if (head->num != 0)
    		{
    			printf("留到最后的是 %d \n", head->num);
    		}
    	}
    
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    7.在第9章例9.9和例9.10的基础上,写一个函数del,用来删除动态链表中指定的节点

    解题思路及答案:

    首先创建一个带头的单链表,然后让用户输入需要删除的节点,调用del函数,找到需要删除的节点,把待删除节点的前驱和后继重新链接。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct LNode
    {
    	int num;
    	struct LNode *next;
    } LNode;
    
    //创建含有n个值的节点
    LNode* creat(int n)
    {
    	LNode *head, *p;
    	head = (LNode *)malloc(sizeof(LNode));
    	p = head; //头节点为0 加上头节点共n + 1个节点
    	head->num = 0;
    	head->next = NULL;
    	for (int i = 1; i <= n; i++)
    	{
    		LNode *newNode = (LNode *)malloc(sizeof(LNode));
    		newNode->num = i;
    		newNode->next = NULL;
    		p->next = newNode;
    		p = p->next;
    	}
    	return head;
    }
    
    //删除值为n的节点
    void del(int n, LNode *head)
    {
    	LNode *pre, *current;
    	pre = head;
    	current = head->next;
    	//从第一个有效节点开始查找待删除节点
    	printf("delete node %d\n", n);
    	while (current != NULL)
    	{
            //找到待删除节点,重新链接,释放待删除节点
    		if (current->num == n)
    		{
    			pre->next = current->next;
                free(current);
    			break;
    		}
            //更新查找位置
    		pre = current;
    		current = current->next;
    	}
    }
    
    int main()
    {
    	LNode *head, *p;
    	int n;
    	head = creat(10);
    	printf("请输入需要删除的节点:1-10\n");
    	scanf("%d", &n);
    	del(n, head);
    	int i = 1;
    	p = head->next;
    	while (p != NULL)
    	{
    		printf("p %d.num -> %d\n", i, p->num);
    		p = p->next;
    		i++;
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案第七题答案

    8.写一个函数insert,用来向一个动态链表插入结点

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct LNode
    {
    	int num;
    	struct LNode *next;
    } LNode;
    
    void insert(int n, LNode *node)
    {
    	//创建新节点
    	LNode *newNode = (LNode *)malloc(sizeof(LNode));
    	newNode->num = n;
    
    	LNode* next = node->next;
    
    	// node ---> newNode  ---> next
    	newNode->next = next;
    	node->next = newNode;
    }
    
    LNode* creat(int n)
    {
    	LNode *head, *p;
    	head = (LNode *)malloc(sizeof(LNode));
    	p = head; //头节点为0 加上头节点共11个节点
    	head->num = 0;
    	head->next = NULL;
    	for (int i = 1; i <= n; i++)
    	{
    		LNode *newNode = (LNode *)malloc(sizeof(LNode));
    		newNode->num = i;
    		newNode->next = NULL;
    		p->next = newNode;
    		p = p->next;
    	}
    	return head;
    }
    
    void printNode(LNode* head)
    {
    	LNode* p = head->next;
    	while (p != NULL)
    	{
    		printf("num -> %d\n", p->num);
    		p = p->next;
    	}
    }
    
    int main()
    {
    	LNode *head;
    	int n;
    	head = creat(10);
    	printNode(head);
    	printf("请输入需要插入的节点:\n");
    	scanf("%d", &n);
    	insert(n, head);
    	printf("链表的新内容:\n");
    	printNode(head);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版第八题答案

    9.综合本章例9.9(建立链表的函数creat)、例9.10(输出链表的函数print)和本章习题第7题(删除链表中结点的函数del)、第8题(插入结点的函数insert),再编写一个主函数,先后调用这些函数。用以上5个函数组成一个程序,实现链表的建立、输出、删除和插入,在主函数中指定需要删除和插人的结点的数据。

    #include <stdio.h>
    #include <stdlib.h>
    #define COUNT 5
    typedef struct LNode
    {
    	int num;
    	struct LNode *next;
    } LNode;
    
    LNode* create(int n)
    {
    	LNode *head, *p;
    	head = (LNode *)malloc(sizeof(LNode));
    	p = head; //头节点为0 加上头节点共11个节点
    	head->num = 0;
    	head->next = NULL;
    	for (int i = 1; i <= n; i++)
    	{
    		LNode *newNode = (LNode *)malloc(sizeof(LNode));
    		newNode->num = i;
    		newNode->next = NULL;
    		p->next = newNode;
    		p = p->next;
    	}
    	return head;
    }
    //在指定位置插入数据
    void insert(int n, int positon, LNode *root)
    {
        //首先找到指定位置
    	while (positon--)
    	{
    		root = root->next;
    	}
        //插入新的数据,重新链接插入点的前后节点关系
    	LNode *newNode = (LNode *)malloc(sizeof(LNode));
    	newNode->num = n;
    	newNode->next = root->next;
    	root->next = newNode;
    }
    void del(int n, LNode *root)
    {
    	LNode *pre;
    	while (root->num != n)
    	{
    		pre = root;
    		root = root->next;
    	}
    	pre->next = root->next;
    }
    void printList(LNode *root)
    {
    	printf("----\n");
    	int i = 0;
    	while (root != NULL)
    	{
    		printf("node %d -> %d\n", i, root->num);
    		root = root->next;
    		i++;
    	}
    }
    
    int main()
    {
    	int n, position;
    	printf("请输入插入/删除的数,及插入的位置,位置最大为:%d\n", COUNT);
    	scanf("%d %d", &n, &position);
    	LNode *head = create(COUNT);
    	printList(head->next);
    	insert(n, position, head->next);
    	printList(head->next);
    	del(n, head->next);
    	printList(head->next);
    	return 0;
    }
    
    

    运行截图:

    C语言程序设计第五版谭浩强习题答案第九题答案

    10.已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并, 按学号升序排列。

    解题思路及答案:

    首先合并两个链表,然后采用选择排序,给合并之后的链表进行排序。

    #include <stdio.h>
    typedef struct student
    {
        int num;
        double grade;
        struct student *next;
    } student;
    
    student *merge(student *a, student *b)
    {
        //先合并,后排序
        student *head = a;
        while (a->next != NULL)
        {
            a = a->next;
        }
        a->next = b;
    	//选择排序,每次选最小的,放在未排序的链表头部
        student *pre;
        pre = head;
        while (pre->next != NULL)
        {
            a = pre->next;
            while (a != NULL)
            {
                if (pre->num > a->num)
                {
                    int num = pre->num;
                    double grade = pre->grade;
                    pre->num = a->num;
                    pre->grade = a->grade;
                    a->num = num;
                    a->grade = grade;
                }
                a = a->next;
            }
            pre = pre->next;
        }
        return head;
    }
    int main()
    {
        student a[3] = {{1, 79}, {4, 36}, {5, 79}};
        for (int i = 0; i < 2; i++)
        {
            a[i].next = &a[i + 1];
        }
    
        student b[2] = {{2, 38}, {6, 98}};
        for (int i = 0; i < 1; i++)
        {
            b[i].next = &b[i + 1];
        }
        student *combine = merge(a, b);
        while (combine != NULL)
        {
            printf("%d -> %.2lf\n", combine->num, combine->grade);
            combine = combine->next;
        }
    
        return 0;
    }
    

    运行截图:

    C语言程序设计第五版答案

    11.有两个链表a和b,设结点中包含学号、姓名。从a链表中删去与b链表中有相同学号的那些结点。

    解题思路及答案:

    对于b链表中的每一个节点,都从a链表的表头开始查找,如果可以找到,直接删除,如果找不到,继续从a链表表头找下一个b的节点。

    #include <stdio.h>
    typedef struct student
    {
    	int num;
    	double grade;
    	struct student *next;
    } student;
    student *del(student *a, student *b)
    {
    	student *pre, *current, *head;
    	head = a;
    
    	while (b != NULL)
    	{
    		//重置指针指向a链表的头部
    		pre = head;
    		current = head->next;
    		//a 链表的头等于b
    		if (pre->num == b->num)
    		{
    			pre->next = NULL;
    			pre = current;
    			current = current->next;
    			//更新表头
    			head = pre;
    		}
    		else
    		{
    			while (pre->next != NULL)
    			{
    				if (current->num == b->num)
    				{
    					//找到就删除
    					pre->next = current->next;
    					break;
    				}
    				else
    				{
    					//否则继续遍历
    					pre = pre->next;
    					current = current->next;
    				}
    			}
    		}
    		b = b->next;
    	}
    	return head;
    }
    
    void printList(student *root)
    {
    	printf("----\n");
    	int i = 0;
    	while (root != NULL)
    	{
    		printf("student %d -> %d -> %.2lf\n", i, root->num, root->grade);
    		root = root->next;
    		i++;
    	}
    }
    
    int main()
    {
    	student a[3] = { { 1, 79 }, { 4, 36 }, { 5, 79 } };
    	for (int i = 0; i < 2; i++)
    	{
    		a[i].next = &a[i + 1];
    	}
    	a[2].next = NULL;
    	printf("链表a:\n");
    	printList(&a[0]);
    
    	student b[2] = { { 5, 38 }, { 4, 98 } };
    	for (int i = 0; i < 1; i++)
    	{
    		b[i].next = &b[i + 1];
    	}
    	b[1].next = NULL;
    	printf("链表b:\n");
    	printList(&b[0]);
    	student *combine = del(a, b);
    	printf("删除之后:\n");
    	while (combine != NULL)
    	{
    		printf("%d -> %.2lf\n", combine->num, combine->grade);
    		combine = combine->next;
    	}
    
    	return 0;
    }
    

    运行截图:
    谭浩强课后习题答案

    12.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

    #include <stdio.h>
    #include <stdio.h>
    typedef struct student
    {
    	int num;
    	char sex[10];
    	char name[100];
    	int age;
    	struct student *next;
    } student;
    
    void printList(student *root)
    {
    	printf("----\n");
    	while (root != NULL)
    	{
    		printf("num:%d, sex: %s, name: %s, age: %d\n", root->num, root->sex, root->name, root->age);
    		root = root->next;
    	}
    }
    
    int main()
    {
    	student a[] = { { 1, "woman", "apple", 12 }, { 4, "woman", "banbana", 36 }, { 5, "man", "candy", 79 }, { 5, "man", "danny", 36 }, { 4, "man", "enjoy", 98 } };
    	for (int i = 0; i < 4; i++)
    	{
    		a[i].next = &a[i + 1];
    	}
    	a[4].next = NULL;
    
    	printList(&a[0]);
    
    	int n;
    	printf("请输入要删除的年龄:\n");
    	scanf("%d", &n);
    	student *pre = a, *current = a->next, *head;
    
    	head = a;
    	while (current != NULL)
    	{
    		//如果头结点需要删除,则更新头结点
    		if (head->age == n)
    		{
    			pre->next = NULL;
    			pre = current;
    			current = current->next;
    			head = pre;
    		}
    		else
    		{
    			//删除节点,重新链接
    			if (current->age == n)
    			{
    				pre->next = current->next;
    			}
    			pre = current;
    			current = current->next;
    		}
    	}
    	printList(head);
    
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    C语言程序设计第五版谭浩强更多答案

    [C语言程序设计第五版谭浩强课后答案 第八章习题答案]
    (https://blog.csdn.net/gjggj/article/details/106998697)

    展开全文
  • C语言程序设计第五版谭浩强 第七章答案

    万次阅读 多人点赞 2019-06-16 18:22:35
    C语言程序设计第五版谭浩强著 第七章答案 1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 如有问题欢迎下方留言评论 #include<stdio.h> ...

    C语言程序设计第五版谭浩强著 第七章答案

    在这里插入图片描述

    第七章 用函数实现模块化程序设计

    1、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输人。

    题目解析:

    • 该题直接使用“辗转相除法”来求解最大公约数和最小公倍数

    • 最大公约数找出两数中的最小值,然后直接相模,当能够同时被两数整除时,则为最大公约数。

    • 最小公倍数找出两数中的最大值,然后直接进入死循环,直到找到一个数能够同时被两数整除时,则为最小公倍数

    【注】此题还有一些比较高级的解法,比如求最大公约数的相减法、欧几里德辗转相除法等,有兴趣的同学可以查询相关资料

    代码示例:

    #include<stdio.h>
    
    //最大公约数
    size_t GCD(size_t a, size_t b)
    {      
    	
    	size_t gcd;      
    	gcd = a > b ? b : a;
    	while(gcd > 1)  
    	{
    		if((a % gcd == 0) && (b % gcd == 0))   
    			return gcd; 
    		gcd--; 
    	}
    	return gcd;
    }
    
    //最小公倍数
    size_t LCM(size_t a, size_t b)
    {
    	size_t lcm;
    	lcm = a > b ? a : b;
    	while(1)
    	{
    		if((lcm % a==0) && (lcm % b==0))
    			break;
    		lcm++;
    	}
    	return lcm;
    }
    
    int main()
    {
    	size_t a, b, result;
    	printf("请输入两个整数:>");
    	scanf("%d %d", &a, &b);
    
    	result = GCD(a, b);
    	printf("%d和%d的最大公约数为:%d\n", a, b, result);
    	result = LCM(a, b);
    	printf("%d和%d的最小公倍数为:%d\n", a, b, result);
    
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案第一题

    2、求方程 a x 2 + b x + c = 0 {ax}^2+bx+c=0 ax2+bx+c=0的根,用3个函数分别求当: b 2 − 4 a c b^2-4ac b24ac大于0、等于0和小于0时的根并输出结果。从主函数输入a,b,c的值。

    题目解析

    • 根据disc = b 2 − 4 a c b^2-4ac b24ac 的值来决定如何求根,题目本身编程不难,不过需要同学们复习一下高中的数学知识哦。

    代码示例

    #include<stdio.h>
    #include<math.h>
    
    //x1为第一个根,x2为第二个根
    float x1, x2, disc, p, q;
    
    void greater_than_zero(float a, float b)
    {
    	float m = sqrt(disc);
    	x1 = (-b + sqrt(disc)) / (2 * a);
    	x2 = (-b - sqrt(disc)) / (2 * a);
    }
    
    void equal_to_zero(float a, float b)
    {
    	x1 = x2 = (-b) / (2 * a);
    }
    
    void smaller_than_zero(float a, float b)
    {
    	p = -b / (2 * a);
    	q = sqrt(-disc) / (2 * a);
    }
    
    int main()
    {
    	int a, b, c;
    	printf("请输入 a b c:");
    	scanf("%d %d %d", &a, &b, &c);
    
    	printf("表达式为: %d*x^2+%d*x+%d = 0\n", a, b, c);
    	disc = b*b - 4 * a*c;
    
    	if (disc > 0)
    	{
    		greater_than_zero(a, b);
    		printf("disc>0的根为: x1=%f    x2=%f\n", x1, x2);
    	}
    	else if (disc == 0)
    	{
    		equal_to_zero(a, b);
    		printf("disc==0的根为:x1=%f    x2=%f\n", x1, x2);
    	}
    	else
    	{
    		smaller_than_zero(a, b);
    		printf("disc<0的根为:x1=%f+%f x2=%f-%f\n", p, q, p, q);
    	}
    	return 0;
    }
    

    运行结果:

    课后答案

    3、写一个判素数的函数,在主函数输人一个整数,输出是否为素数的信息。

    题目解析:

    • 素数是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数

    • 该题可以使用概念直接判断法求解,不过不需要判断所有的数据,只需要判断数据的一半即可,因为偶数不可能为素数(除了2),所以只需判断该数的一半即可的到答案

    代码示例:

    #include<stdio.h>
    #include<stdbool.h>
    
    bool IsPrime(int value)
    {
    	for(int i=2; i<value/2; ++i)
    	{
    		if(value % i == 0) //说明除了1和本身之外,还能被其他数整除
    			return false;
    	}
    	return true;
    }
    
    int main()
    {
    	int value;
    	bool flag;
    	printf("请输入 value :>");
    	scanf("%d", &value);
    	
    	flag = IsPrime(value);
    	if(flag)
    		printf("%d 是素数.\n", value);
    	else
    		printf("%d 不是素数.\n", value);
    
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强课后答案

    4、写一个函数,使给定的一个3X3的二维整型数组转置,即行列互换。

    题目解析:

    进行数组的行列互换,其关键在于数组互换的表达式 ar[i] [j] = ar[j] [i];其次在循环的时候,内层循环不能到达最大列,需要根据此时是第几行的交换来决定循环的次数,否则有可能数组行列交换之后最后又交换回原来的形状了。

    代码示例

    #include<stdio.h>
    
    void PrintArray(int ar[3][3])
    {
    	for(int i=0; i<3; ++i)
    	{
    		for(int j=0; j<3; ++j)
    		{
    			printf("%d ", ar[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    void ReverseArray(int ar[3][3])
    {
    	int tmp;
    	for(int i=0; i<3; ++i)
    	{
    		for(int j=0; j<i; ++j)
    		{
    			if(i != j) //中间数不发生变化
    			{
    				//交换两个数
    				tmp = ar[i][j];
    				ar[i][j] = ar[j][i];
    				ar[j][i] = tmp;
    			}
    			
    		}
    	}
    }
    
    int main()
    {
    	int array[3][3] = 
    	{
    		{1,2,3},
    		{4,5,6},
    		{7,8,9}
    	};
    
    	printf("转置前:\n");
    	PrintArray(array);
    
    	//进行数组转置
    	ReverseArray(array);
    
    	printf("转置后:\n");
    	PrintArray(array);
    
    	return 0;
    }
    

    运行结果:

    C语言程序设计第五版课后答案

    5、写一个函数,使输人的一个字符串按反序存放,在主函数中输入和输出字符串。

    题目解析及答案:

    • 要把一个字符串反序存放,其实就是对字符串做一个逆序操作,操作过程为收尾字符交换,直到把所有字符全部交换完毕。

    示例代码

    #include<stdio.h>
    
    void ReverseString(char str[])
    {
    	int start, end;
    	char tmp;
    	start = 0;
    	end = strlen(str)-1; //字符数组小标从0开始,所以-1
    	while(start < end)
    	{
    		tmp = str[start];
    		str[start] = str[end];
    		str[end] = tmp;
    
    		start++;
    		end--;
    	}
    }
    
    int main()
    {
    	char str[100] = {0};
    	printf("请输入一个字符串:>");
    	scanf("%s", str);
    	printf("原始字符串为:> %s\n", str);
    	ReverseString(str);
    	printf("反序字符串为:> %s\n", str);
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    6、写一个函数,将两个字符串连接。

    题目解析及答案:

    • 利用一个临时数组,空间要保证能够容纳两个字符串,先把第一个字符串进行拷贝到临时数组,第二个字符串在临时数组的尾部接着链接,最后记得加上字符串的结束标记\0即可

    代码示例:

    #include<stdio.h>
    
    void ConcatStr(char string1[], char string2[], char string[])
    {
    	int i, j;
    	for (i = 0; string1[i] != '\0'; i++)
    		string[i] = string1[i];
    	
    	//找到字符串末尾,继续往后面链接字符串
    	for (j = 0; string2[j] != '\0'; j++)
    		string[i + j] = string2[j];
    
    	//字符串末尾加上结束符 \0
    	string[i + j] = '\0';
    }
    
    int main()
    {
    	char s1[200] = {0}, s2[100]= {0}, s[100] = {0};
    	printf("input string1:");
    	scanf("%s", s1);
    	printf("input string2:");
    	scanf("%s", s2);
    	ConcatStr(s1, s2, s);
    	printf("\nThe new string is %s\n", s);
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    7、写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。

    题目解析:

    • 该题的重点在于元音字母的判断,通过或条件,凡是元音字母都进行拷贝

    代码示例:

    #include<stdio.h>
    
    void cpy(char s[], char c[])
    {
    	int i, j;
    	for (i = 0, j = 0; s[i] != '\0'; i++)
    	{
    		//判断元音字母
    		if (s[i] == 'a' || s[i] == 'A' || s[i] == 'e' || s[i] == 'E' || 
    			s[i] == 'i' ||s[i] == 'I' || s[i] == 'o' || s[i] == 'O' ||
                s[i] == 'u' || s[i] == 'U')
    		{
    			c[j] = s[i];
    			j++;
    		}
    	}
    	c[j] = '\0';
    }
    
    int main()
    {
    	char str[80], c[80];
    	printf("input string:");
    	gets(str);
    	cpy(str, c); //将str中的元音字母拷贝到c中
    	printf("The vowel letters are:%s\n", c);
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    8、写一个函数,输人一个4位数字,要求输出这4个数字字符,但每两个数字间空一个空格。如输人1990,应输出“1 9 9 0”。

    题目解析:

    对字符串进行遍历输出,没输出一个字符,后面就跟着输出一个空格,关键点在于如果输出的是最后一个字符,则不能在输出字符,所以要对是否是最后一个字符的输出进行判断。

    代码示例:

    #include<stdio.h>
    
    void OutString(char str[])
    {
    	int i = 0;
    	while(str[i] != '\0')
    	{
    		printf("%c", str[i]);
    		if(str[i+1] == '\0') //清除最后一个空格不输出
    			break;
    		printf("%c", ' ');
    		i++;
    	}
    	printf("\n");
    }
    int main()
    {
    	char str[5] = {0};
    	printf("input four digits:");
    	scanf("%s", str);
    	OutString(str);
    
    	return 0;
    }
    

    运行结果:

    C语言程序设计第五版课后答案谭浩强

    9、编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输人字符串以及输出上述的结果。

    题目解析:

    • 该题的关键在于要能够写出各种字符统计的条件

    代码示例:

    #include<stdio.h>
    
    int letter, digit, space, others;
    
    void CountChar(char str[])
    {
    	int i;
    	for (i = 0; str[i] != '\0'; i++)
    	{
            //统计字母
    		if ((str[i] >= 'a'&& str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z')) 
    			letter++;
    		else if (str[i] >= '0' && str[i] <= '9') //统计数字
    			digit++;
    		else if (str[i] == ' ')//统计空格
    			space++;
    		else
    			others++;  //统计其他字符
    	}
    }
    
    int main()
    {
    	char text[80];
    	printf("input string:\n");
    	gets(text);
    	printf("string: %s\n", text);
    
    	CountChar(text);
    	printf("\nletter:%d\ndigit:%d\nspace:%d\nothers:%d\n", letter, digit, space, others);
    	return 0;
    }
    

    运行结果:

    C语言程序设计第五版课后习题答案

    10、写一个函数,输人一行字符,将此字符串中最长的单词输出。

    题目解析及答案:

    • 单词以空格进行分隔,因此寻找空格出现的位置即为关键,每次从单词的起始到空格出现的位置即为一个单词,此时计算单词的长度,如果比当前最大的还长,就进行跟新最长单词信息,当整个字符串遍历完成,word即保存最长字符串。

    代码示例:

    #include<stdio.h>
    #include<string.h>
    
    void LongestWord(char str[], char word[])
    {
    	int max_len = 0;
    	int len = 0;
    	int i = 0;
    	while(str[i] != '\0')
    	{
    		if(str[i] == ' ')
    		{
    			str[i] = '\0';
    			len = strlen(str);
    			if(len > max_len)
    			{
    				max_len  = len;
    				strcpy(word, str);
    				str = str + len + 1;
    			}
    		}
    		i++;
    	}
    }
    
    int main()
    {
    	char line[100] = {0};
    	char word[100] = {0};
    	printf("input one line:\n");
    	gets(line);
    
    	LongestWord(line, word);
    
    	printf("The longest word is : %s\n", word);
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案第10题

    11、写一个函数,用“起泡法”对输人的10个字符按由小到大顺序排列。

    题目解析及答案:

    • 该题主要是对冒泡排序的理解,外层循环控制排序的趟数,内层循环主要是进行每一趟排序的比较,如果前面的字符大于后面的字符,就进行交换,每做一趟排序,就把一个最大字符排在最后,以及每做一趟排序就需要少比较一个字符。

    代码示例:

    #include<stdio.h>
    #include<string.h>
    
    void BubbleSort(char str[])
    {
    	int i, j;
    	char tmp;
    	int len = strlen(str);
    	for(i=0; i<len-1; ++i)
    	{
    		for(j=0; j<len-i-1; ++j)
    		{
    			if(str[j] > str[j+1])
    			{
    				tmp = str[j];
    				str[j] = str[j+1];
    				str[j+1] = tmp;
    			}
    		}
    	}
    }
    
    int main()
    {
    	int i;
    	char str[11] = {0};
    	printf("请输入10个字符:>");
    	for(i=0; i<10; ++i)
    		scanf("%c", &str[i]);
    
    	BubbleSort(str);
    
    	printf("string sorted: %s\n", str);
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案第12题

    12、用牛顿迭代法求根。方程为 a x 3 + b x 2 + c x + d = 0 ax^3+bx^2 +cx+d=0 ax3+bx2+cx+d=0,系数a,b,c,d的值依次为1,2,3,4,由主函数输人。求x在1附近的一个实根。求出根后由主函数输出。

    题目解析及答案:

    • 此题的难点并不是编程,主要是要理解数学公式的求解方法,理解之后代码的实现并不困难。

    代码示例:

    #include<stdio.h>
    #include<math.h>
    
    float solut(int a, int b, int c, int d)
    {
    	float x = 1, x0, f, f1;
    	do
    	{
    		x0 = x;
    		f = ((a*x0 + b)*x0 + c)*x0 + d;
    		f1 = (3 * a*x0 + 2 * b)*x0 + c;
    		x = x0 - f / f1;
    	} while (fabs(x - x0) >= 1e-3);
    	return(x);
    }
    
    int main()
    {
    	int a, b, c, d;
    	printf("input a,b,c,d:");
    	scanf("%d %d %d %d", &a, &b, &c, &d);
    	printf("x=%10.7f\n", solut(a, b, c, d));
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    13.用递归方法求n阶勒让德多项式的值,递归公式为

    C语言程序设计谭浩强第五版课后答案 第七章公式

    题目解析及答案:

    • 递归函数的设计,有一个点非常重要,那就是必须要有返回条件,,此题中的返回条件即为n0和n1时,因为当n为这两值时,程序直接返回相应的值,只有n>=1时,才进行递归运算。

    代码示例:

    #include<stdio.h>
    
    double polya(int n,int x)
    {
    	double result; 
    	if(n == 0)  
    		result = 1;  
    	if(n == 1)
    		result = x; 
    	if(n>1)
    		result = ((2*n-1)*x*polya(n-1,x)-(n-1)*polya(n-2,x))/n;    
    	return result;
    }
    
    int main()
    { 
    	int x,n; 
    	scanf("%d %d", &n, &x); 
    	printf("%.2f\n", polya(n,x)); 
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    14、输人10个学生5门课的成绩,分别用函数实现下列功能:

    ①计算每个学生的平均分;
    ②计算每门课的平均分;
    ③找出所有50个分数中最高的分数所对应的学生和课程;
    ④计算平均分方差:

    其中,x;为某一学生的平均分。

    题目解析及答案:

    • 此题的关键是如何存储某个学生对应某门课程的分数,这里利用了一个二维数组score,其中score[i] [j]就代表了第i个学生的第j门课程的分数,只要能够理解这个存储方式,其余的计算就是比较容易理解和实现的。

    代码示例:

    #include<stdio.h>
    
    #define N 10
    #define M 5
    float score[N][M];
    float a_stu[N], a_cour[M];
    int r, c;
    
    //输入学生成绩信息函数
    void input_stu(void)
    {
    	int i, j;
    	for (i = 0; i < N; i++)
    	{
    		printf("\ninput score of student%2d:\n", i + 1);
    		for (j = 0; j < M; j++)
    			scanf("%f", &score[i][j]);
    	}
    }
    
    //每个学生平均分
    void aver_stu(void)
    {
    	int i, j;
    	float s;
    	for (i = 0; i < N; i++)
    	{
    		for (j = 0, s = 0; j < M; j++)
    			s += score[i][j];
    		a_stu[i] = s / 5.0;
    	}
    }
    
    //每门课程平均分
    void aver_cour(void)
    {
    	int i, j;
    	float s;
    	for (j = 0; j < M; j++)
    	{
    		s = 0;
    		for (i = 0; i < N; i++)
    			s += score[i][j];
    		a_cour[j] = s / (float)N;
    	}
    }
    
    //最高分函数
    float highest()
    {
    	float high;
    	int i, j;
    	high = score[0][0];
    	for (i = 0; i < N; i++)
    	for (j = 0; j<M; j++)
    	if (score[i][j]>high)
    	{
    		high = score[i][j];
    		r = i + 1;
    		c = j + 1;
    	}
    	return(high);
    }
    
    //方差函数
    float s_var(void)
    {
    	int i;
    	float sumx, sumxn;
    	sumx = 0.0;
    	sumxn = 0.0;
    	for (i = 0; i < N; i++)
    	{
    		sumx += a_stu[i] * a_stu[i];
    		sumxn += a_stu[i];
    	}
    	return(sumx / N - (sumxn / N)*(sumxn / N));
    }
    
    int main()
    {
    	int i, j;
    	float h;
    	input_stu();
    	aver_stu();
    	aver_cour();
    	printf("\n  NO.     cour1   cour2   cour3   cour4   cour5   aver\n");
    	for (i = 0; i < N; i++)
    	{
    		printf("\n NO %2d ", i + 1);
    		for (j = 0; j < M; j++)
    			printf("%8.2f", score[i][j]);
    		printf("%8.2f\n", a_stu[i]);
    	}
    	printf("\naverage:");
    	for (j = 0; j < M; j++)
    		printf("%8.2f", a_cour[j]);
    	printf("\n");
    	h = highest();
    	printf("highest:%7.2f   NO. %2d   course %2d\n", h, r, c);
    	printf("variance %8.2f\n", s_var());
    	return 0;
    }
    

    运行结果:

    习题答案
    谭浩强课后答案

    15、写几个函数:

    • ①输人10个职工的姓名和职工号;
      ②按职工号由小到大顺序排序,姓名顺序也随之调整;
      ③要求输人一个职工号,用折半查找法找出该职工的姓名,从主函数输人要查找的职工号,输出该职工姓名。

    题目解析及答案:

    利用二分查找的关键在于数据一定要先有序,所以在查找前我们需要对数据进行排序。

    代码示例:

    #include<stdio.h>
    
    #define N 10
    
    void input(int num[], char name[N][8])
    {
    	int i;
    	for (i = 0; i < N; i++)
    	{
    		printf("input NO.: ");
    		scanf("%d", &num[i]);
    		printf("input name: ");
    		getchar();
    		gets(name[i]);
    	}
    }
    
    void sort(int num[], char name[N][8])
    {
    	int i, j, min, templ;
    	char temp2[8];
    	for (i = 0; i < N - 1; i++)
    	{
    		min = i;
    		for (j = i; j<N; j++)
    		if (num[min]>num[j])  min = j;
    		templ = num[i];
    		strcpy(temp2, name[i]);
    		num[i] = num[min];
    		strcpy(name[i], name[min]);
    		num[min] = templ;
    		strcpy(name[min], temp2);
    	}
    	printf("\n result:\n");
    	for (i = 0; i < N; i++)
    		printf("\n %5d%10s", num[i], name[i]);
    }
    
    void search(int n, int num[], char name[N][8])
    {
    	int top, bott, mid, loca, sign;
    	top = 0;
    	bott = N - 1;
    	loca = 0;
    	sign = 1;
    	if ((n<num[0]) || (n>num[N - 1]))
    		loca = -1;
    	while ((sign == 1) && (top <= bott))
    	{
    		mid = (bott + top) / 2;
    		if (n == num[mid])
    		{
    			loca = mid;
    			printf("NO. %d , his name is %s.\n", n, name[loca]);
    			sign = -1;
    		}
    		else if (n < num[mid])
    			bott = mid - 1;
    		else
    			top = mid + 1;
    	}
    	if (sign == 1 || loca == -1)
    		printf("%d not been found.\n", n);
    }
    
    int main()
    {
    	int num[N], number, flag = 1, c;
    	char name[N][8];
    
    	input(num, name);
    	sort(num, name);
    
    	while (flag == 1)
    	{
    		printf("\ninput number to look for:");
    		scanf("%d", &number);
    		search(number, num, name);
    		printf("continue ot not(Y/N)?");
    		getchar();
    		c = getchar();
    		if (c == 'N' || c == 'n')
    			flag = 0;
    	}
    	return 0;
    }
    

    运行结果:

    课后习题答案
    c语言课后题答案

    16、写一个函数,输人一个十六进制数,输出相应的十进制数。

    题目解析及答案:

    • 转换的过程需要乘的基数为16,其次注意十六进制中的a~f的字母转换,并且无论大小写都要能够转换。

    代码示例:

    #include<stdio.h>
    
    size_t HextoDec(char s[])
    {
    	size_t i, n;
    	n = 0;
    	for (i = 0; s[i] != '\0'; i++)
    	{
    		if (s[i] >= '0'&& s[i] <= '9')
    			n = n * 16 + s[i] - '0';
    		if (s[i] >= 'a' && s[i] <= 'f')
    			n = n * 16 + s[i] - 'a' + 10;
    		if (s[i] >= 'A' && s[i] <= 'F')
    			n = n * 16 + s[i] - 'A' + 10;
    	}
    	return n;
    }
    
    int main()
    {
    	size_t result = 0;
    	char hex[9] = {0}; 
    	printf("input a HEX number:");
    	scanf("%s", hex);
    
    	result = HextoDec(hex);
    	printf("0x%s = %u\n", hex, result);
    	
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    17、用递归法将一个整数n转换成字符串。例如,输人483,应输出字符串”483”。n的位数不确定,可以是任意位数的整数。

    题目解析及答案:

    • 递归法求解主要要有结束条件,此题为n/10 == 0时就直接输出,其次本题还要考虑如果整数位负数的情形,此时需要输出一个字符串的负号。
    #include<stdio.h>
    
    void Convert(int n)
    {
    	int i;
    	if ((i = n / 10) != 0)
    		Convert(i);
    	putchar(n % 10 + '0');
    }
    
    int main()
    {
    	int number;
    	printf("input an integer: ");
    	scanf("%d", &number);
    	printf("output: ");
    	if (number < 0)
    	{
    		putchar('-');   //先输出一个负号'-'
    		number = -number;
    	}
    	Convert(number);
    	printf("\n");
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后答案

    18、给出年、月、日,计算该日是该年的第几天。

    题目解析:

    • 此题采用枚举法进行每月天数的累加,其中关键点注意需要判断年份是否为闰年,如果是还需要多累加1天。

    代码示例:

    #include <stdio.h>
    #include<stdio.h>
    
    /* 函数sum_day:计算日期 */
    int sum_day(int month, int day)        
    {
    	int day_tab[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    	int i;
    	for (i = 1; i < month; i++)
    		day += day_tab[i];      /* 累加所在月之前天数 */
    	return day;
    }                         
    
    /* 函数leap:判断是否为闰年 */
    int leap(int year)
    {
    	int leap;
    	leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    	return leap;
    }
    
    int main()
    {
    	int year, month, day, days;
    	printf("input date(year,month,day):");
    	scanf("%d %d %d", &year, &month, &day);
    	printf("%d/%d/%d ", year, month, day);
    	days = sum_day(month, day);                  /* 调用函数sum_day */
    	if (leap(year) && month >= 3)                  /* 调用函数leap */
    		days = days + 1;
    	printf("is the %dth day in this year.\n", days);
    	return 0;
    }
    

    运行结果:

    C语言程序设计谭浩强第五版课后习题答案

    C语言程序设计第五版谭浩强 第七章答案

    更多C语言程序设计谭浩强第五版课后答案

    谭浩强C语言程序设计第五版 第六章答案

    展开全文
  • 第五章 1.请画出例5.6中给出的3个程序段的流程图 流程图1: 流程图2: 流程图3: 2.请补充例5. 7程序,分别统计当“fabs(t)>= le- 6”和“fabs(t)> = le- 8”时执行循环体的次数。 fabs(t)>= le- 6 ,...

    第五章

    1.请画出例5.6中给出的3个程序段的流程图

    流程图1:

    C语言程序设计第五版谭浩强课后答案第一题

    流程图2:

    C语言程序设计第五版谭浩强第二题课后答案

    流程图3:

    C语言程序设计第五版谭浩强课后答案第一题

    2.请补充例5. 7程序,分别统计当“fabs(t)>= le- 6”和“fabs(t)> = le- 8”时执行循环体的次数。

    fabs(t)>= le- 6 ,示例代码

    # include <stdio.h>
    # include <math.h>
    
    int main()
    {
    	int sign = 1;
    	double pi = 0.0, term = 1.0;
    	int n = 0;
    
    	while (fabs(term) >= 1e-6)
    	{
    		n++;
    		term = 1.0 / (2 * n - 1)*sign;
    		pi += term;
    		sign = -sign;
    	}
    	pi *= 4;
    	printf("pi的近似值是%lf\n", pi);
    	printf("循环体循环了%d次\n", n);
    	return 0;
    }
    
    

    运行截图:

    C语言程序设计第五版第二题答案

    fabs(t)> = le- 8,示例代码

    # include <stdio.h>
    # include <math.h>
    
    int main()
    {
    	int sign = 1;
    	double pi = 0.0, term = 1.0;
    	int n = 0;
    
    	while (fabs(term) >= 1e-8)
    	{
    		n++;
    		term = 1.0 / (2 * n - 1)*sign;
    		pi += term;
    		sign = -sign;
    	}
    	pi *= 4;
    	printf("pi的近似值是%lf\n", pi);
    	printf("循环体循环了%d次\n", n);
    	return 0;
    }
    
    

    运行截图:

    C语言程序设计第2题答案

    3.输人两个正整数m和n,求其最大公约数和最小公倍数

    答案解析:

    该题题目直接使用“辗转相除法”来求解最大公约数,以除数和余数反复做除法运算,当余数为 0 时,就取得当前算式除数为最大公约数。

    最大公约数和最小公倍数之间的性质:两个自然数的乘积等于这两个自然数的最大公约数和最小公倍数的乘积。所以,当我们求出最大公约数,就可以很轻松的求出最小公倍数。

    代码示例:

    #include <stdio.h>
    int main()
    {
    	int  p, r, n, m, temp;
    	printf("请输入两个正整数n,m:");
    	scanf("%d%d,", &n, &m);
    	//调整n保存较大的值
    	if (n < m)
    	{
    		temp = n;
    		n = m;
    		m = temp;
    	}
    
    	p = n * m;
    	while (m != 0)
    	{
    		r = n % m;
    		n = m;
    		m = r;
    	}
    	printf("它们的最大公约数为:%d\n", n);
    	printf("它们的最小公倍数为:%d\n", p / n);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    4.输人一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

    答案解析:

    该题可以调用getchar函数,从stdin流中读入一个字符,当输入多个字符时,getchar()再执行时就会直接从缓冲区中读取了。等同于getc(stdin)。所以,我们循环调用getchar,直到将标准输入的内容读到换行符\n为止。同时判断,读取到的字符是英文字母、空格、数字或者其他字符,并计数;

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	char c;
    	//定义eng_char为英文字母的个数,初始值为0
    	//定义space_char为空格字符的个数,初始值为0
    	//定义digit_char为数字字符的个数,初始值为0
    	//定义other_char为其他字符的个数,初始值为0
    	int eng_char = 0, space_char = 0, digit_char = 0, other_char = 0;
    	printf("请输入一行字符:");
    	while ((c = getchar()) != '\n')
    	{
    		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
    		{
    			eng_char++;
    		}
    		else if (c == ' ')
    		{
    			space_char++;
    		}
    		else if (c >= '0' && c <= '9')
    		{
    			digit_char++;
    		}
    		else
    		{
    			other_char++;
    		}
    	}
    
    	printf("英文字母数量:%d\n空格数量:%d\n数字数量:%d\n其他字符数量:%d\n", eng_char, space_char, digit_char, other_char);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版第四题答案

    5.求 S n S_n Sn=a+aa+aaa+…+ a a + ⋯ + a ⏞ n 个 a \overbrace{aa+\dots+a}^{n个a} aa++a na 之值,其中a是一个数字,n表示a的位数,n由键盘输入。例如:

    2+22+222+2222+22222 (此时n=5)

    答案解析:

    该题目可以将数字拆分为 a * 10^n + 前一个数字,例如:

    2 = 2 * 10^0 + 0 : 默认2的前一个数字为0,也就是没有任何值

    22 = 2 * 10^1 + 2 : 22的前一个数字为2

    222 = 2*10^2 + 22 :222的前一个数字为22

    以此类推…

    所以,在每次循环的时候,需要保存下,上一次结果的值,方便下一次计算

    还需要使用到C库当中使用的pow函数,来计算某个数的n次方,我们在该题目当中使用的是10的n次方,n随着循环的次数,以此递增。

    代码示例:

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
    	//n为a的个数
    	int n;
    	double a, prev_sum = 0.0, total_sum = 0.0;
    	printf("请输入a的值以及n的值: ");
    	scanf("%lf %d", &a, &n);
    	//循环n次求总和
    	for (int i = 0; i < n; i++)
    	{
    		prev_sum += a * pow(10, i); 
    		total_sum += prev_sum;
    	}
    	printf("总和为:%lf\n", total_sum);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    6.求 ∑ n = 1 20 n ! \sum\limits_{n=1}^{20}n! n=120n! (即求1!+2!+3!+4!+…+20!)。

    答案解析:

    该题需要从1循环到20,依次求出每一个数字阶乘的结果。所以在代码当中需要有两个循环,大循环从1到20,保证1到20个数字都被循环到,小循环里计算N阶乘,累加求和。注意:对于20的阶乘已经超出了int类型能过表示的数字范围,所以在代码当中使用double类型

    代码示例:

    #include<stdio.h>
    
    int main()
    {
    	double total_sum = 0;
    	for(int i = 1; i <= 20; i++) 
    	{
    		double single_sum = 1;
    		for (int j = i; j > 0; j--)
    		{
    			single_sum *= j;
    		}
    		total_sum += single_sum;
    	}
    	printf("1~20每个数字阶乘总和为:%lf\n",total_sum);
    	return 0;
    }
    

    运行截图:

    C语言程序设计课后答案

    7. ∑ k = 1 100 k \sum\limits_{k=1}^{100}k k=1100k + ∑ k = 1 50 k 2 \sum\limits_{k=1}^{50}{k}^2 k=150k2 + ∑ k = 1 10 1 k \sum\limits_{k=1}^{10}{\frac{1}{k}} k=110k1

    答案解析:

    对于 ∑ k = 1 100 k \sum\limits_{k=1}^{100}k k=1100k而言,指的是求从1到100的和。每个数字为整数,求和也为整数

    对于 ∑ k = 1 50 k 2 \sum\limits_{k=1}^{50}{k}^2 k=150k2而言,指的是求从12到502的和。每个数字为整数,求和也为整数。

    对于 ∑ k = 1 10 1 k \sum\limits_{k=1}^{10}{\frac{1}{k}} k=110k1而言,指的是求从 1 1 \frac{1}{1} 11 1 10 \frac{1}{10} 101的和。每个数字不是整数,求和也不是整数。

    综上所述:求和结果不是整数,所以定义求和变量是需要定义为带有精度的变量double

    该题目,最大的求和是从从1到100,所以需要一个循环,从1遍历到100。针对第一种情况,则遍历100次停下来。针对第二种情况,则遍历50次的时候停下来,针对第三种情况,则遍历10遍就停下来。

    最后,在遍历每一个数字的时候,针对三种不同的情况求和。最后将三种不同请求的和加起来就是总体的和

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	double total_sum = 0, sum1 = 0, sum2 = 0, sum3 = 0.0;
    	for (int k = 1; k <= 100; k++)
    	{
    		sum1 += k;
    		//遍历50次就不在执行情况2
    		if (k <= 50)
    		{
    			sum2 += k * k;
    		}
    		//遍历10次就不在执行情况3
    		if (k <= 10)
    		{
    			sum3 += 1.0 / k;
    		}
    	}
    	total_sum = sum1 + sum2 + sum3;
    	printf("三种情况求和结果为:%lf\n", total_sum);
    	return 0;
    }
    

    运行截图:

    C语言程序设计课后答案

    8.输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是水仙花数,因为153=1*+5*+3。

    答案解析:

    从题目当中得到”水仙花数“为一个3位数,则范围确定为[100, 999]。另外需要获取该数字的百位数字,十位数字,个位数字相加起来等于该数本身,则我们需要使用到%除的方式,来获取每一个位权的数字。

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	 //a表示百位数字,b表示十位数字,c表示各位数字
    	int a, b, c;
    	for (int i = 100; i <= 999; i++)
    	{
    		a = i / 100;
    		b = (i / 10) % 10;
    		c = i % 10;
    		if (a * a * a + b * b * b + c * c * c == i)
    		{
    			printf("%d\n", i);
    		}
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    9.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:

    6 its factors are 1,2,3

    答案解析:

    因子:整数a除以整数b(b≠0) 的商正好是整数而没有余数,我们就说b是a的因子。整数n除以m,结果是无余数的整数,那么我们称m就是n的因子。 需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立。因子是不包括自身的

    举一个例子:20 = 4 * 5,则4和5就是20的因子,也被称之为因子

    代码示例:

    #include<stdio.h>
    
    int main()
    {
    	int data, fator, sum;      /* data表示要判断的数,fator表示因子,sum表示因子之和*/
    
    	for (data = 2; data <= 1000; data++)
    	{
    		//1是所有整数的因子,所以因子之和从1开始
    		sum = 1;
    		for (fator = 2; fator <= data / 2; fator++)
    		{
    			/* 判断data能否被fator整除,能的话fator即为因子  因子不包括自身 */
    			if (data % fator == 0)
    			{
    				sum += fator;
    			}
    		}
    		// 判断此数是否等于因子之和 */
    		if (sum == data)    
    		{
    			printf("%d its factors are 1, ", data);
    			for (fator = 2; fator <= data / 2; fator++)
    			{
    				if (data % fator == 0)
    				{
    					printf("%d, ", fator);
    				}
    			}
    			printf("\n");
    		}
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    10.有一个分数序列,求出这个数列的前20项之和。

    2 1 \frac{2}{1} 12 3 2 \frac{3}{2} 23 5 3 \frac{5}{3} 35 8 5 \frac{8}{5} 58 13 8 \frac{13}{8} 813 25 13 \frac{25}{13} 1325,…

    答案解析:

    从题目当中可以看出来,下一个分式当中的分子为上一个分式中分子和分母的和,分母为上一个分式的分子。通过这个规律不难推出下一个分式的分子和分母,需要注意的是,保存分式的结果不能使用到整数,因为有可能会有小数的存在,所以我们需要选用浮点数double

    代码示例:

    #include <stdio.h> 
    //定义循环次数
    #define COUNT 20
    
    int main()
    {
    	//定义第一个分式的分子为a, 值为2; 定义分母为b,值为1
    	//定义相加的和为sum,初始值为0
    	double a = 2, b = 1, sum = 0;
    	double temp;
    
    	for (int i = 0; i < COUNT; i++)
    	{
    		sum += a / b;
    		//记录前一项分子
    		temp = a;
    		//前一项分子与分母之和为后一项分子
    		a = a + b;
    		//前一项分子为后一项分母
    		b = temp;
    	}
    	printf("前%d项之和为:sum=%9.7f\n", COUNT, sum);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    11.一个球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高。

    答案解析:

    该题目需要循环10次,在每一循环的时候,需要将下落的高度和回弹的高度加起来。需要注意的点,第10次下落不需要在计算回弹的距离了,所以需要特殊处理下。在计算每次高度的时候,会有小数存在,所以需要选用浮点数

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	//总高度
    	double total_m = 100.0;
    	//小球经历的米数
    	double total_sum = 0.0;
    	for (int i = 0; i < 10; i++)
    	{
    		total_sum += total_m;
    		total_m /= 2;
    		total_sum += total_m;
    	}
    	//不需要计算第10次的反弹高度,所以减去
    	total_sum -= total_m;
    	printf("小球总共经历%lf米, 第10次反弹%lf米\n", total_sum, total_m);
    	return 0;
    }
    

    运行截图:

    谭浩强第十一题课后答案

    12.猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第1天共摘多少个桃子。

    答案解析:

    从题面上来看,可以推出,后一天的桃子数量 = 前一天桃子数量 / 2 - 1。所以,该公式也可以写成前一天的桃子数量 = (后一天桃子数量+1) * 2。所以我们知道了第10天剩余桃子的数量,则可以依次推算出桃子的前一天桃子的总数。需要注意的点,猴子只是吃了9天,所以,我们只需要遍历9次就可以了。

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	int day = 9;
    	int prev_day_count;
    	int cur_day_count = 1;
    	while (day > 0)
    	{
    		prev_day_count = (cur_day_count + 1) * 2;
    		cur_day_count = prev_day_count;
    		day--;
    	}
    	printf("total count : %d\n", cur_day_count);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    13.用迭代法求x= a \sqrt{a} a 。求平方根的迭代公式为

    x n + 1 x_{n+1} xn+1 = 1 2 \frac{1}{2} 21( x n x_{n} xn + a x n \frac{a}{x_n} xna)

    要求前后两次求出的x的差的绝对值小于 1 0 − 5 10^{-5} 105

    答案解析:

    题面上已经告诉两条信息,一个是x= a \sqrt{a} a ,所以我们可以通过a求出x的值。另外一条是 x n + 1 x_{n+1} xn+1 = 1 2 \frac{1}{2} 21( x n x_{n} xn + a x n \frac{a}{x_n} xna),可以通过x的值求出 x n + 1 x_{n+1} xn+1的值,所以,只需要轮询的计算,不断的计算差值,直到满足差值小于 1 0 − 5 10^{-5} 105就可以停止了

    代码示例:

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
    	float a, x0, x1;
    	printf("请输入一个正数: ");
    	scanf("%f", &a);
    	x0 = a / 2;
    	x1 = (x0 + a / x0) / 2;
    	do
    	{
    		x0 = x1;
    		x1 = (x0 + a / x0) / 2;
    	} while (fabs(x0 - x1) >= 1e-5);
    	printf("[%f] 的平方根为 [%f]\n", a, x1);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    14.用牛顿迭代法求下面方程在1.5附近的根:

    2 x 3 x^3 x3- 4 x 2 x^2 x2 + 3 x x x - 6= 0

    答案解析:

    牛顿迭代法的公式为:

    x n + 1 x_{n+1} xn+1 = x n x_{n} xn - f ( x n ) f ′ ( x n ) \frac{f(x_{n})}{f'(x_{n})} f(xn)f(xn)

    其中, x n x_{n} xn为输出的值,在该题目当中为1.5。 f ( x n ) f(x_{n}) f(xn)为公式2 x 3 x^3 x3- 4 x 2 x^2 x2 + 3 x x x - 6。 f ′ ( x n ) f'(x_{n}) f(xn)为导数,根据导数原则:

    规则1: x n x^n xn = n * x ( n − 1 ) x^{(n-1)} x(n1), 规则2:常数的导数为0。可以推导出 f ′ ( x n ) f'(x_{n}) f(xn) = 6 x 2 x^2 x2 - 8x + 3。

    在依照牛顿迭代法计算出 x n + 1 x_{n+1} xn+1的值,直到求出的差值小于0.00001

    代码示例:

    #include <stdio.h>
    #include <math.h>
    
    int  main()
    {
    	double x1, x0, f, f1;
    	x1 = 1.5;
    	do
    	{
    		x0 = x1;
    		f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
    		f1 = (6 * x0 - 8) * x0 + 3;
    		x1 = x0 - f / f1;
    	} while (fabs(x1 - x0) >= 1e-5);
    	printf("方程在1.5附近的根为:%lf\n", x1);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强习题答案

    15.用二分法求下面方程在(-10,10)的根:

    2 x 3 x^3 x3- 4 x 2 x^2 x2 + 3 x x x - 6= 0

    答案解析:

    将区间划分为两部分,记录区间左右端点,得到中点。每次运算将中点带入方程进行运算,求得结果,进行分析:

    结果 > 0:将中位数赋值给右端点

    结果 < 0:将中位数赋值给左端点

    以此类推…

    fabs函数是一个求绝对值的函数,求出x的绝对值,和数学上的概念相同;

    le-5: 1 0 − 5 10^{-5} 105,即0.00001

    代码示例:

    #include<stdio.h>
    #include<math.h>
    
    int main()
    {
    	double left = -10, right = 10, mid;
    	double temp = 10;
    	while (fabs(temp) > 1e-5)
    	{
    		mid = (left + right) / 2;
    		//((2x - 4)*x + 3) * x - 6 ==> 2x^3 - 4x^2 + 3x -6
    		temp = ((2 * mid - 4) * mid + 3) * mid - 6;
    
    		if (temp > 0)
    		{
    			right = mid;
    		}
    		else if (temp < 0)
    		{
    			left = mid;
    		}
    	}
    	printf("在(-10,10)的根为:%lf", mid);
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    16.输出以下图案:

    ​ *

    ​ ***

    *****

    *******

    *****

    ​ ***

    ​ *

    答案解析:

    该题目需要关心当前行对应的从最左边到第一颗*的空格数量以及星星数量。将该题分为两个部分,前面4行和后面3行来进行拆分。

    前4行中:

    第一行:行号为0, 空格数为3,星星数量为1;

    第二行:行号为1, 空格数为2, 星星数量为3;

    第三行:行号为2, 空格数为1, 星星数量为5;

    第四行:行号为3, 空格数为0,星星数量为7;

    则我们可以推出两组关系,即行号和空格数量关系为:空格数 = 3 - 行号 。行号与星星的关系为:星星数 = 2 * 行号 + 1

    后三行中:

    第一行:行号为0,空格数为1,星星数量为5;

    第二行:行号为1, 空格数为2, 星星数量为3;

    第三行:行号为2, 空格数为3,星星数量为1;

    则我们推出两组关系,即行号与数量的关系:空格数 = 行号 + 1。行号与星星的关系:星星数 = 7 - 2 * (行号+1)

    基于上面的关系,我们写出如下代码:

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	int cur_row, space_count, start_count;
    	//输出前4行内容
    	for (cur_row = 0; cur_row < 4; cur_row++)
    	{
    		//计算当前行空格数量,并且进行打印
    		for (space_count = 3 - cur_row; space_count > 0; space_count--)
    		{
    			printf(" ");
    		}
    		//计算当前行*数量,并且进行打印
    		for (start_count = 2 * cur_row + 1; start_count > 0; start_count--)
    		{
    			printf("*");
    		}
    		printf("\n") ;
    	}
    	//输出后三行
    	for (cur_row = 0; cur_row < 3; cur_row++)
    	{
    		for (space_count = cur_row + 1; space_count > 0; space_count--)
    		{
    			printf(" ");
    		}
    
    		for (start_count = 7 - 2 * (cur_row + 1); start_count > 0; start_count--)
    		{
    			printf("*");
    		}
    		printf("\n");
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    17.两个乒乓球队进行比赛,各出3人。甲队为A,B,C 3人,乙队为X,Y,Z 3人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单。

    答案解析:

    从题面上得知,每队为3人,则隐含条件为队内三人是不能比赛的,并且A一定不会和X比,C一定不会X和Z比;则我们不难写出判断条件:

    如果A和X比 或者 C和X比 或者 C和Z比 或者 A和B比 或者 A和C比 或者 B和C比,都是不可以的;所以我们只要穷举A比赛对象,B比赛对象,C比赛对象,判断上述条件就可以了;

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	int A_battle, B_battle, C_battle;
    	//如果A对战的对象从“X”到“Z”
    	for (A_battle = 'X'; A_battle <= 'Z'; A_battle++)
    	{
    		//如果B对战的对象从“X”到“Z”
    		for (B_battle = 'X'; B_battle <= 'Z'; B_battle++)
    		{
    			//如果C对战的对象从“X”到“Z”
    			for (C_battle = 'X'; C_battle <= 'Z'; C_battle++)
    			{
    				//去除限制条件
    				if (A_battle == 'X' || C_battle == 'X' || C_battle == 'Z' || B_battle == A_battle || B_battle == C_battle || A_battle == C_battle)
    				{
    					continue;
    				}
    				printf("A对%c,B对%c,C对%c", A_battle, B_battle, C_battle);
    			}
    		}
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强课后答案

    C语言程序设计第五版谭浩强更多习题答案

    C语言程序设计第五版谭浩强课后习题答案 第四章
    C语言程序设计第五版谭浩强课后习题答案 第三章

    展开全文
  • 谭浩强 C语言程序设计第五版 第六章 习题 答案

    万次阅读 多人点赞 2019-06-16 14:01:49
    谭浩强 C语言程序设计第五版 第六章 习题 答案 有问题可以在下方留言哦 1.用筛选法求100以内的素数。 #include <stdio.h> #include <math.h> int main() { int i,j,a[100],b[100]; for (i=1;i<=...
  • c语言程序设计第五版习题答案解析

    千次阅读 2020-12-21 03:10:28
    专业整理知识分享习题解析与答案1章C语言概述一.简答题1.概述C语言的主要特点。【解答】(1)语言简洁、紧凑,使用方便、灵活。(2)数据类型丰富,表达能力强。(3)运算符多样。C语言中的运算符包含的范围非常广泛。...
  • 课后练习题答案 Chapter 1 1.1 1.2 b c 1.3 ad 1.4 semicolon printf math.h \n Chapter 2 2.1 2.2 typedef 255 external const Chapter 3 3.1 3.2 integer modula 6 logical sizeof paratheses typeconversion ...
  • C语言程序设计第五版课后答案(谭浩强) ,部分截图如下 太多了,就不在一一复制,可以扫描最上面的二维码,关注微信公众“数据结构和算法”,回复"C语言第5版"的拼音简称cyyd5b即可获得下载地址 ...
  • C语言程序设计第五版谭浩强课后答案 最下方有所有答案的总目录 1.什么是文件型指针?通过文件指针访问文件有什么好处? 答:缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都...
  • 解析:C语言中这些东西太多了,这里只讲最常见的。 (1)算术运算最常见的有:加减乘除、自增、自减、取模 运算符(优先级):++、--; *、/、% ;+、- (2)关系运算最常见的是关系运算:大于、小于、等于、大于...
  • 鞍点是行上最大,列上最小的元素,因此对数组的i元素进行如下操作: 1、找到该行上最大元素,用max标记,并标记该元素所在列colindex 2、找colindex列上最小的元素,用min标记,并标记该元素所在行号rowindex 3、...
  • C语言程序设计谭浩强课后习题视频讲解C语言程序设计谭浩强课后习题答案
  • 32 字符数组的赋值 ? 将一个字符串赋值给一个字符数组 , 只能用在 初始化的情况下 , 不能用在赋值语句中 ? 例如 : ? char str[11]; ? str = I am happy ; 是错误的 .... 逐个字符 I/O %c ? 数组名 [ 下标 ] ?...
  • 解析:咱就说这题眼不眼熟吧(六章13题)还是两个方法:重建字符串或指针;直接放代码了嗷! plan A: void my_strcat(char*arr3, char* arr2, char* arr1, int len1, int len2) { for (int i = 0; i ; i++) { ...
  • C语言程序设计谭浩强第五版由谭浩强教授著、清华大学出版社出版的《C程序设计》经过近三十年一千多万读者的实践检验,被公认为学习C语言程序设计的经典教材,是学习c语言的必备教材,欢迎下载使用。 文件:...
  • #include&amp;lt;stdio.h&amp;gt; main() { int i,j,prime[101]; for(i=2;i&amp;lt;=100;i++) prime[i]=1; for(i=2;i*i&amp;lt;=100;i++) { if(prime[i]==1) ... ..
  • c语言程序设计第五版习题答案.doc
  • C语言程序设计第五版-谭浩强.ppt
  • C语言程序设计 李丽娟》pdf 附下载链接-附件资源
  • #include&amp;lt;stdio.h&amp;gt; main() { int a,b,c; scanf(&quot;%d%d%d&quot;,&amp;amp;a,&amp;amp;b,&amp;amp;c); if(a==b&amp;amp;&amp;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,817
精华内容 17,926
关键字:

c语言程序设计第五版

友情链接: 21.rar