Tải bản đầy đủ (.pdf) (48 trang)

Ôn tập giữa kỳ môn kỹ thuật lập trình đại học sài gòn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (584.81 KB, 48 trang )

Ôn tập giữa kỳ
Trịnh Tấn Đạt
Khoa CNTT - Đại Học Sài Gòn
Email:
Website: />

1) Cho file input.txt như sau:
127 19 101 11 10 2 5 100 31
a) Đọc file và lưu trữ bằng mảng một chiều sử dụng con trỏ
b) Tính tổng các phần tử của mảng
c) Hai số nguyên dương a và b gọi là nguyên tố cùng nhau nếu ước số chung lớn
nhất của chúng là 1. Đếm xem trong file input có bao nhiêu cặp số ngun tố
cùng nhau.
d) Tìm giá trị lớn thứ nhất, thứ nhì của dãy
e) Tìm dãy con liên tiếp không giảm dài nhất. In ra chiều dài dãy con tìm được
f) Sắp xếp mảng tăng dần
* Yêu cầu: Kết quả ghi vào file output.txt (thay vì in ra màn hình)


void readFromFile(FILE *file , int *&Arr, int &n)
{ // C1: dung EoF
// cap phat dong nhung chua biet chinh xac so luong phan tu
Arr = new int[100];
n = 0;
// doc tung phan tu tu file va luu vao mang
// cho den khi het file EOF
while(!feof(file))
{
fscanf(file, "%d", &Arr[n]);
n++;
}


}


int Tongmang(int *Arr, int n)
{
int sum = 0;
for (int i = 0;i sum = sum+Arr[i];
return sum;
}


int gcd(int a, int b){
// Neu a = 0 => ucln(a,b) = b
// Neu b = 0 => ucln(a,b) = a
if (a == 0 || b == 0){
return a + b;
}
while (a != b){
if (a > b){
a -= b; // a = a - b
}else{
b -= a; // b= b-a;
}
}
return a; // return a or b, b?i vì lúc này a và b b?ng nhau
}


int DemSNTCN(int *Arr, int n)

{ int i, j;
int dem = 0;
for(i = 0;ifor (j=i+1;jif(gcd(Arr[i],Arr[j])==1)
dem++;
return dem;
}


void sapxeptang(int *&Arr, int n)
{
int i, j , temp;
for(i = 0;ifor (j=i+1;jif(Arr[i]>Arr[j])
{
temp = Arr[i];
Arr[i] = Arr[j];
Arr[j] = temp;
}
}


#include <iostream>
#include <stdlib.h>
int main()
{
// mo file de doc
FILE* fi = fopen("F:\\input_5.txt", "rt");

if (fi == NULL)
{
cout << "khong mo dc file";
return 0;
}
//doc du lieu
int n;
int *A;
readFromFile(fi, A, n);
// in mang ra man hinh
for (int i = 0; i < n; i++)
{
cout << A[i] << " ";
}
// …

//…
FILE *fo = fopen("F:\\output_5.txt", "w+t");
int kqb = Tongmang(A,n);
fprintf(fo, "Cau b: %d \n",kqb);
int kqc = DemSNTCN(A,n);
fprintf(fo, "Cau c: %d \n",kqc);
sapxeptang(A,n);
fprintf(fo, "Cau f: ");
for (int i = 0; i < n; i++)
{
fprintf(fo, "%d ", A[i]);
}
fprintf(fo, "\n");
//dong file

fclose(fi);
fclose(fo);
return 0;
}


Bài tập
2) Cho file input.txt như sau:
+ Dòng đầu tiên: ghi số lượng phần tử n
+ Dòng tiếp theo: ghi n số nguyên, các nhau ít nhất một khoảng trắng
Ví dụ :
File : input.txt
7
1 2 -5 4 -10 6 8

a) Đọc file và lưu trữ bằng mảng một chiều. (có thể dùng mảng tĩnh hoặc con trỏ)
b) Đếm số lượng số nguyên tố
c) Tính tổng các chữ số của các số nguyên dương
d) Sắp xếp mảng giảm dần
* Yêu cầu: ghi kết quả ra file output.txt


