C语言(谭浩强第5版)课后习题知识总结

目录第一章第二章第三章第四章第五章第六章第七章第八章第九章第十章第一章1.程序:就是一组计算机能够识别和执行的指令集合,每一条指令使计算机执行特定操作。程序设计:从确定任务到得到结构、写出文档的全过程。2.为什么需要计算机语言?计算机语言解决了人和计算机交流的语言问题,使得人和计算机都能...
摘要由CSDN通过智能技术生成

目录

        第一章

        第二章

        第三章

        第四章

        第五章

        第六章

        第七章

        第八章

        第九章

        第十章


第一章

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

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

2.为什么需要计算机语言?

计算机语言解决了人和计算机交流的语言问题,使得人和计算机都能够识别。

高级语言有哪些特点?

C语言、Java、C++、python、GO 高级语言的数据类型比汇编语言更加丰富,高级语言更加亲近自然语言,人们更容易掌握高级语言 高级语言的编写代码需要经过编译才能编程可执行程序;

高级语言和具体的计算机结构是没有很强的关系,机器语言和计算机有较强的关系

3.解释名词含义:

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

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

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

程序编辑:上机输入或编辑源程序代码

程序编译:

1)用C提供的“预处理器”,对程序中的预处理指令进行编译预处理

2)对源程序进行语法检查,判断是否有语法错误,直到没有语法错误为止

3)自动把源程序转换为二进制形式的目标程序

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

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

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

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

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

主函数:main函数,程序执行的起点

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

库函数:编译器提供的可在C源程序中调用的函数,分为C语言标准规定的库函数和编译器特定的库函数

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

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

4.printf("%s\n","hello world");

5.共4行,打印时可以调用printf函数进行输出并用\n换行

第二章

1.算法:对求解问题地步骤,对特定问题求解步骤地一种描述

2.结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,在基本结构之间不存在向前或向后地跳转,流程地控制只存在于一个基本地范围之内

        优点:便于编写,可读性高,修改和维护方便简单,可减少程序出错地机会,提高了程序可靠性,保证了程序地质量,因此体长结构化算法

非结构化算法,流程不受限制地随意跳来跳去,使流程图毫无规律,在阅读时难以理解算法地逻辑,难以阅读和修改,其可靠性和可维护性难以保证

3.三种基本结构:

顺序结构:一种线性、有序地结构,依次执行各行各语句模块

选择结构:根据条件成立与否选择程序执行地通路

循环结构:重复执行一个或几个模块,直到满足某一条件为止,只有一个入口,只有一个出口 结构内地每个部分都有机会被执行到 结构内不能出现死循环

4. 辗转相除法: 如果M小于N,交换M和N,M中存储大数,N中存储小数 N不等于0,循环进行下一个操作 r=m%n; m=n; n=r; N等于0,M即为最大公约数

5.略

6.伪代码表示算法

7.结构化程序设计(SP):进行以模块功能和处理过程设计为主地详细设计原则,采用自顶向下、逐步细化的程序设计方法,先把一个复杂的大问题分解为若干个小问题,对每个小问题编写一个功能上的独立的程序快(模块),将各程序块进行组合成完成的程序 自顶向下 逐步细化 模块化设计 结构化编码

8.略

第三章

1.编程题

2.编程题

3.编程题

4.改错题

5.编程题

6.编程题

7.编程题

8.编程题

(以上题目超级简单,详见《C程序设计》(谭浩强)第5版)

第四章

1.算数运算符:

        常见的四则运算

                操作:加减乘除、自增、增减、取模(整除取余),优先级:++ / -- / * / % / + / -

        关系运算符:在C中关系运算通常被认定为比较运算;

                操作:大于、小于、大于等于、小于等于、等于、不等于,优先级:>、<、≥、≤、==、≠

        逻辑运算符:在C中逻辑运算实际上是“与或非”,运算符:与(&&)、或(||)、非(!)

        优先级:非、与、或 以上所有优先级:自加、自减、非、算数运算符、关系运算符、逻辑运算符

2.真和假的表示:

        逻辑常量:0和1,表示两种对立的状态 - 假、真 逻辑变量:任意数字、任意字符、表达式 - 1>2 真和假的判断: 判断:0表示假、非0表示真

3.略

4.求最大

int main()
{
    int a, b, c;
    printf("input three number:>");
    scanf("%d %d %d", &a, &b, &c);
    int max;
    if (a > b)
    {
        max = a;
    }
    else {
        max = b;
    }if (max < c)
    {
        max = c;
    }
    printf("max is :%d\n", max);
​
    system("pause");
    return 0;
​
}

