Tổng hợp bài tập về terminal

Bài 1: Tạo ra 2 tuyến phụ

+ Tuyến phụ thứ 1 xuất ra các số lẻ từ 1 – 10, mỗi lần xuất sẽ cách nhau thời gian 1s.

+ Tuyến phụ thứ 2 xuất ra các số chẵn từ 1 – 10, mỗi lần xuất sẽ cách nhau thời gian 1s.

Lưu ý: Khi dán vào chương trình thì cần thay dấu ” trong hàm printf.

#include<stdio.h>
#include<pthread.h>
int so = 1;
void* sole()
{
while (so <= 9) {
if (so % 2 != 0) {
printf(“so le %d\n”, so);
so++;
}
sleep(1);
}pthread_exit(NULL);
}
void* sochan() {
while (so <= 10) {
if (so % 2 == 0) {
printf(“so chan %d\n”, so);
so++;
}
sleep(1);
}
pthread_exit(NULL);
}int main() {
pthread_t le, chan;
pthread_create(&le, NULL, sole, NULL);
pthread_create(&chan, NULL, sochan, NULL);
while(so <=10){
printf(“..\n”);
sleep(1);
}
return 0;
}

Biên dịch: gcc file.c -o tenfilemoi -lpthread

./tenfilemoi

Bài 2: Nhập mảng, xuất mảng và xuất các số nguyên tố trong mảng vừa đã nhập.

– Sử dụng thư viện liên kết động

//Ham nhap mang

void nhapmang(int a[], int n){
int i;
for(i=0;i<n;i++){
printf(“a[%d]= “,i);
scanf(“%d”,&a[i]);
}
}

//Ham xuat mang

void xuatmang(int a[], int n){
int i;
for(i=0; i<n;i++)
printf(“%4d”,a[i]);
}

//Ham kiem tra so nguyen to

int ktsnt(int n){
int d=0;
if(n<2)
return 1;
if(n==2)
return 0;
int i;
for(i=2; i<=n/2; i++){
if(n%i==0)
d=d+1;
}
if(d==0)
return 0;
return 1;
}

//Xuat so nguyen to trong mang

void xuatsnt(int a[], int n){
int i;
for(i=0;i<n;i++){
if(ktsnt(a[i])==0)
printf(“%d “,a[i]);
}

}

//Ham tong ket lai

#include <stdio.h>
int main(){
int n,a[100];
printf(“nhap n: “);
scanf(“%d”,&n);
nhapmang(a,n);
xuatmang(a,n);
printf(“\nso nguyen to trong mang la: “);
xuatsnt(a,n);
return 0;
}

Biên dịch:

gcc -c -fpic nhapmang.c xuatmang.c ktsnt.c xuatsnt.c

gcc shared nhapmang.o xuatmang.o ktsnt.o xuatsnt.o libfoo.so

gcc main.c -o bai2 -L. -lfoo

LD_LIBRARY_PATH=.:

export LD_LIBRARY_PATH

./bai2

Bài 3: Xuất ra các số từ 1 – 10 mỗi lần in cách nhau 1s, nếu trong quá trình thực hiện người dùng nhấn phím ctrl + z thì xuất ra hoten_mssv sau đó tiếp tục thực hiện chương trình.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void battinhieu(int tinhieu){
signal(SIGTSTP,battinhieu);
printf(“\nnguyenvanthanh_123”);
}
int main(){
int i=1;
signal(SIGTSTP,battinhieu);
for(i=1; i<=10;i++){
printf(“\n%d”,i);
sleep(1);
}
}

Biên dịch: gcc file.c -o tenfilemoi

./tenfilemoi

Bài 4: Tạo ra đường ống 1 chiều đếm ký tự nhập được từ bàn phím.

#include <stdio.h>
#include <unistd.h>
void duongongcon(int duongong[])
{
int c,dem;
dem=0;
close(duongong[1]);
while((read(duongong[0],&c,1))>0)
{
dem++;
if(toascii(putchar(c))==10)
break;
}
printf(“\nso ki tu doc duoc la:%d”,dem-1);
close(duongong[0]);
}
void duongongcha(int duongong[])
{int c;
close(duongong[0]);
while((c=getchar() )>0)
{
write(duongong[1],&c,1);
}
close(duongong[1]);
}
int main()
{
int duongong[2];
int pid;
pipe(duongong);
pid= fork();
switch(pid)
{
case 0:
duongongcon(duongong);
default:
duongongcha(duongong);
}
return 0;
}

Biên dịch: gcc file.c -o tenfilemoi

./tenfilemoi

Bài 5: Viết chương trình nhập mảng, xuất mảng và liệt kê các số chẵn không chia hết cho 3. Chúng ta sẽ sử dụng thư viện liên kết tỉnh.

//Nhap mang

void nhapmang(int a[], int n){
int i;
for( i=0; i<n;i++){
printf(“a[%d]= “,i);
scanf(“%d”,&a[i]);

}
}

//Xuat mang

void xuatmang(int a[], int n){
int i;
for(i=0; i<n;i++)
printf(“%4d”,a[i]);
}

//Liệt kê

void lietke(int a[], int n){
int i;
for(i=0; i<n;i++){
if(a[i]%2==0){
if(a[i]%3 != 0){
printf(“%d “,a[i]);
}
}

}

}

//Hàm main

#include <stdio.h>
int main(){
int n, a[100];
printf(“nhap n: “);
scanf(“%d”,&n);
nhapmang(a,n);
xuatmang(a,n);
printf(“\n”);
lietke(a,n);
return 0;
}

Biên dịch:

gcc -c nhapmang.c xuatmang.c lietke.c

ar cvr libfoo.a nhapmang.o xuatmang.o lietke.o

gcc main.c -o bai5 -L. -lfoo

./bai5