當前位置:首頁 » 編程語言 » c語言nio什麼意思
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言nio什麼意思

發布時間: 2022-09-19 11:46:05

c語言中buffer到底是什麼意思是數組緩沖區為什麼一般C程序中都不定義他直接拿來用呢

Buffer是NodeJS的重要數據類型,很有廣泛的應用。代表原始堆的分配額的數據類型。在NodeJS中以類數組的方式使用。

在Buffer類的描述中,Buffer被定義為用於特定基本類型數據的容器,且是特定基本類型的線性優先元素序列。

Buffer提供了一個位元組緩沖區,它可以從channels中讀取數據到Buffer,也可以將Buffer中的數據寫入到channels,所以NIO被定義為面向緩沖區編程,而IO則是被定義為面向流的編程。

當一個緩存中的數據被多次讀取,實際上就減少了該數據從慢速設備中讀取的量,這就存在某種演算法去選擇什麼數據需要保存在cache中,因為盡可能多的讓cache命中能提高性能。

(1)c語言nio什麼意思擴展閱讀

Buffer類的四個變數

1、capacity

容量,必須初始化的值(因為底層是數組)

2、limit

上界,緩沖區的臨界區,即最多可讀到哪個位置

3、position

下標,當前讀取到的位置(例如當前讀出第5個元素,則讀完後,position為6)

4、mark

標記,備忘位置

⑵ 什麼是nio模式

Java NIO與IO的區別和比較

參考網路文檔:http://wenku..com/view/b038a60590c69ec3d5bb7580.html

下載不需要財富

⑶ NIO和TIJ是什麼

JDK 1.4版本(包括之後的版本)最顯著的新特性就是增加了NIO(New IO),能夠以非阻塞的方式處理網路的請求,這就使得在Java中只需要少量的線程就能處理大量的並發請求了。但是使用NIO不是一件簡單的技術,它的一些特點使得編程的模型比原來阻塞的方式更為復雜。
在JDK 1.4的新特性中,NIO無疑是最顯著和鼓舞人心的。NIO的出現事實上意味著Java虛擬機的性能比以前的版本有了較大的飛躍。在以前的JVM的版本中,代碼的執行效率不高(在最原始的版本中Java是解釋執行的語言),用Java編寫的應用程序通常所消耗的主要資源就是CPU,也就是說應用系統的瓶頸是CPU的計算和運行能力。在不斷更新的Java虛擬機版本中,通過動態編譯技術使得Java代碼執行的效率得到大幅度提高,幾乎和操作系統的本地語言(例如C/C++)的程序不相上下。在這種情況下,應用系統的性能瓶頸就從CPU轉移到IO操作了。尤其是伺服器端的應用,大量的網路IO和磁碟IO的操作,使得IO數據等待的延遲成為影響性能的主要因素。NIO的出現使得Java應用程序能夠更加緊密地結合操作系統,更加充分地利用操作系統的高級特性,獲得高性能的IO操作。

JIT Compiler(Just-in-time Compiler) 即時編譯 最早的Java建置方案是由一套轉譯程式(interpreter),將每個Java指令都轉譯成對等的微處理器指令,並根據轉譯後的指令先後次序依序執行,由於一個Java指令可能被轉譯成十幾或數十幾個對等的微處理器指令,這種模式執行的速度相當緩慢。 針對這個問題,業界首先開發出JIT(just in time)編譯器。當Java執行runtime環境時,每遇到一個新的類別(class:類別是Java程式中的功能群組),類別是Java程式中的功能群組-JIT編譯器在此時就會針對這個類別進行編譯(compile)作業。經過編譯後的程式,被優化成相當精簡的原生型指令碼(native code),這種程式的執行速度相當快。花費少許的編譯時間來節省稍後相當長的執行時間,JIT這種設計的確增加不少效率,但是它並未達到最頂尖的效能,因為某些極少執行到的Java指令在編譯時所額外花費的時間可能比轉譯器在執行時的時間還長,針對這些指令而言,整體花費的時間並沒有減少。 基於對JIT的經驗,業界發展出動態編譯器(dynamic compiler),動態編譯器僅針對較常被執行的程式碼進行編譯,其餘部分仍使用轉譯程式來執行。也就是說,動態編譯器會研判是否要編譯每個類別。動態編譯器擁有兩項利器:一是轉譯器,另一則是JIT,它透過智慧機制針對每個類別進行分析,然後決定使用這兩種利器的哪一種來達到最佳化的效果。動態編譯器針對程式的特性或者是讓程式執行幾個循環,再根據結果決定是否編譯這段程式碼。這個決定不見得絕對正確,但從統計數字來看,這個判斷的機制正確的機會相當高。事實上,動態編譯器會根據「歷史資料」做決策,所以程式執行的時間愈長,判斷正確的機率就愈高。以整個結果來看,動態編譯器產生的程式碼執行的速度超越以前的JIT技術,平均速度可提高至50%。