5.判断输入的数据是否小于1000 小于1000->求平方根 不小于1000->重新提示输入 2.得到平方根,打印输出整数部分

#include <math.h>
int main()
{
    double num;
    printf("请输入一个正数:>");
    scanf("%lf", &num);
    if (num < 0 || num >= 1000)
    {
        printf("请输入一个0~999之间的正数:>");
        scanf("%lf", &num);
    }
    double x = sqrt(num);
    printf("%.0lf\n", x);
    //printf("%.0lf\n", sqrt(num));
    system("pause");
    return 0;
}

6.如果x<1 则y=x 如果x>=1&&x<10 则y=2x-1 如果x>=10 则y=3x-11

#include <stdio.h>
int main()
{
    int x, y;
    printf("请输入一个数字x = ");
    scanf("%d", &x);
    if (x < 1)
    {
        y = x;
    }
    else if (x >= 1 && x < 10)
    {
        y = 2 * x - 1;
    }
    if(x >= 10)
    {
        y = 3 * x - 11;
    }
    printf("y = %d\n", y);
    system("pause");
    return 0;
}

7.(1)和(2)都不符合

8.根据成绩所在区间,选择不同的分支语句,得到不同的成绩评级 score >= 90 'A' score >= 80 && score <90 'B' score >= 70 && score <80 'C' score >= 60 && score <70 'D' score <60 'E'

#include <stdio.h>
int main()
{
    float score;
    char result;
    printf("请输入成绩:>");
    scanf("%d", &score);
    if (score >= 90)
    {
        result = 'A';
    }
    else if (score >= 80 && score < 90)
    {
        result = 'B';
    }
    else if (score >= 70 && score < 80)
    {
        result = 'C';
    }
    else if (score >= 60 && score < 70)
    {
        result = 'D';
    }
    else
    {
        result = 'E';
    }
    printf("%c\n", result);
    system("pause");
    return 0;
}

8.略

9.求一个整数有多少位 若数据大于99999或数据小于0则不满足要求,提示错误信息并退出 若数据大于等于10000,则是五位数 若数据大于等于1000,且小于10000,则是四位数 若数据大于等于100,且小于1000,则位三位数 若数据大于等于10,且小于100,则是二位数 若数据小于10,则是一位数

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个不大于5位的正整数:>");
    scanf("%d", &num);
    if (num<0 || num>99999)
    {
        printf("输入的数据不符合规则!\n");
        return -1;
    }
    if (num >= 10000)
    {
        printf("这个数字是5位数!\n");
    }
    else if (num >= 1000 && num < 10000)
    {
        printf("这个数字是4位数!\n");
    }
    else if (num >= 100 && num < 1000)
    {
        printf("这个数字是3位数!\n");
    }
    else if (num >= 10 && num < 100)
    {
        printf("这个数字是2位数!\n");
    }
    else
    {
        printf("这个数字是1位数!\n");
    }
    printf("%d\n", num);
    system("pause");
    return 0;
}

2.分别输出每一位数字 num num/10000=第一位数字 num%10000/1000=第二位数字 num%1000/100=第三位数字 num%100/10=第四位数字 num%10=第五位数字

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个不大于5位的正整数:>");
    scanf("%d", &num);
    if (num<0 || num>99999)
    {
        printf("输入的数据不符合规则!\n");
        return -1;
    }
    if (num > 10000)
    {
        printf("%d ", num / 10000);
    }
    if (num > 1000)
    {
        printf("%d ", num % 10000 / 1000);
    }
    if (num > 100)
    {
        printf("%d ", num % 1000 / 100);
    }
    if (num > 10)
    {
        printf("%d ", num % 100 / 10);
    }
    printf("%d \n", num % 10);
    system("pause");
    return 0;
}

3.逆序输出每一位数字 将第二个问题思想反过来构思

#include <stdio.h>
int main()
{
    int num;
    printf("请输入一个不大于5位的正整数:>");
    scanf("%d", &num);
    if (num<0 || num>99999)
    {
        printf("输入的数据不符合规则!\n");
        return -1;
    }
    printf("%d ", num % 10);
    if (num > 10)
    {
        printf("%d ", num % 100 / 10);
    }
    if (num > 100)
    {
        printf("%d ", num % 1000 / 100);
    }
    if (num > 1000)
    {
        printf("%d ", num % 10000 / 1000);
    }
    
​
    if (num > 10000)
    {
        printf("%d ", num / 10000);
    }
    printf("\n");
    system("pause");
    return 0;
​
}