void readFromFile(FILE *file , int *&Arr, int &n)
{
// doc dong dau tien trong file
// luu so luong phan tu n
fscanf(file, "%d", &n);
Arr = new int[n]; // cap phat dong
// doc tung phan tu tu file va luu vao mang
for (int i = 0; i < n; i++)

fscanf(file, "%d", &Arr[i]);
}


void sapxepgiam(int *&Arr, int n)
{
int i, j , temp;
for(i = 0;ifor (j=i+1;jif(Arr[i]{
temp = Arr[i];
Arr[i] = Arr[j];
Arr[j] = temp;
}
}


int ktsnt(int k)
{
if(k<2) return 0;
for(int i=2; i<=sqrt(k);i++)
if(k%i ==0) return 0;
return 1;
}
int Demsnt (int *Arr, int n)
{
int i = 0,dem = 0;
for (i =0;iif (ktsnt(Arr[i])==1)

dem++;
return dem;
}


int countdigits(int k)
{
int temp, count=0;
temp = k;
while(temp!=0)
{
temp = temp/10;
count ++;
}
return count;
}
int countalldigits(int *Arr, int n)
{
int i= 0, tong = 0, temp;
for (i = 0; i< n; i++)
if(Arr[i]>0)
tong = tong+countdigits(Arr[i]);
return tong;
}


#include <iostream>
#include <stdlib.h>
#include <math.h>
int main()

{
// mo file de doc
FILE* fi = fopen("F:\\input_6.txt", "rt");
if (fi == NULL)
{
cout << "khong mo dc file";
return 0;
}
//doc du lieu
int n;
int *A;
readFromFile(fi, A, n);
// in mang ra man hinh
for (int i = 0; i < n; i++)
{
cout << A[i] << " ";
}
//..

//..
FILE *fo = fopen("F:\\output_6.txt", "w+t");
int kqb = Demsnt(A,n);
fprintf(fo,"Cau b: %d\n",kqb);
int kqc = countalldigits(A,n);
fprintf(fo,"Cau c: %d\n",kqc);
sapxepgiam(A,n);
fprintf(fo,"Cau d: ");
for (int i = 0; i < n; i++)
{
fprintf(fo, "%d ", A[i]);

}
fprintf(fo, "\n");
//dong file
fclose(fi);
fclose(fo);
return 0;
}


Ví dụ
Đọc ghi FILE cho mảng 2 chiều (dùng dạng 1)



Tạo file input_2.txt có dạng sau
Mảng 2 chiều kích thước
2x3 được lưu trong file
input_2.txt

10

-20

4

50

-10

20


File : input_2.txt

23
10 -20 4
50 -10 20

- Đọc dữ liệu từ file và lưu trữ bằng mảng 2 chiều A (mxn)
- In mảng ra màn hình.
- Tìm giá trị nhỏ nhất của các giá trị lớn nhất trên mỗi cột
- Tạo mảng B từ mảng A sao cho
bij = aij * tj ( tj là giá trị lớn nhất trên cột j)


Tìm giá trị nhỏ nhất của các giá trị lớn nhất trên mỗi cột
int maxcot(int a[][100], int m, int n, int c)
{ int i;
//xet cot c
int maxc = a[0][c]; // linh canh tai dong 0 cot c
for (i= 1; i{
if(a[i][c] > maxc)
maxc = a[i][c];
}
return maxc;
}


Tìm giá trị nhỏ nhất của các giá trị lớn nhất trên mỗi cột
int findmin(int a[][100],int m, int n)

{
int minvalue = INT_MAX; // khoi tao linh canh
int maxc;
for (int i= 0; i < n ; i ++)
{
maxc = maxcot(a,m,n,i); // tim max moi cot i
if (maxc < minvalue)
minvalue = maxc;
}
return minvalue;
}


-Tạo mảng B từ mảng A sao cho
bij = aij * tj ( tj là giá trị lớn nhất trên cột j)
void taomangB(int a[][100], int m, int n, int b[][100])
{
// tao mang b tu mang a
for (int j= 0; j< n ; j++) // duyet cot
{
int maxc = maxcot(a,m,n,j); // max cot j
for (int i=0;i{
b[i][j] = a[i][j] * maxc;
}
}
}


Ôn tập mảng

Phát sinh ngẫu nhiên một mảng các số ngun dương có N phần tử trong
đoạn [1, 1000].
a) Tính trung bình cộng các số chẵn.
b) Tìm số nguyên tố lớn nhất nhỏ hơn tất cả các giá trị có trong mảng. (Nếu
không tồn tại giá trị thỏa điều kiện xuất ra giá trị -1.)

c) Sắp xếp mảng theo quy luật:
- Các số chẵn (nếu có) ở đầu mảng và có thứ tự giảm dần.
- Các số lẻ (nếu có) ở cuối mảng và có thứ tự tăng dần.


BT 1a)
Tính trung bình cộng các số chẵn

double TBC_sochan(int a[], int n)
{
double s=0,d=0;
for(int i=0;i{
if(a[i]%2==0)
{
s=s+a[i];
d++;
}
}
return s/d;
}


.b)mảng.

Tìm số nguyên tố lớn nhất nhỏ hơn tất cả các giá trị có trong
(Nếu khơng tồn tại giá trị thỏa điều kiện xuất ra giá trị -1.)
void sntcantim(int a[], int n)
{
int i= min_cua_mang(a,n);
i--;
if(i>=2)
{
while(!ktsnt(i))
{
i--;
}
cout<<" Cau 1.b:" <}
else
cout<<" Cau1.b: -1"<}

int ktsnt(int n)
{
if(n< 2) return 0;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return 0;
return 1;
}
int min_cua_mang(int a[],int n)
{
int min=a[0];
for(int i=1;i{

if(a[i]min=a[i];
}
return min;
}


BT 2
a)
a) Phát sinh ngẫu nhiên một ma trận thưa kích thước N x N (N>=3) các số
nguyên dương trong đoạn [1, 1000]. (các phần tử khác 0 trong ma trận
được tạo ngẫu nhiên - vị trí và giá trị)
Yêu cầu số lượng các phần tử khác 0 phải lớn hơn 1 và nhỏ hơn (N*N)/2 (
tổng số lượng các phần tử khác 0 được nhập từ bàn phím)
In ma trận ra màn hình.


.Hàm khởi tạo ma trận toàn số 0
void tao_mang_so_0(int a[][100], int N)
{
for(int i=0;ifor(int j=0;ja[i][j]=0;
}
void xuatmang2chieu(int a[][100], int m)
{
for (int i=0;i{
for (int j=0;jcout<

cout<}
}


void tao_ma_tran_thua_2a(int a[][100], int &N, int &K)
{
N = 3+rand()%(6-3+1); // N thuoc[3,6]
tao_mang_so_0(a,N); // tao mang toan so 0
K= 1+ rand()%((N*N)/2); // so luong phan tu khac 0
int dem = 0;
while(dem{ //tao ngau nhien vi tri
int i=rand()%(N);
int j=rand()%(N);
//kiem tra vi tri trung
if (a[i][j]!=0) // bi trung
{ cout <<"trung vitri:"<< i << " " << j << endl;
continue;
}
else
{ // khong bi trung
cout <<"vi tri:"<< i << " " << j << endl;
a[i][j]=1+rand()%1000;
dem ++ ; // them vao 1 vi tri
}
}
}



b) Chuyển sang triples
void tao_ma_tran_triples(int a[][100], int N, int K, int triples[][100])
{
int i, j, index;
index = 0; // chi so cot trong triples
for(int i=0;ifor(int j=0;j{
if(a[i][j]!=0)
{
triples[0][index] = i;
triples[1][index] = j;
triples[2][index] = a[i][j];
index ++;
}
}
}


×