⑷ C語言 阻塞,非阻塞和多線程有什麼關系

  • 阻塞是在傳統的網路編程中我們依賴於ServerSocket,Socket進行通信,大致的框架就是ServerSocket調用accept方法,等待客戶端的連接,如果連接進來的時候則創建一個伺服器端socket,客戶端和伺服器端socket建立好InputStream 和outputStream通道進行通信,在這個網路IO的過程中inputStream的read 和outputStream的write方法都可能發送阻塞。為了減少這種阻塞對其他連接的影響,一般都會在伺服器端為每個連接開辟一個新的線程,或者使用線程池技術來避免線程的創建銷毀同時又一定程度支持並發量。然而這種情況下,如果發生大量的read 或者write阻塞線程池的效率會大大降低,而且操作系統也額外需要頻繁的處理cpu的切換。

  • 非阻塞式通信實際是對上述模式的擴展,它的核心思想是為傳統的socket加入事件監聽的功能,操作系統可以在socket和serversocket上進行事件監聽,一旦監聽的對象發生了連接和可讀可寫的事件,監聽器就會對注冊了事件的對象返回相應的通知。在javaNIO中實現這一套的機制就是把socket 和ServerSocket重寫成為SocketChanel,ServerSocketChanel,他們的底層仍然使用socket實現,所以原則上javaNIO包可以完全實現阻塞和非阻塞兩種編程模式。事件監聽的功能由Selection類完成,他使用select方法一直阻塞式監聽注冊了的事件是否發生,對於每一個發生的事件,他都會返回一個selectionKey,通過這個key我們就可以確定這個事件的發生源(socket)和相關信息。對於ServerSocketChanel,Socketchanel分別對應了不同的事件,serverChanel只有OP_ACCEPT代表是否可以接受連接,而socketChanel則有OP_CONNECT、read、write事件。筆者認為與阻塞IO相比他的優勢在於可以避免read 和write的阻塞,因為這個比較具有實際意義的。比如是一個網路文件傳輸系統,read方法可能會因為網路原因發生多次阻塞,使用非阻塞IO read的話線程可以立即返回去處理其他任務。

  • 多線程是在進程中進一步去劃分的獨立單元。

⑸ 用Nio技術實現c/s結構程序

服務端程序:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;

public class NioServer {
public static final int SERVERPORT=5555;
public static final String[] USERNAME={"1","2","3","4","5","jack","tom"};
public static final String PASSWORD="1";
public static final String ISACK="ACK";
public static final String ISNAK="NAK!";
// Selector selector;//選擇器
// SelectionKey key;//key。 一個key代表一個Selector 在NIO通道上的注冊,類似主鍵;
// //取得這個Key後就可以對Selector在通道上進行操作
private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 );// 通道數據緩沖區