10.奖金=110% i<=10000 10w - 奖金=满额的10万奖金+超出(1+10000)7.5% i>10000&&i<=20000 10w0.1 20w - 奖金 = 满额的20万奖金 + 超出(1 + 20000)5 % i>20000&&i<=40000 10w0.1+10w0.075 40w - 奖金 = 满额的40万奖金 + 超出(1 + 40000) * 5 % i>40000&&i<=60000 10w0.1+10w0.075+20w*0.05 60w - 奖金 = 满额的60万奖金 + 超出(1 + 60000) * 3 % i>60000&&i<=100000 10w0.1+10w0.075+20w0.05+40w0.03 100w - 奖金 = 满额的100万奖金 + 超出(1 + 100000) * 1 % i>100000

使用switch语句 将利润分为10个档次 10 20 30 40 50 60 70 80 90 100 使用利润除以10w得到利润等级 int level=i/100000

#include <stdio.h>
int main()
{
    double salary1 = 100000 * 0.1;//10w
    double salary2 = salary1 + 100000 * 0.075;//20w
    double salary3 = salary2 + 200000 * 0.05;//40w
    double salary4 = salary3 + 200000 * 0.03;//60w
    double salary5 = salary4 + 400000 * 0.015;//100
    double i, salary;
    int level = i / 100000;
    printf("请输入你所创造的利润:>");
    scanf("%lf", &i);
    switch (level)
    {
    case 0:
        salary = i*0.01;
        break;
    case 1:
        salary = salary1 + (i - 100000)*0.075;
        break;
    case 2:
    case 3:
        salary = salary2 + (i - 200000)*0.05;
        break;
    case 4:
    case 5:
        salary = salary3 + (i - 200000)*0.03;
        break;
    case 6:
    case 7:
    case 8:
    case 9:
        salary = salary4 + (i - 200000)*0.015;
        break;
    default:
        salary = salary5 + (i + 1000000)*0.01;
        break;
    }
    printf("%0.2f\n", salary);
    system("pause");
    return 0;
}

11.四个数字升序输出 1.找出四个数中最大的数字 a与b比较,如果a<b,数据交换,a中存放较大的数据,然后逐次a与c比较,a与d比较 最终a中存放最大的数字 2.在b c d三个数字中找出最大的数字放到b b与c进行交换,然后再d进行比较交换 3.在c d两个数字中找出较大的数字,放到c中 c与d比较交换 最后,a b c d四个数字就从大到小交换了

#include <stdio.h>
int main()
{
    int a, b, c, d;
    printf("请输入四个数字:>");
    scanf("%d %d %d %d", &a, &b, &c, &d);
    if (a < b)
    {
        int tmp = a; a = b; b = tmp;
    }
    if (a < c)
    {
        int tmp = a; a = c; c = tmp;
    }
    if (a < d)
    {
        int tmp = a; a = d; d = tmp;
    }
    if (b < c)
    {
        int tmp = b; b = c; c = tmp;
    }
    if (b < d)
    {
        int tmp = b; b = d; d = tmp;
    }
    if (c < d)
    {
        int tmp = c; c = d; c = tmp;
    }
    printf("%d %d %d %d\n", a, b, c, d);
    system("pause");
    return 0;
}

12.

1.若输入位置在塔的范围之内,则高度为10㎝,范围之外为0㎝

2.若输入的位置相对于圆心的位置,则长度是否大于半径 长度大于半径,则在范围之外 长度小于等于半径,则在范围之内

3.将四个塔化为一个塔的运算 将输入的位置坐标求取绝对值,进行计算 求取绝对值的接口 double fabs(double num) 求取平方根的接口 double sqrt(double num)

        1.获取键盘输入的x,y

        2.计算坐标值的绝对值 fx,fy

        3.计算坐标值距离圆心的长度 输入的坐标值的位置-圆心的坐标位置=相对于圆心的坐标

        4.求取两个位置的直线距离的长度 相对于圆心x距离的平方+相对于距离y的平方=1

        5.判断直线距离是否大于半径

#include <stdio.h>
#include <math.h>
int main()
{
    float x, y;
    printf("请输入坐标值x,y:>");
    scanf("%f %f", &x, &y);
    float fx = fabs(x);
    float fy = fabs(y);
    float lx = fx - 2;
    float ly = fx - 2;
    float len = sqrt((lx*lx + ly*ly));
    if (len > 1)
    {
        printf("输入的位置的建筑物高度为0\n");
    }
    else{
        printf("输入的位置的建筑物高度为10㎝\n");
    }
    system("pause");
    return 0;
}

