谭浩强老师C预言第五版第四章(上)

本文介绍了C语言中的算术运算、关系运算和逻辑运算,包括它们的概念、运算符及其优先级,同时通过实例演示了如何在C语言中表示真伪值和处理逻辑表达式。此外,还探讨了如何处理用户输入验证,特别是针对输入范围和数据类型的有效性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文涉及循环概念,暂不做详细讲解

仅代表个人看法

如有错误请指正

题目1:什么是算术运算?什么是关系运算?什么是逻辑运算?

算术运算:

算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。

其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果有多级运算存在,则应先进行高级运算,再进行低一级的运算。

C语言中的算熟运算符包括:+、-、*、/、++、--、% 等种类。

关系运算:

关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),而在C语言中,关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。

常见的关系运算符包括:<、<=、>、>=、==、!= 等种类。

其中,前4种关系运算符(<、<=、>、>= )的优先级别相同,后2种(==、!=)也相同。而前4种高于后2种,并且关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符(=)。

逻辑运算:

在逻辑代数中,有与、或、非三种基本逻辑运算。表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。

常见的逻辑运算符包括:&&、||、! 等种类

&&: 与是双目运算符,要求有两个运算对象,表示两个运算对象都成立,则结果为真,否则结果为假。

||:是双目运算符,要求有两个运算对象,表示两个运算对象只要任意一个成立,则结果为真,否则结果为假。

例如:(a<b) && (x>y),表示(a<b)和(x>y)两个对象中任意一个成立则结果为真。

**!**是单目运算符,只要求有一个运算对象,表示取运算对象反义,运算对象为真则结果为假,运算对象结果为假则结果为真。

题目2:C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

答案:

对于逻辑表达式,若其值为“真",则以1表示,若其值为“假”,则以0表示。但是在判断一个逻辑量的值时,系统会以0作为“假”,以非0作为“真”。例如3 && 5的值为“真”,系统给出3 && 5的值为1。

题目3:写出下面各逻辑表达式的值。设a=3,b=4,c=5。
(1) a+b>c && b==c
(2) al|b十c && b-c
(3) !(a>b) && !c || 1
(4) !(x=a) && (y=b) && 0
(5) !(a+b)+c-1 && b十c/2

答案:

(1) 0(2) 1(3) 1(4) 0(5) 1

题目4:有3个整数a,b,c,由键盘输人,输出其中最大的数

方法一:N-S图见图4.1

复制请说明

方法二:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int a, b, c;
    printf("请输入3个整数:");
    scanf("%d,%d,%d", &a, &b, &c);
    if (a < b)
        if (b < c)
            printf("max=%d\n", c);
        else
            printf("max=%d\n", b);
    else if (a < c)
        printf("max=%d\n", c);
    else
        printf("max=%d\n", a);
    return 0;
}

题目5:从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define M 1000
        int main()
    {
        int i, k;
        printf("请输入一个小于%d的整数i:", M);
        scanf("%d", &i);
        if (i > M)
        {
            printf("输人的数据不符合要求,请重新输入一个小于%d的整数i;", M);
            scanf("%d", &i);
        }
        k = sqrt(i);
        printf("%d的平方根的整数部分是%d\n", i, k);
        return 0;
    }
运行结果:

①第一次:输人正确数据。

 

②第二次:输人不正确数据。

 

思考:

讨论:题目要求输人的数小于1000,今为了增加程序的灵活性,定义符号常量M为1000,如果题目要求输入的数小于10000,只须修改define指令即可,不必修改主函数。如果用if语句检查输入的数是否符合要求,如果不符合要求应进行相应的处理,看来是很简单的,但在实际应用中是很有用的。因为在程序提供使用者使用后,不能保证使用者输入的数据都是符合要求的。假若之勇者输人了不符合要求的数据怎么办?如果没有检查和补救措施,程序是不能供实际使用的。

本程序的处理方法是:提醒用户“输人的数据错了”,要求重新输入。但只提醒一次,再错了怎么办?在学习了第5章循环之后,可以将程序改为多次检查,直到正确输人为止。程序如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define M 1000
int main()
{
    int i, k;
    printf("请输入一个小于%d的整数i:", M);
    scanf("%d", &i);
    while (i > M)
    {
        printf("输入的数据不符合要求,请重新输入一个小于%d的整数i:", M);
        scanf("%d", &i);
    }
    k = sqrt(i);
    printf("%d的平方根的整数部分是%d\n", i, k);
    return 0;
}

运行结果:

这种检查手段是很重要的,希望您能真正掌握。本例只是示意性的,程序比较简单。有了此基础,读者根据此思路完全可以做到对任何条件进行检查处理,使程序能正常运行,万无一失。

题目6:有一个函数:
y={x+y=1(x<1) 2x−1(1≤x<10) 3x−11(x>=10)

写程序,输入 x 的值,输出 y 相应的值。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define M 1000
int main()
{
    int x, y;
    printf("输入x:");
    scanf("%d", &x);
    if (x < 1) // x<1
    {
        y = x;
        printf("x=%3d, y=x=%d\n", x, y);
    }
    else if (x < 10) // 1=<x<10
    {
        y = 2 * x - 1;
        printf("x=%d, y=2*x-1=%d\n", x, y);
    }
    else // x> = 10
    {
        y = 3 * x - 11;
        printf("x=%d, y=3*x-11=%d\n", x, y);
    }
    return 0;
}

结果

复制请说明

复制请说明

复制请说明

题目7:有一个函数:
y={−1(x<0) 0(x=0) 1(x>0)

有人分别编写了以下两个程序,请分析它们是否能实现题目要求。

(1)#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int x, y;
    printf("enter x:");
    scanf("%d", &x);
    y = -1;
    if (x != 0)
        if (x > 0)
            y = 1;
        else
            y = 0;
    printf("x=%d,y=%d\n", x, y);
    return 0;
}

用流程图分析

 

运行结果

 

它不能实现题目的要求。如果输人的x<0,则输出y=0。请注意else 与if 的配对关系。程序(1)中的else子句是和第9行的内嵌的if语句配对,而不与第8行的if语句配对,x的值为-6,输出y=0,结果显然不对。

(2)

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
int main()
{
    int x, y;
    printf("enter x:");
    scanf("%d", &x);
    y = 0;
    if (x >= 0)
        if (x > 0)
            y = 1;
        else
            y = -1;
    printf("x=%d,y=%d\n", x, y);
    return 0;
}

它也不能实现题目的要求。如果输入的x<0,则输出y=0。

用流程图分析如下

 

运行结果:

复制请说明

x的值为-4,输出y=0,结果显然不对。程序(2)中的else子句是和第9行的内嵌的if语句配对,而不与第8行的if语句配对。

一定要注意 if 与 else 的配对关系。配对关系不随 if 和 else 所出现的列的位置而改变,例如程序(2)中的else与第8行的 if 写在同一列,但 else 并不因此而与第8行的if语句配对,它只和在它前面的离它最近的 if 配对。

为了使逻辑关系清晰,避免出错,一般把内嵌的 if 语句放在外层的 else 子句中,由于有外层的 else 相隔,内嵌的 else 不会被误认为和外层的 if 配对,而只能与内嵌的 if 配对,这样就不会搞混。

本文遵守协议

如有转载标明出处

如有疑问请留言谢谢点赞与评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值