public NioServer(){

}
public static void main(String[] args) throws IOException {
NioServer ns=new NioServer();
ns.BuildNioServer();
}
public void BuildNioServer() throws IOException{
/////////////////////////////////////////////////////////
///////先對服務端的ServerSocket進行注冊,注冊到Selector ////
/////////////////////////////////////////////////////////
ServerSocketChannel ssc = ServerSocketChannel.open();//新建NIO通道
ssc.configureBlocking( false );//使通道為非阻塞
ServerSocket ss = ssc.socket();//創建基於NIO通道的socket連接
//新建socket通道的埠
ss.bind(new InetSocketAddress("127.0.0.1",SERVERPORT));
Selector selector=Selector.open();//獲取一個選擇器
//將NIO通道選綁定到擇器,當然綁定後分配的主鍵為skey
//SelectionKey skey =
ssc.register( selector, SelectionKey.OP_ACCEPT );
////////////////////////////////////////////////////////////////////
//// 接收客戶端的連接Socket,並將此Socket也接連注冊到Selector ////
///////////////////////////////////////////////////////////////////
while(true){
int num = selector.select();//獲取通道內是否有選擇器的關心事件
if(num<1){continue; }
Set selectedKeys = selector.selectedKeys();//獲取通道內關心事件的集合
Iterator it = selectedKeys.iterator();
while (it.hasNext()) {//遍歷每個事件
try{
SelectionKey key = (SelectionKey)it.next();
//有一個新聯接接入事件,服務端事件
if ((key.readyOps() & SelectionKey.OP_ACCEPT)
== SelectionKey.OP_ACCEPT) {
// 接收這個新連接
ServerSocketChannel serverChanel = (ServerSocketChannel)key.channel();
//從serverSocketChannel中創建出與客戶端的連接socketChannel
SocketChannel sc = serverChanel.accept();
sc.configureBlocking( false );
// Add the new connection to the selector
// 把新連接注冊到選擇器
//SelectionKey newKey =
sc.register( selector, SelectionKey.OP_READ );
it.remove();
System.out.println( "Got connection from "+sc );
}else
//讀客戶端數據的事件,此時有客戶端發數據過來,客戶端事件
if((key.readyOps() & SelectionKey.OP_READ)
== SelectionKey.OP_READ){
// 讀取數據
SocketChannel sc = (SocketChannel)key.channel();
while(sc.read(echoBuffer)> 0){ ;}
echoBuffer.flip();
byte [] content = new byte[echoBuffer.limit()];
echoBuffer.get(content);
String result=new String(content);
doPost(result,sc);
echoBuffer.clear();
it.remove();
}
}catch(Exception e){}
}
}
}

Hashtable table=new Hashtable();
public void doPost(String str,SocketChannel sc){
boolean isok=false;
int index=str.indexOf('|');
if(index>=0){ //index>0 有"|"符號,代表登陸,沒有表示普通聊天
String name=str.substring(0,index);
String pswd=str.substring(index+1);
if(pswd==null){pswd="";}
if(name!=null){
if(pswd.equals(PASSWORD) ){
isok=false;
for(int i=0;i<USERNAME.length;i++){
if(USERNAME[i].equals(name)){
isok=true;
break;
}
}
}else{
isok=false;
}
}else{
isok=false;
}
String result="";
if(isok){
result="ACK";
//加入到用戶通道列表中
User user=new User();
user.password=pswd;
user.name=name;
user.sc=sc;
table.put(user.name, user);
}else{
result="NAK!";
}
ByteBuffer bb = ByteBuffer.allocate( result.length() );
bb.put(result.getBytes());
bb.flip();
try {
sc.write(bb);
} catch (IOException e) {
e.printStackTrace();
}
bb.clear();
}else{ //普通聊天
//遍歷所有己注冊通道,向所有人發消息(包括發送者自己)
System.out.println("通道數:"+table.size());
Enumeration en=table.elements();
while(en.hasMoreElements()){
User user=(User)en.nextElement();
SocketChannel channel=user.sc;
if(user!=null && channel!=null && channel.isConnected()){
System.out.println("發送:str"+str);
ByteBuffer bb = ByteBuffer.allocate( str.length() );
bb.put(str.getBytes());
bb.flip();
try {
channel.write(bb);
} catch (IOException e) {
e.printStackTrace();
}
bb.clear();
}else{
if(user!=null && user.name!=null){
table.remove(user.name);
}
}
}
}

}

public class User{
public String name="";
public String password="";
public boolean isLogin=false;
public SocketChannel sc=null;
}

}