第五章

1.略

2.

#include <stdio.h>
#include <math.h>
int main()
{
    int sign=1;
    double pi=0.0,n=1.0,term=1.0;
    int count=0;
    while(fabs(term)>=1e-6)
    {
        pi=pi+term;
        n=n+2;
        sign=-sign;
        term=sign/n;
        count++;
    }
    pi=pi*4;
    printf("pi=%10.8f\n",pi);
    printf("count=%d\n",count);
    return 0;
}


#include <stdio.h>
#include <math.h>
int main()
{
    int sign=1;
    double pi=0.0,n=1.0,term=1.0;
    int count=0;
    while(fabs(term)>=1e-8)
    {
        pi=pi+term;
        n=n+2;
        sign=-sign;
        term=sign/n;
        count++;
    }
    pi=pi*4;
    printf("pi=%10.8f\n",pi);
    printf("count=%d\n",count);
    return 0;
}

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

最大公约数: “辗转相除法”,以除数和余数反复做除法运算,当中余数为0的时候,就取当中的算式当中的除数为最大公约数

最小公倍数: 两个自然数的乘积=最大公约数最小公倍数

1.从标准输入当中获取两个数字

2.区分两个正整数的较大值(较大值%较小值)

3.辗转相除法-->最大公约数

4.两者的乘积/最大公约数=最小公倍数

5.输出

#include <stdio.h>
int main() { 
    int n, m; 
    scanf("%d比较两个值中的较大值和较小值%d", &n, &m); 
    if (n < m) 
    { 
        int tmp = n; 
        n = m; 
        m = tmp; 
    } //为最小公倍数保存两者的乘积,因为在 //辗转相除法的时候,n,m当中的值会发生变化 
    int total = nm; int r = -1;//r 代表余数 
    while (m != 0)
    { r = n%m; //为下一次做准备 
      n = m; 
      m = r; 
    } //当前最大公约数经过上面计算已经保存在n中了 
    printf("最大公约数为:> %d\n", n); 
    printf("最小公倍数为:> %d\n", total / n); 
    system("pause"); 
    return 0; 
}

4.输入一行字符,分别统计字母、空格、数字和其他字符

1.从标准输入当中获取一行字符,对每一个字符进行甄别,判断是字母、数字、空格还是其他字符 2.getchar函数 可以从标准输入中获取一个字符 输入多个字符后,getchar从缓冲区中读取字符 输入多个字符,用getchar来循环读取 输入一行字符串后,尾部以\n结束 意味着当读到\n时就结束了 3.统计 ['a', 'a']或['A','Z']---》英文字符 ''---->空格字符 ['0','9']---->数字字符 其他字符

#include <stdio.h>
int main() 
{ 
    int eng_char = 0;//英文字符 
    int space_char = 0;//空格字符 
    int digit_char = 0;//数字字符 
    int other_char = 0;//其他字符 
    int c; 
    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个,空格字符:%d个,数字字符:%d个,其他字符:%d个\n", eng_char,                     space_char, digit_char, other_char); 
    system("pause"); 
    return 0; 
}

5.求Sn=a+aa+aaa+aaaa+.........+aaaa.....aa的值。其中a表示一个数字,n表示a的位数,n由键盘输入。

#include <math.h>
#include <string.h>
int main()
{
   int n = 0;
   double a, single_num = 0.0,total_sum=0.0;
   //从标准输入获取数字
   scanf("%d %lf", &n, &a);
   for (int i = 0; i < n; i++)
   {
       single_num += a*pow(10, i);
       total_sum += single_num;
   }
   printf("%lf\n", total_sum);
   system("pause");
   return 0;
}

6.求1-20的阶乘

#include <stdio.h>
int main()
{
   //求1-20的阶乘
   double total_sum = 0.0;
   //遍历获取[1,20]当中的每一个数字
   for (int i = 1; i <= 20; i++)
   {
       //对每一个数字进行阶乘
       double single_num = 1.0;
       for (int j = i; j > 0; j--)
       {
           single_num *= j;
       }
       //对每个数字阶乘的结果进行求和
       total_sum += single_num;
       }
       printf("%lf\n", total_sum);
       system("pause");
       return 0;
}

7.求各个表达式的的和

第一个表达式:指的是求1-100的和,1+2+3+……+100,求和之后,和为整数,范围为【1,100】

