控制台应用程序的输入方法和输出方法有哪些(C#如何在控制台中输入3个整数,以及输出)

:暂无数据 2026-09-23 22:50:05 0

控制台应用程序的输入方法和输出方法有哪些(C#如何在控制台中输入3个整数,以及输出)

各位老铁们好,相信很多人对控制台应用程序的输入方法和输出方法有哪些都不是特别的了解,因此呢,今天就来为大家分享下关于控制台应用程序的输入方法和输出方法有哪些以及C#如何在控制台中输入3个整数,以及输出的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

C#如何在控制台中输入3个整数,以及输出

1、以C#控制台应用程序为例:            

Console.WriteLine("输入3个整数,之间以逗号分隔,回车键结束...");

string str = Console.ReadLine(); //读入用户输入信息

string { ’,’ }); //以逗号为分隔符,分离出各项

if (input.Count() == 3) //不是3,用户输入错

{

try

{

//异常处理,用户输入非整数会引发异常处理

int a = int.Parse(input);

int value1 = a + b * c; //计算表达式

Console.WriteLine("a+b*c的计算结果:" + value1.ToString());

}

catch 

{

Console.WriteLine("用户输入错误!"); //当用户输入非整数时,执行

}

}

else

Console.WriteLine("用户输入错误!"); //用户输入不符合指定格式,执行

Console.WriteLine("按回车键退出程序..."); 

Console.ReadLine(); //调试时,防止程序结束,看不到执行结果

2、执行结果如下:

3、当用户输入错误

注:Console.ReadLine();是以回车键结束。

扩展资料:

C#控制台程序的输入输出

信息输入到控制台:有三个方法可以实现

Console.ReadKey():获取按下的键盘,一般用来暂停控制台程序。

Console.Read(): 返回值为首字符的ASCII码

Console.ReadLine():获取输入的字符串

将信息输出到控制台:有两个方法实现、

Console.WriteLine()输出一行,进行换行。

Console.Write()输出一行,不换行。

java怎么输出

java控制台输出由print( ) 和 println( )来完成最为简单。这两种方法由rintStream(System.out引用的对象类型)定义。尽管System.out是一个字节流,用它作为简单程序的输出是可行的。因为PrintStream是从OutputStream派生的输出流,它同样实现低级方法write(),write()可用来向控制台写数据。PrintStream 定义的write( )的最简单的形式如下:

void write(int byteval)

该方法按照byteval指定的数目向文件写字节。尽管byteval 定义成整数,但只有低位的8个字节被写入。下面的短例用 write()向屏幕输出字符“A”,然后是新的行。

// Demonstrate System.out.write().

class WriteDemo {

public static void main(String args) {

int b;

b = ’A’;

System.out.write(b);

System.out.write(’\n’);

}

}

一般不常用write()来完成向控制台的输出(尽管这样做在某些场合非常有用),因为print()和println() 更容易用。

四、PrintWriter类

尽管Java允许用System.out向控制台写数据,但建议仅用在调试程序时或在例程中。对于实际的程序,Java推荐的向控制台写数据的方法是用PrintWriter流。PrintWriter是基于字符的类。用基于字符类向控制台写数据使程序更为国际化。PrintWriter定义了多个构造函数,这里所用到的一个如下:

PrintWriter(OutputStream outputStream, boolean flushOnNewline)

outputStream是OutputStream类的对象,flushOnNewline控制Java是否在println()方法被调用时刷新输出流。如果flushOnNewline为true,刷新自动发生,若为false,则不发生。

PrintWriter支持所有类型(包括Object)的print( )和println( )方法,这样,就可以像用ystem.out那样用这些方法。如果遇到不同类型的情况,PrintWriter方法调用对象的toString()方法并打印结果。用PrintWriter向外设写数据,指定输出流为System.out并在每一新行后刷新流。例如这行代码创建了与控制台输出相连的PrintWriter类。

PrintWriter pw = new PrintWriter(System.out, true);

下面的应用程序说明了用PrintWriter处理控制台输出的方法:

// Demonstrate PrintWriter

import java.io.*;

public class PrintWriterDemo {

public static void main(String args) {

PrintWriter pw = new PrintWriter(System.out, true);

pw.println("This is a string");

int i = -7;

pw.println(i);

double d = 4.5e-7;

pw.println(d);

}

}

该程序的输出如下:

This is a string

-7

4.5E-7

io包支持Java的基本I/O(输入/输出)系统,包括文件的输入/输出。对输入/输出的支持是来源于Java的内核API库,而不是语言关键字。

一、输入/输出基础

很多实际的Java应用程序不是基于文本的控制台程序。尽管基于文本的程序作为教学实例是很出色的,它们无法胜任JAVA在实际中的重要应用。Java对外设输入/输出的支持也是有限的,并且用起来有些笨拙——甚至是在简单的例子程序中。基于文本的控制台输入/输出对于Java程序并不是十分重要。

Java 提供了与文件和网络相关的强大的和灵活的输入/输出支持,Java的输入/输出系统是紧密相连并且是具有一致性的。

1.1 流的概念

Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。

1.2 字节流和字符流

要使用流类,必须导入Java.io包。Java 2 定义了两种类型的流:字节类和字符类。字节流(byte stream)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或书写二进制数据。字符流(character stream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。在某些场合,字符流比字节流更有效。在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的概述。

1.2.1 字节流类

字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream 和 OutputStream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。字节流类显示于表1-1中。

表1-1 字节流类

流类 含义 

BufferedInputStream缓冲输入流

BufferedOutputStream缓冲输出流

ByteArrayInputStream从字节数组读取的输入流

ByteArrayOutputStream向字节数组写入的输出流

DataInputStream包含读取Java标准数据类型方法的输入流

DataOutputStream包含编写Java标准数据类型方法的输出流

FileInputStream读取文件的输入流

FileOutputStream写文件的输出流

FilterInputStream实现InputStream

FilterOutputStream实现OutputStream

InputStream描述流输入的抽象类

OutputStream描述流输出的抽象类

PipedInputStream输入管道

PipedOutputStream输出管道

PrintStream包含print()和println()的输出流

PushbackInputStream 支持向输入流返回一个字节的单字节的“unget”的输入流

RandomAccessFile支持随机文件输入/输出

SequenceInputStream两个或两个以上顺序读取的输入流组成的输入流

抽象类InputStream 和 OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种方法都在InputStream 和OutputStream中被定义为抽象方法。它们被派生的流类重载。

1.2.2 字符流类

字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java中这些类含有多个具体的子类。字符流类如表1-2所示。

表1-2 字符流的输入/输出类

抽象类Reader和Writer定义了几个实现其他流类的关键方法。其中两个最重要的是read()和write(),它们分别进行字符数据的读和写。这些方法被派生流类重载。

1.3 预定义流

所有的Java程序自动导入java.lang包。该包定义了一个名为System的类,该类封装了运行时环境的多个方面。System 同时包含三个预定义的流变量,in,out和err。这些成员在System中是被定义成public 和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他部分。

System.out是标准的输出流。默认情况下,它是一个控制台。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备。System.in 是inputStream的对象;System.out和System.err是PrintStream的对象。它们都是字节流,尽管它们用来读写外设的字符。但可以用基于字符的流来包装它们。

二、读取控制台输入

在Java 1.0中,完成控制台输入的惟一途径是字节流,使用该方法的老代码依然存在。今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。

Java没有像标准C的函数scanf()或C++输入操作符那样的统一的控制台输入方法。Java中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader对象中包装System.in。BufferedReader 支持缓冲输入流查看批注。它最常见的构造函数如下:

BufferedReader(Reader inputReader)

这里,inputReader是链接被创建的BufferedReader实例的流。Reader是一个抽象类。它的一个具体的子类是InputStreamReader,该子类把字节转换成字符查看批注。为获得链接System.in的一个InputStreamReader的对象,用下面的构造函数:

InputStreamReader(InputStream inputStream)

因为System .in引用了InputStream 类型的对象,它可以用于inputStream。综上所述,下面的一行代码创建了与键盘相连的BufferedReader对象。

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

当该语句执行后,br是通过System.in生成的链接控制台的字符流。

2.1 读取字符

从BufferedReader读取字符,用read()。这里所用的read()版本如下:

int read( ) throws IOException

该方法每次执行都从输入流读取一个字符然后以整型返回。当遇到流的末尾时它返回-1。可以看到,它要引发一个IOException异常。下面的例程演示了read()方法,从控制台读取字符直到用户键入“q”:

// Use a BufferedReader to read characters from the console.

import java.io.*;

class BRRead {

public static void main(String args)

throws IOException

{

char c;

BufferedReader br = new

BufferedReader(new InputStreamReader(System.in));

System.out.println("Enter characters, ’q’ to quit.");

// read characters

do {

c = (char) br.read();

System.out.println(c);

} while(c != ’q’);

}

}

下面是程序运行:

Enter characters, ’q’ to quit.

123abcq

1

2

3

a

b

c

q

2.2 读取字符串

从键盘读取字符串,使用readLine()。它是BufferedReader 类的成员。它的通常形式如下:

String readLine( ) throws IOException

它返回一个String对象。下面的例子阐述了BufferedReader类和readLine()方法;程序读取和显示文本的行直到键入“stop”:

// Read a string from console using a BufferedReader.

import java.io.*;

class BRReadLines {

public static void main(String args)

throws IOException

{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

String str;

System.out.println("Enter lines of text.");

System.out.println("Enter ’stop’ to quit.");

do {

str = br.readLine();

System.out.println(str);

} while(!str.equals("stop"));

}

}

下面的例程生成了一个小文本器。它创建了一个String对象的数组,然后依行读取文本,把文本每一行存入数组。它将读取到100行或直到按“stop”才停止。该例运用一个BufferedReader类来从控制台读取数据。

// A tiny editor.

import java.io.*;

class TinyEdit {

public static void main(String args)

throws IOException

{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

String str;

System.out.println("Enter lines of text.");

System.out.println("Enter ’stop’ to quit.");

for(int i=0; i《100; i++) {

str = br.readLine();

if(str.equals("stop")) break;

}

System.out.println("\nHere is your file:");

// display the lines

for(int i=0; i《100; i++) {

if(str.equals("stop")) break;

System.out.println(str);

}

}

}

下面是输出部分:

Enter lines of text.

Enter ‘stop’ to quit.

This is line one.

This is line two.

Java makes working with strings easy.

Just create String objects.

stop

Here is your file:

This is line one.

This is line two.

Java makes working with strings easy.

Just create String objects.

在程序设计中,可采用下列三种方法实现输出和输入:

第2种最好。
例如你设计一个函数
int fun(int input)
里面没有scanf printf调用,且没有访问全局变量,那么你的这个函数fun很容易移植,既可以在Dos窗口环境用,也可以在windows环境用,你要改的只是外围的数据输入获取方式和输出数据的显示方式。比如,在dos窗口程序中,你可以这样:
scanf(..&input);
output = fun (input);
printf(..output);
若想在windows界面用,可以这样:
input=某文本框的输入;
output=fun(input);
MessageBox(output);
功能代码与界面代码分离是经常要注意的事情。
假设你在fun里搞scanf或printf,你的fun就很难移植。
全局变量的缺点不用说了。

三种方法实现输入和输出方法的优缺点

(1)用scanf和printf直接进行输入输出的好处是形象、直观,但缺点是需要对其进行格式控制,较为烦琐,如果出现错误,则会引起整个系统的崩溃。
(2)通过函数的参数传递进行输入输出,便于实现信息的隐蔽,减少出错的可能。
(3)通过全局变量的隐式传递进行输入输出最为方便,只需修改变量的值即可,但过多的全局变量使程序的维护较为困难。

C语言中有哪几个输入输出函数简述他们的用途

在 C 语言中,常用的输入输出函数包括以下几个:
1. `printf()` 函数:用于输出信息到控制台或者文件,可以输出各种类型的数据,例如整数、浮点数、字符、字符串等。它的格式字符串可以通过占位符来指定输出数据的格式,类似于其他编程语言中的字符串格式化功能。
2. `scanf()` 函数:用于从控制台或者其他标准输入设备中读取输入数据,等待用户输入数据并读入数据。scanf() 函数的格式字符串中可以使用占位符来指定各种类型的输入数据,例如整数、浮点数、字符、串等。
3. `puts()` 函数:用于在控制台或者文件中输出一个字符串,并自动在字符串的末尾添加一个换行符。如果需要输出多行字符串,可以多次调用 puts() 函数来输出每行字符串。
4. `gets()` 函数:用于从标准输入设备中读取一个字符串。它可以读取包含空格和其他特殊字符的字符串,并将其保存到指定的字符数组中,直到读取到换行符为止。
这些输入输出函数是 C 语言中最常用的函数,可以方便地实现控制台的输入输出等功能。需要注意的是,这些函数都是标准库函数,如果要使用它们,需要在程序中包含相应的头文件,如 `《stdio.h》`。

在程序设计中,可采用下列三种方法实现输出和输入:

我晕。
第一个是提供给用户的输入函数和输出到屏幕的函数:这个和下面两个根本没有可比性。
第二个是通过函数传递参数,第三个是使用全局变量共享。
推荐前者。那样更安全,后者由于作用域广,所以不够安全,有被误操作的可能。有的极端的程序员竟然认为全局变量应该消失--我晕。
//不知道我是否理解有误。

输入输出控制方式有哪些它们各有什么特点

输入输出控制方式有程序方式、中断方式和DMA方式这3种。
各自的特点:
程序方式:指用输入/输出指令,来控制信息传输的方式,是一种软件控制方式,根据程序控制的方法不同,又可以分为无条件传送方式和条件传送方式。无条件传送方式接口简单,适用于那些能随时读写的设备。条件传送方式(查询方式) 的特点是接口电路简单,CPU利用率低(程序循环等待),接口需向CPU提供查询状态。适用于CPU不太忙,传送速度要求不高的场合。要求各种外设不能同时工作,外设处于被动状态。
中断方式:当外设准备好时,由外设通过接口电路向CPU发出中断请求信号,CPU在允许的情况下,暂停执行当前正在执行的程序,响应外设中断,转入执行相应的中断服务子程序,与外设进行一次数据传送,数据传送结束后,CPU返回继续执行原来被中断的程序。其特点是CPU的利用率高,外设具有申请CPU中断的主动权, CPU和外设之间处于并行工作状态。但中断服务需要保护断点和恢复断点(占用存储空间,降低速度), CPU和外设之间需要中断控制器。适用于CPU的任务较忙、传送速度要求不高的场合,尤其适合实时控制中的紧急事件处理。
存储器直接存取方式(DMA):外设利用专用的接口(DMA控制器)直接与存储器进行高速数据传送,并不经过CPU(CPU不参与数据传送工作),总线控制权不在CPU处,而由DMA 控制器控制。其特点是接口电路复杂,硬件开销大。大批量数据传送速度极快。适用于存储器与存储器之间、存储器与外设之间的大批量数据传送的场合。

控制台应用程序使用什么命令空间中的类处理输入和输出

System.IO。
控制台应用程序使用System.IO命令空间中的类处理输入和输出,也就是说,控制台应用程序使用统一的重定向文本输出形式,也就是从控制台(键盘)获取用户输入的信息,在运算后向控制台(屏幕)输出信息。这类应用程序适合于交互性操作较少、主要偏重内部功能实现的场合。
控制台可以指:控制室内的专业家具;控制面板,Windows图形用户界面的一部分;命令行界面(CLI),也有人称之为字符用户界面(CUI)等。

关于C#输入和输出的语句,控制台

Console.Readline()

从控制台读取一行输入,它是 String 类型的

所以要做类型转换
int x=Convert.ToInt32(Console.Readline());
Console.Read()

从控制台读取一个字符,它是 char 类型的,可以自动转换为 int ,’0’ 和 ’1’ 的 ascii 编码值分别的 48,49

扩展资料

Console.Read()方法:从控制台窗口读取一个字符,返回int值

Console.ReadLine()方法:从控制台窗口读取一行文本,返回string值

Console.ReadKey()方法:监听键盘事件,可以理解为按任意键执行

Console.Write()方法:将制定的值写入控制台窗口

Console.WriteLine()方法:将制定的值写入控制台窗口,但在输出结果的最后添加一个换行符



ipo方法是程序的基本编写方法,具体指

IPO方法是程序的基本编写方法,具体指输入、处理、输出。

基本的程序编写方法---IPO(Input, Process, Output)方法。

1、 输入:控制台输入、随机数据输入、内部变量输入、文件输入、交互界面输入、网络输入

2、处理:程序中实现处理功能的方法称为“算法”,算法是程序的灵魂。

3、输出:(1)控制台输出:以计算机屏幕为输出目标,通过程序运行环境中的命令行打印输出结果。这里“控制台”可以理解为启动程序的环境,例如,Windows中的命令行工具、IDLE工具等。

(2)图形输出:在计算机中启动独立的图形输出窗口,根据指令绘制运算结果。第9章将介绍高级人机交互方法。(3)文件输出:以生成新的文件或修改已有文件方式输出运行结果,这是程序常用的输出方式。7.1节将具体介绍文件的使用。

(4)网络输出:以访问网络接口方式输出数据。第10章将介绍自动向搜索引擎交关键词查询的实例。(5)操作系统内部变量输出:指程序将运行结果输出到系统内部变量中,这类量包括管道、线程、信号量等。

ipo程序编写步骤:

1、 定义目标:在定义目标时,要确定编写程序的目的。目标必须明确,要有明确的测量标准,并且可以被软件开发流程所应用。

2、 输入分析:收集系统所需的信息,并将这些信息划分为可用于编写程序的模块。收集的信息包括用户的需求、现有的系统资源及其执行的输入和输出等等。

3、 程设计:在过程设计阶段,要确定程序中具体的功能,包括系统的基本处理程序、计算方法、调用的过程等等。这些功能将在程序编写和测试阶段被应用。

4、 输出设计

5、 程序编写:程序编写是IPO程序编写方法的核心步骤,也是最重要的一步。

6、 程序测试:在程序编写完成后,要对程序进行测试,以查看其功能是否满足预期,是否存在任何bug或缺陷。此外,要考虑安全性问题,确保用户的隐私和数据安全。

7、 实施及维护:在实施之前,要测试不同的操作系统和硬件,以确保使用正常。在实施后,要对软件定期进行维护和升级,确保软件可以正常运行,并满足用户的需求。

如果你还想了解更多这方面的信息,记得收藏关注本站。
本文编辑:admin

更多文章:


字符串中有多少个空格(如何统计一个字符串中空格的数量请用代码表示出来)

字符串中有多少个空格(如何统计一个字符串中空格的数量请用代码表示出来)

大家好,字符串中有多少个空格相信很多的网友都不是很明白,包括如何统计一个字符串中空格的数量请用代码表示出来也是一样,不过没有关系,接下来就来为大家分享关于字符串中有多少个空格和如何统计一个字符串中空格的数量请用代码表示出来的一些知识点,大家

编程学什么好?编程课程内容

编程学什么好?编程课程内容

本篇文章给大家谈谈编程 课程,以及编程学什么好对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录编程学什么好编程课程内容幼儿编程课是什么样的少

php怎么生成html(PHP 生成HTML)

php怎么生成html(PHP 生成HTML)

大家好,关于php怎么生成html很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于PHP 生成HTML的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录P

digest啥意思啊(digest是什么意思啊)

digest啥意思啊(digest是什么意思啊)

这篇文章给大家聊聊关于digest啥意思啊,以及digest是什么意思啊对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录digest是什么意思啊Digust的意思是“文集”英文是不是“digest”digest的中文意思dig

highcharts k线图(如何用highCharts绘制动态股票K线图)

highcharts k线图(如何用highCharts绘制动态股票K线图)

大家好,如果您还对highcharts k线图不太了解,没有关系,今天就由本站为大家分享highcharts k线图的知识,包括如何用highCharts绘制动态股票K线图的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本

javascript 判断字符串相等(javascript怎么判断字符串是否相等)

javascript 判断字符串相等(javascript怎么判断字符串是否相等)

各位老铁们,大家好,今天由我来为大家分享javascript 判断字符串相等,以及javascript怎么判断字符串是否相等的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,

fork怎么发音(fork和form和work哪个发音不同)

fork怎么发音(fork和form和work哪个发音不同)

本篇文章给大家谈谈fork怎么发音,以及fork和form和work哪个发音不同对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录fork和form和work哪个发音不同fork的读音fork orange homework

奔驰斯玛特电动汽车价格(奔驰smart汽车)

奔驰斯玛特电动汽车价格(奔驰smart汽车)

大家好,奔驰斯玛特电动汽车价格相信很多的网友都不是很明白,包括奔驰smart汽车也是一样,不过没有关系,接下来就来为大家分享关于奔驰斯玛特电动汽车价格和奔驰smart汽车的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本

搜索所有代码(查询某家银行的国际代码的方式是什么)

搜索所有代码(查询某家银行的国际代码的方式是什么)

大家好,搜索所有代码相信很多的网友都不是很明白,包括查询某家银行的国际代码的方式是什么也是一样,不过没有关系,接下来就来为大家分享关于搜索所有代码和查询某家银行的国际代码的方式是什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我

wordpress怎么在导航栏上加hot,new等小图标?one-hot编码可以同时输出多个有效值

wordpress怎么在导航栏上加hot,new等小图标?one-hot编码可以同时输出多个有效值

今天给各位分享wordpress怎么在导航栏上加hot,new等小图标的知识,其中也会对wordpress怎么在导航栏上加hot,new等小图标进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录wordpress

最近更新

热门文章

z274座位分布图(z272列车座位表图片)
2025-09-24 02:30:01 浏览:13
g331公路起点终点(331国道好走吗2022)
2026-06-30 15:00:07 浏览:10
标签列表