Khái niệm
Nhập xuất dữ liệu là cơ chế giao tiếp giữa chương trình với môi trường bên ngoài. Ở mức cơ bản nhất, dữ liệu thường được nhập từ bàn phím và hiển thị ra màn hình.
Xuất dữ liệu
name = "Minh"
print("Xin chao,", name)
program OutputDemo;
var
name: String;
begin
name := 'Minh';
Writeln('Xin chao, ', name);
end.
#include <stdio.h>
int main(void) {
char name[] = "Minh";
printf("Xin chao, %s\n", name);
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string name = "Minh";
cout << "Xin chao, " << name << endl;
return 0;
}
string name = "Minh";
Console.WriteLine($"Xin chao, {name}");
const name = "Minh";
console.log(`Xin chao, ${name}`);
const name: string = "Minh";
console.log(`Xin chao, ${name}`);
package main
import "fmt"
func main() {
name := "Minh"
fmt.Printf("Xin chao, %s\n", name)
}
fn main() {
let name = "Minh";
println!("Xin chao, {}", name);
}
Nhập dữ liệu
name = input("Nhap ten: ")
print("Ban vua nhap:", name)
program InputDemo;
var
name: String;
begin
Write('Nhap ten: ');
Readln(name);
Writeln('Ban vua nhap: ', name);
end.
#include <stdio.h>
int main(void) {
char name[50];
printf("Nhap ten: ");
scanf("%49s", name);
printf("Ban vua nhap: %s\n", name);
return 0;
}
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cout << "Nhap ten: ";
cin >> name;
cout << "Ban vua nhap: " << name << endl;
return 0;
}
Console.Write("Nhap ten: ");
string name = Console.ReadLine() ?? "";
Console.WriteLine($"Ban vua nhap: {name}");
// Trong môi trường Node.js
const readline = require("readline");
const rl = readline.createInterface({ input: process.stdin });
rl.question("Nhap ten: ", (name) => {
console.log(`Ban vua nhap: ${name}`);
rl.close();
});
// Trong môi trường Node.js (ts-node)
import * as readline from "readline";
const rl = readline.createInterface({ input: process.stdin });
rl.question("Nhap ten: ", (name: string) => {
console.log(`Ban vua nhap: ${name}`);
rl.close();
});
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Nhap ten: ")
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
fmt.Printf("Ban vua nhap: %s\n", name)
}
use std::io;
use std::io::Write;
fn main() {
print!("Nhap ten: ");
io::stdout().flush().unwrap();
let mut name = String::new();
io::stdin().read_line(&mut name).unwrap();
let name = name.trim();
println!("Ban vua nhap: {}", name);
}
Nhập số từ bàn phím
Khi nhập từ bàn phím, dữ liệu thường được đọc vào dưới dạng chuỗi. Để dùng để tính toán, cần chuyển sang kiểu số phù hợp.
age_text = input("Nhap tuoi: ")
age = int(age_text) # chuyển chuỗi sang số nguyên
print("Nam sinh:", 2024 - age)
program ReadNumber;
var
age: Integer;
begin
Write('Nhap tuoi: ');
Readln(age); { Pascal tự chuyển đổi khi dùng biến Integer }
Writeln('Nam sinh: ', 2024 - age);
end.
#include <stdio.h>
int main(void) {
int age;
printf("Nhap tuoi: ");
scanf("%d", &age); /* scanf đọc trực tiếp vào biến int */
printf("Nam sinh: %d\n", 2024 - age);
return 0;
}
#include <iostream>
using namespace std;
int main() {
int age;
cout << "Nhap tuoi: ";
cin >> age; // cin tự chuyển đổi sang kiểu int
cout << "Nam sinh: " << (2024 - age) << endl;
return 0;
}
Console.Write("Nhap tuoi: ");
int age = int.Parse(Console.ReadLine() ?? "0");
Console.WriteLine($"Nam sinh: {2024 - age}");
// Trong môi trường Node.js
const readline = require("readline");
const rl = readline.createInterface({ input: process.stdin });
rl.question("Nhap tuoi: ", (text) => {
const age = parseInt(text);
console.log(`Nam sinh: ${2024 - age}`);
rl.close();
});
import * as readline from "readline";
const rl = readline.createInterface({ input: process.stdin });
rl.question("Nhap tuoi: ", (text: string) => {
const age: number = parseInt(text);
console.log(`Nam sinh: ${2024 - age}`);
rl.close();
});
package main
import "fmt"
func main() {
var age int
fmt.Print("Nhap tuoi: ")
fmt.Scan(&age) // fmt.Scan tự chuyển string sang int
fmt.Printf("Nam sinh: %d\n", 2024-age)
}
use std::io::{self, Write};
fn main() {
print!("Nhap tuoi: ");
io::stdout().flush().unwrap();
let mut text = String::new();
io::stdin().read_line(&mut text).unwrap();
let age: i32 = text.trim().parse().unwrap();
println!("Nam sinh: {}", 2024 - age);
}
Lưu ý khi làm việc với dữ liệu vào
- Luôn xác định kiểu dữ liệu mong muốn trước khi đọc giá trị.
- Cần quan tâm đến khoảng trắng, ký tự xuống dòng và giới hạn độ dài chuỗi.
- Nên kiểm tra dữ liệu đầu vào khi chương trình chuyển sang mức phức tạp hơn.
Ghi chú theo ngôn ngữ
input() luôn trả về chuỗi. Nếu cần số, phải chuyển kiểu bằng int() hoặc float(). Nếu người dùng nhập sai định dạng, chương trình sẽ báo lỗi ngay — nên thêm xử lý lỗi khi cần chương trình ổn định hơn.
Pascal tách rõ Write (không xuống dòng) và Writeln (xuống dòng sau khi in). Readln đọc một dòng hoàn chỉnh. Khi đọc trực tiếp vào biến kiểu Integer hoặc Real, Pascal tự chuyển đổi.
scanf đọc theo định dạng — %d cho số nguyên, %f cho số thực, %s cho chuỗi không có khoảng trắng. Cần đặt & trước tên biến khi dùng scanf. Với chuỗi có khoảng trắng, dùng fgets an toàn hơn.
cin >> đọc dữ liệu và tự chuyển sang kiểu biến tương ứng. Để đọc nguyên một dòng có khoảng trắng, dùng getline(cin, variable). Sau cin >>, cần gọi cin.ignore() trước khi dùng getline.
Console.ReadLine() trả về string? (nullable). Cần dùng int.Parse(), double.Parse(), hoặc Convert.ToInt32() để chuyển sang số. int.TryParse() là lựa chọn an toàn hơn — không báo lỗi nếu nhập sai.
Trong trình duyệt, prompt() mở hộp thoại nhập liệu. Trong Node.js, cần dùng module readline vì không có prompt(). Kết quả luôn là chuỗi — cần parseInt() hoặc parseFloat() để dùng tính toán.
TypeScript không thay đổi cách nhập xuất so với JavaScript. Chú ý khai báo kiểu đúng sau khi chuyển đổi: kết quả parseInt() có kiểu number, không phải string.
fmt.Scan() đọc và chuyển đổi trực tiếp sang kiểu biến. fmt.Scanln() dừng tại ký tự xuống dòng. Để đọc nguyên một dòng, dùng bufio.Scanner hoặc bufio.Reader.
read_line() đọc vào String và giữ cả \n ở cuối — cần .trim() trước khi chuyển đổi. .parse::<i32>() trả về Result nên cần .unwrap() (đơn giản) hoặc xử lý Err đúng cách (khuyến khích).
Kết nối kiến thức
Nhập xuất dữ liệu thường đi kèm rẽ nhánh và vòng lặp, vì dữ liệu nhận được thường cần kiểm tra rồi xử lý lặp lại.
Bình luận