第二个表达式:指的是求1^2+2^2+3^2+……+50^2,求和之后,和为整数,范围为【1,50】

第三个表达式:指的是求1/1+1/2+1/3+……+1/10,求和之后,和为浮点数,范围为【1,10】

#include <stdio.h>
int main()
{
   double total_sum = 0.0, sum1 = 0.0, sum2 = 0.0, sum3 = 0.0;
   //[1-100]
   for (int i = 1; i <= 100; i++)
   {
      //累加
      sum1 += i;
      //[1-50]
      if (i <= 50)
      {
          //累加
          sum2 += i*i;
      }
      if (i <= 10)
      {
          sum3 = 1.0 / i;
      }
  }
  total_sum = sum1 + sum2 + sum3;
  printf("%.2lf\n", total_sum);
  system("pause");
  return 0;
}

8.当前题意中描述的水仙花数是一个三位数,范围【100,999】 求得三位数当中的每一位数字,可以在代码中可以采用%10的方式

#include <stdio.h>
int main()
 {
     int a, b, c;
     //获取[100,999]的数字
     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 ", i);
        }
     }
      system("pause");
      return 0;
}

9.完数:除了自身之外所有因子之和

例如:6=1+2+3 【1,1000】中所有的完数,当然1除外,1的因子本身就是1

1)如何获取【2,1000】之内所有的数字

2)如何获取data这个数字的所有因子之和 什么因子? 如果一个整数a除以整数b(b!=0),余数为0的情况下,我们就称为b是a的因子 如何求data这个数字的所有因子 data % [1,data) data % [1,data/2]==>(data/2,data) 判断 for(int i=1;i<data/2;i++) if(data%[1,data/2]==0) 因子求和

3)判断当前数是否是完数,因子求和的值是否等于该数本身 因子求和==data 如果等于,按照格式输出

int main() 
{ 
    for (int data = 2; data <= 1000; data++) 
    { 
        int factor_sum = 0; 
        for (int factor = 1; factor <= data / 2; factor++) 
        { 
            if (data%factor == 0) 
            { 
                factor_sum += factor; 
            } 
        } 
        //判断 
        if (factor_sum == data) 
        { 
            printf("%d its factors are ", data); 
            for (int factor = 1; factor < data /2; factor++) 
            { 
                if (data%factor == 0) 
                { 
                    printf("%d,", factor); 
                } 
            } 
            printf("\n"); 
        } 
    } 
system("pause"); 
return 0; 
}

10.对于下一个分式当中的分子 = 上一个分式当中的分子+分母

对于下一个分式当中的分母 = 上一个分式当中的的分子

对于当前的分式,分式的结果并不是一个整数,所以我们应该在代码中使用浮点类型 保存数据的时候使用浮点数

#include <stdio.h>
main()
{
    //a代表分子,b代表分母,total_sum代表分式之和
    double a = 2.0, b = 1.0, total_sum = 0.0;
    for (int i = 0; i < 20; i++)
    {
        total_sum = a / b;
        //更新分子和分母
        double tmp = a;
        a = a + b;
        b = tmp;
    }
    printf("%lf\n", total_sum);
    system("pause");
    return 0;
}

11.注意:保存数据的时候,一定不能使用整数,因为会有小数存在,如果有小数存在,我们在代码中用浮点数进行保存

#include <stdio.h>
int main()
{
	//定义高度
	double total_meter = 100.0;
	//定义小球经过的米数
	double ball_total_sum = 0.0;
	for (int i = 0; i < 10; i++)
	{
		//下落+回弹
		ball_total_sum += total_meter;
		//回弹距离等于高度的一半
		total_meter /= 2;
		ball_total_sum += total_meter;
	}
	//第十次回弹的距离
	ball_total_sum -= total_meter;
	printf("小球经过%lf米,第十次回弹的距离为%lf\n", ball_total_sum, total_meter);
	system("pause");
	return 0;
}

12.下一天的桃子数量 = 上一天的桃子数量/2-1 (下一天桃子的数量+1)*2=上一天桃子的数量

第10天:1个

第9天: 4个

第8天:10个

第7天:22个

最后,第十天猴子没有吃,只吃了九天

#include <stdio.h>
int main()
{
	int day = 9;
	int cur_day_count = 1;
	int prev_day_count;
	while (day > 0)
	{
		prev_day_count = (cur_day_count + 1) * 2;
		//更新
		cur_day_count = prev_day_c
  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光下的少年-熙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值