客戶端:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class UserClient implements ActionListener{
JFrame jf;
JPanel jp;
JLabel label_name;
JLabel label_pswd;
JTextField userName;
JButton jb;
JPasswordField paswrd;
JLabel hintStr;
public UserClient (){
jf=new JFrame("XXX 登陸系統");
jp=new JPanel();
jf.setContentPane(jp);
jf.setPreferredSize(new Dimension(350,220));
jp.setPreferredSize(new Dimension(350,220));
jp.setBackground(Color.gray);
label_name=new JLabel();
label_name.setPreferredSize(new Dimension(150,30));
label_name.setText("請輸入帳戶(數字或英文):");
userName=new JTextField();
userName.setPreferredSize(new Dimension(150,30));
jp.add(label_name);
jp.add(userName);
label_pswd=new JLabel();
label_pswd.setPreferredSize(new Dimension(150,30));
label_pswd.setText("請輸入密碼:");
jp.add(label_pswd);
paswrd=new JPasswordField();
paswrd.setPreferredSize(new Dimension(150,30));
jp.add(paswrd);
jb=new JButton("OK");
jb.setPreferredSize(new Dimension(150,30));
jb.setText("確 定");
jb.addActionListener( this);
jp.add(jb);
hintStr=new JLabel();
hintStr.setPreferredSize(new Dimension(210,40));
hintStr.setText("");
hintStr.setForeground(Color.RED);
jp.add(hintStr);
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

private String name;
private String pswd;
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jb){
name=userName.getText().trim();
pswd=new String(paswrd.getPassword());
if(pswd==null){
pswd="";
}else{
pswd=pswd.trim();
}
if(name!=null && name.length()>0){
hintStr.setText("正在驗證客戶端,請稍候...");
start();
}
}else
if(e.getSource()==clear){//清屏
text.setText("");
}else
if(e.getSource()==send){//發送
String msg=this.jtf.getText();
if(msg!=null){
if(msg.trim().length()>0){
msg=" "+name+" said:"+msg+"\r\n";
sendMessage(msg);
jtf.setText("");
}
}
}
}

OutputStream os;
Socket s;
InputStream is;
public void start(){
//建立聯網線程
new Thread(new Runnable(){
public void run() {
try {
s=new Socket("127.0.0.1",5555);
//寫
os=s.getOutputStream();
os.write(name.getBytes());
os.write('|');//用戶名與密碼用"|"分隔
os.write(pswd.getBytes());
os.flush();
//讀內容
Thread.sleep(1000);
is=s.getInputStream();
int len=is.available();
System.out.println("len:"+len);
byte[] bytes=new byte[len];
is.read(bytes);
String resut=new String(bytes);
System.out.println("resut:"+resut);
if(resut.equals("ACK")){
hintStr.setText("驗證成功,歡迎光臨!");
//TODO 這里通過返回結果處理
handleLoginResult();
}else{
paswrd.setText(null);
hintStr.setText("用戶名或密碼錯誤,請重新輸入");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
}
}
}).start();
}

////////////////////////////////////////////////////////////////////
//處理登陸結果,出新界面
//登陸後新界面的元素組件定義在這里,注意,
//現在隨便弄的,你要改漂亮些
////////////////////////////////////////////////////////////////////
JTextArea text;
JButton send;
JButton clear;
JTextArea jtf;
public void handleLoginResult(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.jp.removeAll();//清空所有組件;
jf.setSize(800,600);
jp.setSize(800,600);
jf.setPreferredSize(new Dimension(800,600));
jp.setPreferredSize(new Dimension(800,600));
//加聊天內容框
text=new JTextArea();
text.setBackground(Color.WHITE);
text.setForeground(Color.BLUE);
text.setPreferredSize(new Dimension(750,450));
jp.add(text);
//加發送內容框
jtf=new JTextArea();
jtf.setPreferredSize(new Dimension(750,50));
jp.add(jtf);
//加按鈕
send=new JButton("發送");
clear=new JButton("清屏");
send.setPreferredSize(new Dimension(100,30));
clear.setPreferredSize(new Dimension(100,30));
jp.add(send);
jp.add(clear);
send.addActionListener(this);
clear.addActionListener(this);
jf.pack();
jf.repaint();
//開始讀線程
readMessage();
}

//////////////////////////////////////////////////////
//發送消息線程
//////////////////////////////////////////////////////
public void sendMessage(String msg){
final String toSend=msg;
new Thread(
new Runnable(){
public void run(){
if(s==null ){
return;
}
//寫
try {
System.out.println("發送:"+toSend);
os.write(toSend.getBytes());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
).start();
}

/////////////////////////////////////////////////////////
//讀取線程,死循環,不停讀取
public boolean isRunning=true;
public void readMessage( ){
new Thread(
new Runnable(){
public void run(){
while(isRunning){
if(s==null ){
return;
}
try {
InputStream is=s.getInputStream();
int len=is.available();
//System.out.println("len:"+len);
byte[] bytes=new byte[len];
is.read(bytes);
String resut=new String(bytes);
//System.out.println("resut:"+resut);
if(resut!=null && resut.length()>0){
System.out.println("收到!!!resut:"+resut);
text.append(resut);
}
} catch (IOException e) {
e.printStackTrace();
}
//睡眠2秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
).start();
}

public static void main(String[] args) {
new UserClient();
}

}

⑹ NiO是什麼

Java NIO框架MINA用netty性能和鏈接數、並發等壓力測試參數好於mina。

特點:
1。NIO彌補了原來的I/O的不足,它再標准java代碼中提供了高速和面向塊的I/O
原力的I/O庫與NIO最重要的區別是數據打包和傳輸方式的不同,原來的I/O以流的方式處理數據,而NIO以塊的方式處理數據;

2.NIO以通道channel和緩沖區Buffer為基礎來實現面向塊的IO數據處理,MINA是開源的。

JavaNIO非堵塞應用通常適用用在I/O讀寫等方面,我們知道,系統運行的性能瓶頸通常在I/O讀寫,包括對埠和文件的操作上,過去,在打開一個I/O通道後,read()將一直等待在埠一邊讀取位元組內容,如果沒有內容進來,read()也是傻傻的等,這會影響我們程序繼續做其他事情,那麼改進做法就是開設線程,讓線程去等待,但是這樣做也是相當耗費資源的。

Java NIO非堵塞技術實際是採取Reactor模式,或者說是Observer模式為我們監察I/O埠,如果有內容進來,會自動通知我們,這樣,我們就不必開啟多個線程死等,從外界看,實現了流暢的I/O讀寫,不堵塞了。

Java NIO出現不只是一個技術性能的提高,會發現網路上到處在介紹它,因為它具有里程碑意義,從JDK1.4開始,Java開始提高性能相關的功能,從而使得Java在底層或者並行分布式計算等操作上已經可以和C或Perl等語言並駕齊驅。

如果至今還是在懷疑Java的性能,說明思想和觀念已經完全落伍了,Java一兩年就應該用新的名詞來定義。從JDK1.5開始又要提供關於線程、並發等新性能的支持,Java應用在游戲等適時領域方面的機會已經成熟,Java在穩定自己中間件地位後,開始蠶食傳統C的領域。

原理:
NIO 有一個主要的類Selector,這個類似一個觀察者,只要我們把需要探知socketchannel告訴Selector,我們接著做別的事情,當有事件發生時,他會通知我們,傳回一組SelectionKey,我們讀取這些Key,就會獲得我們剛剛注冊過的socketchannel,然後,我們從這個Channel中讀取數據,放心,包準能夠讀到,接著我們可以處理這些數據。Selector內部原理實際是在做一個對所注冊的channel的輪詢訪問,不斷的輪詢(目前就這一個演算法),一旦輪詢到一個channel有所注冊的事情發生。比如數據來了,他就會站起來報告,交出一把鑰匙,讓我們通過這把鑰匙來讀取這個channel的內容。在使用上,也在分兩個方向,一個是線程處理,一個是用非線程,後者比較簡單。

⑺ niop是什摸意思

全國青少年信息學奧林匹克聯賽(NOIP) 全國青少年信息學奧林匹克聯賽大綱 一、總則 由中國計算機學會負責組織的全國青少年信息學奧林匹克聯賽(NOIP)是全國信息學奧林匹克競賽(NOI)整個系列中的一個重要組成部分,旨在向中學生普及計算機基礎知識,培養計算機科學和工程領域的後備人才。普及的重點是根據中學生的特點,培養學生學習計算機的興趣,使得他們對信息技術的一些核心內容有更多的了解,提高他們創造性地運用程序設計知識解決實際問題的能力。對學生的能力培養將注重以下的幾個方面: *想像力與創造力; *對問題的理解和分析能力; *數學能力和邏輯思維能力; *對客觀問題和主觀思維的口頭和書面表達能力; *人文精神:包括與人的溝通能力,團隊精神與合作能力,恆心和毅力,審美能力等。 二、命題程序和組織機構 命題是選拔過程的重要一環,同時對計算機的普及的內容起著導向性的作用。命題應注重趣味性、新穎性、知識性、應用性和中學生的心智特點,不直接從大學專業教材中選題。 在命題和審題工作中,堅持開放和規范的原則。在NOI科學委員會主持下成立的聯賽命題委員會負責命題工作,命題委員會成員主要來自參加聯賽的省( 包括直轄市、自治區,下同。每個省最多派一名委員),也可來自社會計算機界。聯賽命題委員會的主要職責是提供聯賽的備選題目,並承擔對所提供的題目保密的責任。 1. 聯賽命題委員會委員應具備如下資格: *從事一線計算機教學或信息學奧賽輔導工作兩年(含)以上; *有精力和時間從事該項工作; *對此項工作有興趣並願意作為志願者從事NOIP命題及其相關工作。 2. 聯賽命題委員會委員的產生過程: *本人提出申請(填寫表格); *中學教師需所在單位同意或省奧賽主管部門同意; *科學委員會批准,由中國計算機學會頒發聘書(每一聘期為兩年)。 3. 聯賽命題委員會委員的職責: *每年為NOIP提供備選題題目若干,在9月1日之前提交科學委員會; *備選試題的保密期為2年,在該段時間內不得泄密或另作他用; *搜集本省信息學奧賽的有關信息並向科學委員會通報; 題目一經提交,即表明同意授權中國計算機學會科學委員會全權處理,包括使用、修改和出版。無論是委員提交的題目還是科學委員會直接提交的題目,試題版權均歸中國計算機學會所有,試題原型一旦被正式採用,中國計算機學會將出具試題錄用證明。科學委員會確定當年的聯賽試題,這些試題可能從備選題庫中選取並做適當修改後成型,也可能直接命題。 三、競賽形式和成績評定 聯賽分兩個等級組:普及組和提高組。每組競賽分兩輪:初試和復試。 *初試形式為筆試,側重考察學生的計算機基礎知識和編程的基本能力,並對知識面的廣度進行測試。初試為資格測試,各省初試成績在本賽區前15%的學生進入復賽。 *復試形式為上機,著重考察學生對問題的分析理解能力,數學抽象能力,編程語言的能力和編程技巧、想像力和創造性等。各省聯賽的等第獎在復試的優勝者中產生。 比賽中使用的程序設計語言是: *2003年:初賽:BASIC、PASCAL或C/C++;復賽:BASIC、PASCAL或C/C++。 *2004年:初賽:BASIC、PASCAL或C/C++:復賽:PASCAL或C/C++。 *2005年及之後:初賽:PASCAL或C/C++: 復賽:PASCAL或C/C++。 每年復賽結束後,各省必須在指定時間內將本省一等獎候選人的有關情況、源程序和可執行程序報送科學委員會。經復審確認後,由中國計算機學會報送中國科協和教育部備案。中國計算機學會對各省獲NOIP二等獎和三等獎的分數線或比例提出指導性意見,各省可按照成績確定獲獎名單。 四、試題形式 每次聯賽的試題分四組:普及組初賽題A1、普及組復賽題A2、提高組初賽題B1和提高組復賽題B2。其中,A1和B1類型相同,A2和B2類型相同,但題目不完全相同,提高組難度高於普及組。 *初賽:初賽全部為筆試,滿分100分。試題由四部分組成: 1、 選擇題:共20題,每題1.5分,共計30分。每題有5個備選答案,前10個題為單選題(即每題有且只有一個正確答案,選對得分),後10題為不定項選擇題(即每題有1至5個正確答案,只有全部選對才得分)。