Bài 32:
#include<stdio.h>
#include<string.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct cs{
char tu[100];
int sl;
};
int tim(int n, char s[], cs ds[]){
for(int i=0;i<n;i++){
if(strcmp(s,ds[i].tu)==0)
return i;
}
return -1;
}
main()
{
int n=0,i=0;
char s[100];
cs ds[100];
char ss[6];
while(!feof(f1)){
fscanf(f1,"%s",&s);
int k=tim(n,s,ds);
if(k==-1){
strcpy(ds[n].tu,s);
ds[n].sl=1;
n++;
}
else
ds[k].sl++;
}
int max=strlen(ds[0].tu);
for(int i=0;i<n;i++){
if(strlen(ds[i].tu)>max)
max=strlen(ds[i].tu);
}
for(int i=0;i<n;i++){
if(strlen(ds[i].tu)==max)
printf("%s %d\n",ds[i].tu,max);
}
}
Bài 33
#include<stdio.h>
#include<math.h>
#include<string.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct SV{
char ten[20];
char ngaysinh[20];
int maso;
float d1,d2,d3;
};
void timmax(int n, SV ds[]){
float max=ds[0].d1+ds[0].d2+ds[0].d3;
for(int i=0;i<n;i++){
if(ds[i].d1+ds[i].d2+ds[i].d3>max){
max=ds[i].d1+ds[i].d2+ds[i].d3;
}
}
for(int i=0;i<n;i++){
if(ds[i].d1+ds[i].d2+ds[i].d3==max){
fprintf(f2,"%d %s %s %.2f\n",ds[i].maso,ds[i].ten,ds[i].ngaysinh,ds[i].d1+ds[i].d2+ds[i].d3);
}
}
}
main()
{
int t;
int i=0,dem=0;
fscanf(f1,"%d",&t);
SV ds[100];
char ss[6];
fgets(ss,5,f1);
while(t--){
dem++;
ds[i].maso=dem;
fgets(ds[i].ten,20,f1);
ds[i].ten[strlen(ds[i].ten)-1]='\0';
fgets(ds[i].ngaysinh,20,f1);
ds[i].ngaysinh[strlen(ds[i].ngaysinh)-1]='\0';
fscanf(f1,"%f%f%f",&ds[i].d1,&ds[i].d2,&ds[i].d3);
fgets(ss,5,f1);
i++;
}
timmax(dem,ds);
}
Bài 34.
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct cs{
int so;
int sl;
};
int nt(int n){
if(n<2)
return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)
return 0;
}
return 1;
}
int tim(int n, int m, cs ds[]){
for(int i=0;i<n;i++){
if(ds[i].so==m)
return i;
}
return -1;
}
void sapxep(int n,cs ds[]){
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(ds[i].sl<ds[j].sl){
cs tam=ds[i];
ds[i]=ds[j];
ds[j]=tam;
}
}
}
}
main()
{
int n=0;
int s;
char ss[6];
cs ds[100];
fgets(ss,5,f1);
while(!feof(f1)){
fscanf(f1,"%d",&s);
if(nt(s)){
int k=tim(n,s,ds);
if(k==-1){
ds[n].so=s;
ds[n].sl=1;
n++;
}
else
ds[k].sl++;
}
}
sapxep(n,ds);
for(int i=0;i<n;i++){
fprintf(f2,"%d %d\n",ds[i].so,ds[i].sl);
}
}
Bài 35:
#include<stdio.h>
#include<math.h>
#include<string.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct cs{
int so;
int sl;
};
int tn(int n){
int s=0,m=n;
while(n){
s=10*s+n%10;
n=n/10;
}
if(s==m)
return 1;
return 0;
}
int tim(int n, int m, cs ds[]){
for(int i=0;i<n;i++){
if(m==ds[i].so)
return i;
}
return -1;
}
void sapxep(int n, cs ds[]){
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(ds[i].sl<ds[j].sl){
cs s=ds[i];
ds[i]=ds[j];
ds[j]=s;
}
}
}
}
main()
{
cs ds[100];
int n=0,s,t=0;
while(!feof(f1)){
fscanf(f1,"%d",&s);
t++;
if(tn(s)){
int k=tim(n,s,ds);
if(k==-1){
ds[n].so=s;
ds[n].sl=1;
n++;
}
else
ds[k].sl++;
}
}
sapxep(n,ds);
for(int i=0;i<n;i++){
fprintf(f2,"%d %d\n",ds[i].so,ds[i].sl);
}
int d=0;
for(int i=0;i<n;i++){
d=d+ds[i].sl;
}
fprintf(f2,"tong so %d/%d ",d,t);
}
Thứ Bảy, 16 tháng 7, 2016
Step 13 .Một số bài tập sử dụng vào ra file.
Bài 29:
Bài 30:Cho một ma trận có N hàng và M cột chỉ gồm các số nguyên dương không quá 100 (1<N,M<10). Hãy
viết chương trình loại bỏ hàng có tổng các phần tử là lớn nhất ra khỏi ma trận. Nếu có hai hàng trở lên
có tổng các phần tử bằng nhau thì chọn hàng có thứ tự nhỏ hơn.
Dữ liệu vào: File BAI2.INP
Dòng 1 ghi số bộ test. Với mỗi bộ test: dòng đầu ghi 2 số N và M. Tiếp theo là N hàng, mỗi hàng M
phần tử của ma trận.
Kết quả: File BAI2.OUT với mỗi bộ test ghi trên N-1 hàng các phần tử của ma trận kết quả. Mỗi
phần tử cách nhau đúng một khoảng trống. Sau mỗi bộ test in ra một dòng trống.
code:
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI2.INP","r");
FILE*f2=fopen("BAI2.OUT","w");
void nhap(int n, int m, int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
fscanf(f1,"%d",&a[i][j]);
}
}
}
void xoa(int n, int m, int a[][10]){
int max=0,k=1,t=0,dd=0;
for(int i=0;i<m;i++){
max=max+a[0][i];
}
while(t<n){
int k=0;
for(int i=0;i<m;i++){
k=k+a[t][i];
}
if(k>max){
max=k;
dd=t;
}
t++;
}
for(int i=0;i<n;i++){
if(i!=dd){
for(int j=0;j<n;j++){
fprintf(f2,"%d ",a[i][j]);
}
fprintf(f2,"\n");
}
}
}
main()
{
int t;
fscanf(f1,"%d",&t);
char s[6];
fgets(s,5,f1);
while(t--){
int n,m,a[10][10];
fscanf(f1,"%d%d",&n,&m);
nhap(n,m,a);
xoa(n,m,a);
fprintf(f2,"\n");
}
}
Bài 31: Một số được coi là đẹp nếu nó là số nguyên tố và tổng chữ số là một số trong dãy Fibonaci. Bài toán
đặt ra là đếm xem trong một đoạn giữa hai số nguyên cho trước có bao nhiêu số đẹp như vậy.
Dữ liệu vào: File: BAI1.INP
Dòng đầu tiên ghi số bộ test.
Mỗi bộ test viết trên một dòng hai số nguyên dương tương ứng, cách nhau một khoảng trống.
Các số đều không vượt quá 9 chữ số.
Kết quả: BAI1.OUT
Mỗi bộ test viết ra số lượng các số đẹp tương ứng.
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI1.INP","r");
FILE*f2=fopen("BAI1.OUT","w");
int nt(int n){
if(n<2)
return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)
return 0;
}
return 1;
}
int fb(int n){
int f1=0,f2=1,f3;
while(f1<100){
f3=f1+f2;
f1=f2;
f2=f3;
if(n==f3)
return 1;
}
return 0;
}
int tong(int n){
int s=0;
while(n){
s=s+n%10;
n/=10;
}
if(fb(s))
return 1;
return 0;
}
main()
{
int t;
fscanf(f1,"%d",&t);
while(t--){
int n,m,d=0;
fscanf(f1,"%d%d",&n,&m);
for(int i=n;i<=m;i++){
if(tong(i)&&nt(i))
d++;
}
fprintf(f2,"%d\n",d);
}
}
Bài 30:Cho một ma trận có N hàng và M cột chỉ gồm các số nguyên dương không quá 100 (1<N,M<10). Hãy
viết chương trình loại bỏ hàng có tổng các phần tử là lớn nhất ra khỏi ma trận. Nếu có hai hàng trở lên
có tổng các phần tử bằng nhau thì chọn hàng có thứ tự nhỏ hơn.
Dữ liệu vào: File BAI2.INP
Dòng 1 ghi số bộ test. Với mỗi bộ test: dòng đầu ghi 2 số N và M. Tiếp theo là N hàng, mỗi hàng M
phần tử của ma trận.
Kết quả: File BAI2.OUT với mỗi bộ test ghi trên N-1 hàng các phần tử của ma trận kết quả. Mỗi
phần tử cách nhau đúng một khoảng trống. Sau mỗi bộ test in ra một dòng trống.
code:
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI2.INP","r");
FILE*f2=fopen("BAI2.OUT","w");
void nhap(int n, int m, int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
fscanf(f1,"%d",&a[i][j]);
}
}
}
void xoa(int n, int m, int a[][10]){
int max=0,k=1,t=0,dd=0;
for(int i=0;i<m;i++){
max=max+a[0][i];
}
while(t<n){
int k=0;
for(int i=0;i<m;i++){
k=k+a[t][i];
}
if(k>max){
max=k;
dd=t;
}
t++;
}
for(int i=0;i<n;i++){
if(i!=dd){
for(int j=0;j<n;j++){
fprintf(f2,"%d ",a[i][j]);
}
fprintf(f2,"\n");
}
}
}
main()
{
int t;
fscanf(f1,"%d",&t);
char s[6];
fgets(s,5,f1);
while(t--){
int n,m,a[10][10];
fscanf(f1,"%d%d",&n,&m);
nhap(n,m,a);
xoa(n,m,a);
fprintf(f2,"\n");
}
}
Bài 31: Một số được coi là đẹp nếu nó là số nguyên tố và tổng chữ số là một số trong dãy Fibonaci. Bài toán
đặt ra là đếm xem trong một đoạn giữa hai số nguyên cho trước có bao nhiêu số đẹp như vậy.
Dữ liệu vào: File: BAI1.INP
Dòng đầu tiên ghi số bộ test.
Mỗi bộ test viết trên một dòng hai số nguyên dương tương ứng, cách nhau một khoảng trống.
Các số đều không vượt quá 9 chữ số.
Kết quả: BAI1.OUT
Mỗi bộ test viết ra số lượng các số đẹp tương ứng.
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI1.INP","r");
FILE*f2=fopen("BAI1.OUT","w");
int nt(int n){
if(n<2)
return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)
return 0;
}
return 1;
}
int fb(int n){
int f1=0,f2=1,f3;
while(f1<100){
f3=f1+f2;
f1=f2;
f2=f3;
if(n==f3)
return 1;
}
return 0;
}
int tong(int n){
int s=0;
while(n){
s=s+n%10;
n/=10;
}
if(fb(s))
return 1;
return 0;
}
main()
{
int t;
fscanf(f1,"%d",&t);
while(t--){
int n,m,d=0;
fscanf(f1,"%d%d",&n,&m);
for(int i=n;i<=m;i++){
if(tong(i)&&nt(i))
d++;
}
fprintf(f2,"%d\n",d);
}
}
Step 12 . Vào ra File
Ví du:
-Giải thích chương trình
- Dòng 9: FILE *f;: khai báo biến con trỏ f có kiểu cấu trúc FILE.
- Dòng 15: if(f = fopen("int_data.dat", "wb") == NULL): là câu lệnh mở tập tin có
tên int_data.dat ở mode "w" (ghi ) dạng "b" (nhị phân), sau khi lệnh này thực hiện xong trả về
dạng con trỏ FILE và gán cho f, nếu kết quả trả về = NULL thì không thể mở được tập tin, tập tin
mở ở mode "w" nếu trên đĩa đã có sẵn tập tin này thì nội dung của nó sẽ bị ghi đè, nếu chưa có thì
tập tin sẽ được tạo mới.
- Dòng 22: fwrite(&i, sizeof(int), 1, f);: ghi thông tin vào tập tin, thông tin được ghi
vào mỗi lần là một số nguyên i. Hàm này có 4 đối số: địa chỉ để ghi cấu trúc, kích thước của cấu
trúc và số cấu trúc sẽ ghi, sau cùng là con trỏ để trỏ tới tập tin.
- Dòng 23: fclose(f);: đóng tập tin
- Dòng 26: f = fopen("int_data.dat", "rb");: mở tập tin có tên int_data.dat ở mode
"r" (đọc) dạng "b" (nhị phân). Tập tin phải có sẵn trên đĩa.
- Dòng 27: while(fread(&i, sizeof(int), 1, f) == 1): đọc thông tin từ tập tin, mỗi lần
đọc một số nguyên và lưu vào biến i. Mỗi lần đọc thành công giá trị trả về sẽ là số cấu trúc thực
sự được đọc, nếu giá trị trả về = 0 báo hiệu kết thúc file.
-
Các mode mở tập tin:
"a": mở để nối thêm, thông tin sẽ được ghi thêm vào cuối của tập tin đã có hoặc tạo tập
tin mới nếu chưa có trên đĩa.
- "r+": mở để vừa đọc vừa ghi, tập tin phải có sẵn trên đĩa.
- "w+": mở để vừa đọc vừa ghi, nội dung của tập tin đã có trên đĩa sẽ bị ghi đè lên.
- "a+": mở để đọc và nối thêm, nếu trên đĩa chưa có tập tin nó sẽ được tạo mới.
-Giải thích chương trình
- Dòng 9: FILE *f;: khai báo biến con trỏ f có kiểu cấu trúc FILE.
- Dòng 15: if(f = fopen("int_data.dat", "wb") == NULL): là câu lệnh mở tập tin có
tên int_data.dat ở mode "w" (ghi ) dạng "b" (nhị phân), sau khi lệnh này thực hiện xong trả về
dạng con trỏ FILE và gán cho f, nếu kết quả trả về = NULL thì không thể mở được tập tin, tập tin
mở ở mode "w" nếu trên đĩa đã có sẵn tập tin này thì nội dung của nó sẽ bị ghi đè, nếu chưa có thì
tập tin sẽ được tạo mới.
- Dòng 22: fwrite(&i, sizeof(int), 1, f);: ghi thông tin vào tập tin, thông tin được ghi
vào mỗi lần là một số nguyên i. Hàm này có 4 đối số: địa chỉ để ghi cấu trúc, kích thước của cấu
trúc và số cấu trúc sẽ ghi, sau cùng là con trỏ để trỏ tới tập tin.
- Dòng 23: fclose(f);: đóng tập tin
- Dòng 26: f = fopen("int_data.dat", "rb");: mở tập tin có tên int_data.dat ở mode
"r" (đọc) dạng "b" (nhị phân). Tập tin phải có sẵn trên đĩa.
- Dòng 27: while(fread(&i, sizeof(int), 1, f) == 1): đọc thông tin từ tập tin, mỗi lần
đọc một số nguyên và lưu vào biến i. Mỗi lần đọc thành công giá trị trả về sẽ là số cấu trúc thực
sự được đọc, nếu giá trị trả về = 0 báo hiệu kết thúc file.
-
Các mode mở tập tin:
"a": mở để nối thêm, thông tin sẽ được ghi thêm vào cuối của tập tin đã có hoặc tạo tập
tin mới nếu chưa có trên đĩa.
- "r+": mở để vừa đọc vừa ghi, tập tin phải có sẵn trên đĩa.
- "w+": mở để vừa đọc vừa ghi, nội dung của tập tin đã có trên đĩa sẽ bị ghi đè lên.
- "a+": mở để đọc và nối thêm, nếu trên đĩa chưa có tập tin nó sẽ được tạo mới.
Step 11 Một số ví dụ sử dụng chuỗi
Bài 22 : Viết chương trình
chuyển đổi một số tự nhiên ở hệ cơ số 10 thành số ở hệ cơ số b bất kì (1< b≤
36).
Gỉa thích: Dòng 2: là hàm chuyển đổi cơ số.
Bài 23: . Nhập một xâu ký tự. Đếm số từ của xâu ký tự đó. Thí dụ " Trường học " có 2 từ.
giải thích : Dòng 9: strlen(s) : là hàm độ dài của xâu s. Hàm này trong thư viện String.
Bài 24: Sử dụng xâu ký tự để viết hàm kiểm tra số thuận nghịch. Áp dụng để in ra các số thuận nghịch có 6 chữ số.
giải thích: Dòng 15: itoa là hàm đổi cơ số của i.
Bài 25 Viết chương trình nhập vào một xâu ký tự s bất kỳ, sau đó chuyển sang dạng xen kẽ chữ in hoa và chữ in thường. Ví dụ s = ABCDefgh thì kết quả là AbCdEfGh
Gỉa thích: dòng 8: strupr() : là hàm đổi toàn bộ xâu s thành chữ hoa. ngược lại strlwr(s) đổi toàn bộ xâu s thành chữ thường.
Bài 26:
Viết chương trình thực hiện chuẩn hoá một xâu ký tự nhập từ bàn phím (loại bỏ các dấu cách thừa, chuyển ký tự đầu mỗi từ thành chữ hoa, các ký tự khác thành chữ thường)
Bài 27 Nhập một xâu ký tự, in ra cho biết có bao nhiêu ký tự là nguyên âm, phụ âm, ký tự số và ký tự khác.
4
Gỉa thích: Dòng 2: là hàm chuyển đổi cơ số.
Bài 23: . Nhập một xâu ký tự. Đếm số từ của xâu ký tự đó. Thí dụ " Trường học " có 2 từ.
giải thích : Dòng 9: strlen(s) : là hàm độ dài của xâu s. Hàm này trong thư viện String.
Bài 24: Sử dụng xâu ký tự để viết hàm kiểm tra số thuận nghịch. Áp dụng để in ra các số thuận nghịch có 6 chữ số.
giải thích: Dòng 15: itoa là hàm đổi cơ số của i.
Bài 25 Viết chương trình nhập vào một xâu ký tự s bất kỳ, sau đó chuyển sang dạng xen kẽ chữ in hoa và chữ in thường. Ví dụ s = ABCDefgh thì kết quả là AbCdEfGh
Gỉa thích: dòng 8: strupr() : là hàm đổi toàn bộ xâu s thành chữ hoa. ngược lại strlwr(s) đổi toàn bộ xâu s thành chữ thường.
Bài 26:
Viết chương trình thực hiện chuẩn hoá một xâu ký tự nhập từ bàn phím (loại bỏ các dấu cách thừa, chuyển ký tự đầu mỗi từ thành chữ hoa, các ký tự khác thành chữ thường)
Bài 27 Nhập một xâu ký tự, in ra cho biết có bao nhiêu ký tự là nguyên âm, phụ âm, ký tự số và ký tự khác.
4
Sep 10 . Chuỗi
Chuỗi:
-Cách Khai báo chuỗi : char name[20];
-ý nghĩa: Khai báo chỗi name gồm 20 ký tự. Chuỗi kết thúc bằng ký tự null nên khai báo 20 chỉ có thể chứ 19 ký tự.-Sử dụng hàm nhập gets và xuất puts.
vd: gets(name) : là nhập vào chuỗi name. puts(name) là in ra chuỗi name;
Đối với hàm puts ký tự kết thúc chuỗi null (\0) được thay thế bằng ký tự newline (\n). Hàm gets và puts chỉ có 1 đối số và không sử dụng dạng thức trong nhập xuất dữ liệu cũng như in ra màn hình.
Khởi tạo chuỗi:
III . Một số hàm xử lý chuỗi
Các hàm này có trong string.h
1. Cộng chuỗi
- Hàm strcat()
Cú pháp:
char *strcat(char *des, const char *source )
Hàm này có tác dụng ghép chuỗi nguồn v ào chuỗi đích.
Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char HoLot[30], Ten[12] ;
printf("Nhap Ho Lot: ");gets(HoLot);
printf("Nhap Ten: ");gets(Ten);
strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/
printf("Ho ten la: ");puts(HoLot);
getch();
return 0;
}
2. Xác định độ dài chuỗi
- Hàm strlen()
Cú pháp:
in t strlen(const char* s)
Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255];
int Dodai;
printf("Nhap chuoi: ");gets(Chuoi);
Dodai = strlen(Chuoi);
printf("Chuoi vua nhap: ");puts(Chuoi);
printf("Co do dai %d",Dodai);
92
getch();
return 0;
}
3. Đổi một ký tự thường thành ký tự hoa
- Hàm toupper(): Hàm toupper() (trong ctype.h) được dùng để chuyển đổi một ký tự
thườn g thành ký tự hoa.
Cú pháp:
char toupper(char c)
4. Đổi chuỗi chữ thường thành chuỗi chữ hoa
-Hàm strupr(): Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi
chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.
Cú pháp:
char *strupr(char *s)
Ví dụ: Vi ết chương trình nhập vào một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm
strupr() để chuyển đổi chúng thành chuỗi chữ hoa.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],*s;
printf("Nhap chuoi: ");
gets(Chuoi);
s=strupr(Chuoi) ;
printf("Chuoi chu hoa: ");
puts(s);
getch();
return 0;
}
5. Đổi chuỗi chữ hoa thành chuỗi chữ thường
- Hàm strlwr(): Muốn chuyển đổi chuỗi chữ hoa thành chuỗi toàn chữ thường, ta sử
dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr().
Cú pháp:
char *strlwr(char *s)
93
6. Sao chép chuỗi
-Hàm strcpy(): Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn v ào
chuỗi đích.
Cú pháp:
char *strcpy(char *Des, const char *Source)
Ví dụ: Vi ết chương trình cho phép chép toàn b ộ chuỗi nguồn v ào chuỗi đích.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],s[255];
printf("Nhap chuoi: ");
gets(Chuoi);
strcpy(s,Chuoi);
printf("Chuoi dich: ");
puts(s);
getch();
return 0;
}
7. Sao chép một phần chuỗi
-Hàm strncpy(): Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi
đích.
Cú pháp:
char *strncpy(char *Des, const char *Source, size_t n)
8. Trích một phần chuỗi
-Hàm strchr(): Để trích một chuỗi con của một chuỗi ký tự bắt đầu từ một ký tự được
chỉ định trong chuỗi cho đến hết chuỗi, ta sử dụng hàm strchr().
Cú pháp :
char *strchr(const char *str, int c)
Lưu ý :
- Nếu ký tự đã chỉ định không có trongchuỗi, kết quả trả về là NULL ;
- Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c đư ợc tìm thấy đầu
tiên trong chuỗi str.
94
9. Tìm kiếm nội dung chuỗi
-Hàm strstr(): Hàm strstr() được sử dụng để tìm ki ếm sự xuất hiện đầu ti ên của chuỗi s2
trong chu ỗi s1.
Cú pháp:
char *strstr(const char *s1, const char *s2)
Kết quả trả về của hàm là một con trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa
chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1.
Ví dụ: Vi ết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ
chuỗi “hoc”.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],*s;
printf("Nhap chuoi: ");
gets(Chuoi);
s=strstr(Chuoi,"hoc");
printf("Chuoi trich ra: ");
puts(s);
getch();
return 0;
}
10. So sánh chuỗi
-Hàm strcmp(): Để so sánh hai chuỗi theo từng ký tự trong bảng mã Ascii, ta có thể sử
dụng hàm strcmp().
Cú pháp:
int strcmp(const char *s1, const char *s2)
Hai chuỗi s1 và s2 được so sánh với nhau, kết quả trả về là một số nguyên (số n ày có
được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy ra sự khác nhau).
- Nếu kết quả là sốâm, chuỗi s1 nhỏ hơn chuỗi s2;
- Nếu kết quả là 0, hai chuỗi bằng nhau;
- Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.
95
11. So sánh chuỗi
-Hàm stricmp(): Hàm này thực hiện việc so sánh trong n ký tự đầu ti ên của 2 chuỗi s1
và s2, giữa chữ thường và chữ hoa không phân biệt.
Cú pháp:
int stricmp(const char *s1, const char *s2)
Kết quả trả về tương tự như kết quả trả về của hàm strcmp()
12. Khởi tạo chuỗi
-Hàm memset(): Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi l à ký tự c.
Cú pháp:
memset(char *Des, int c, size_tn)
Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h): Để chuyển đổi chuỗi ra
số, ta sử dụng các hàm trên.
Cú pháp :
int atoi(const char *s) : chuy ển chuỗi thành số nguyên
long atol(const char *s) : chuy ển chuỗi thành số nguyên dài
floatatof(const char *s) : chuyển chuỗi thành số thực
Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0. Ngoài ra, thư viện
string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp.
Step 9 . Một số ví dụ về mảng 2 chiều
Bài 14: Nhập số liệu cho ma trận A kích thước
mxn có các phần tử là các số nguyên. Tính tổng các phần tử theo
đường chéo chính và đường chéo phụ của ma trận.
#include<stdio.h>
#include<stdio.h>
void nhap(int &n,int a[][10]){
printf("nhap kich thuoc ma tran");
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void tongchinh(int n, int a[][10]){
int s=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
s=s+a[i][j];
}
}
}
printf("\ntong duong cheo chinh la:%d",s);
}
void tongphu(int n, int a[][10]){
int s=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n-1){
s=s+a[i][j];
}
}
}
printf("\ntong duong cheo phu la:%d",s);
}
main()
{
int n, a[10][10];
nhap(n,a);
in(n,a);
tongchinh(n,a);
tongphu(n,a);
}
Bài 15: Nhập số liệu cho ma
trận A kích thước mxn có
các phần tử là các số nguyên. Tìm hàng
trong ma trận có tổng phần tử là nhỏ nhất và loại bỏ hàng đó ra khỏi ma trận.
Nếu có nhiều hàng tổng bằng nhau thì chọn hàng đầu tiên từ trên xuống.
#include<stdio.h>
void nhap(int &n,int &m,int a[][10]){
printf("nhap so hang:");
scanf("%d",&n);
printf("nhap so cot");
scanf("%d",&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int m, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void cut(int n,int m, int a[][10]){
int min,k=0,s=0,i,j;
for(i=0;i<1;i++){
for(j=0;j<m;j++){
min+=a[i][j];
}
}
while(i<n){
for(j=0;j<m;j++){
s+=a[i][j];
}
if(s<min){
min=s;
k=i;
}
i++;
}
printf("\n ma tran sau khi xoa hang la: \n");
for(int i=0;i<n;i++){
if(i!=k){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
}
printf("\n\n");
}
}
main()
{
int n,m,a[10][10];
nhap(n,m,a);
in(n,m,a);
cut(n,m,a);
}
Bài 16: .
Nhập số liệu cho ma trận A kích thước mxn có
các phần tử là các số nguyên. Tìm cột trong
ma trận có tổng phần tử là lớn nhất và loại bỏ cột đó ra khỏi ma trận. Nếu có nhiều cột tổng bằng nhau thì chọn cột
đầu tiên từ trái sang phải.
#include<stdio.h>
void nhap(int &n,int &m,int a[][10]){
printf("nhap so hang:");
scanf("%d",&n);
printf("nhap so cot");
scanf("%d",&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int m, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void cut(int n,int m, int a[][10]){
int min,k=0,s=0,i,j;
for(i=0;i<n;i++){
for(j=0;j<1;j++){
min=min+a[i][j];
}
}
while(j<m){
for(i=0;i<n;i++){
s+=a[i][j];
}
if(s<min){
min=s;
k=j;
}
j++;
}
printf("\nma tran sau khi xoa la: \n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(j!=k){
printf("%d\t",a[i][j]);
}
}
printf("\n\n");
}
}
main()
{
int n,m,a[10][10];
nhap(n,m,a);
in(n,m,a);
cut(n,m,a);
}
Bài 17 :
Viết chương trình
nhập số liệu cho ma trận các số nguyên A
cấp mxn trong đó
m, n là các số tự nhiên. Sau đó tìm ma trận chuyển vị B = (bij) cấp
nxm của A, bij = aji
#include<stdio.h>
void nhap(int x,int y,int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("\nz[%d,%d]=",i,j);
scanf("%d",&z[i][j]);
}
}
}
void in(int x, int y, int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("%d\t",z[i][j]);
}
printf("\n\n");
}
}
void chuyenvi(int x, int y, int z[][10], int k[10][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
k[j][i]=z[i][j];
}
}
}
main()
{
int n,m,a[10][10],b[10][10]={0};
printf("nhap so hang ma tran a:");
scanf("%d",&n);
printf("\nnhap so cot ma tran a");
scanf("%d",&m);
nhap(n,m,a);
printf("\nma tran a la:\n");
in(n,m,a);
chuyenvi(n,m,a,b);
printf("\nma tran sau khi chuyen vi:\n");
in(m,n,b);
}
void nhap(int x,int y,int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("\nz[%d,%d]=",i,j);
scanf("%d",&z[i][j]);
}
}
}
void in(int x, int y, int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("%d\t",z[i][j]);
}
printf("\n\n");
}
}
void chuyenvi(int x, int y, int z[][10], int k[10][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
k[j][i]=z[i][j];
}
}
}
main()
{
int n,m,a[10][10],b[10][10]={0};
printf("nhap so hang ma tran a:");
scanf("%d",&n);
printf("\nnhap so cot ma tran a");
scanf("%d",&m);
nhap(n,m,a);
printf("\nma tran a la:\n");
in(n,m,a);
chuyenvi(n,m,a,b);
printf("\nma tran sau khi chuyen vi:\n");
in(m,n,b);
}
BÀI 18: Nhập số liệu cho ma trận A có kích thước mxn. Sau đó tìm ma trận chuyển vị B có kích thước nxm thỏa mãn bij = aji. Tính ma trận tích C có kích thước mxm của 2 ma trận A và B.
#include<stdio.h>
void nhap(int x,int y,int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("\nz[%d,%d]=",i,j);
scanf("%d",&z[i][j]);
}
}
}
void in(int x, int y, int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("%d\t",z[i][j]);
}
printf("\n\n");
}
}
void chuyenvi(int x, int y, int z[][10], int k[10][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
k[j][i]=z[i][j];
}
}
}
void tich(int x, int y , int z[][10], int k[][10]){
int c[10][10]={0};
for(int i=0;i<x;i++){
for(int j=0;j<x;j++){
for(int l=0;l<y;l++){
c[i][j]+=z[i][l]*k[l][j];
}
}
}
printf("\nma tran tich C la:\n");
for(int i=0;i<x;i++){
for(int j=0;j<x;j++){
printf("%d\t",c[i][j]);
}
printf("\n\n");
}
}
main()
{
int n,m,a[10][10],b[10][10];
printf("nhap so hang ma tran a:");
scanf("%d",&n);
printf("\nnhap so cot ma tran a");
scanf("%d",&m);
nhap(n,m,a);
printf("\nma tran a la:\n");
in(n,m,a);
chuyenvi(n,m,a,b);
printf("\nma tran sau khi chuyen vi:\n");
in(m,n,b);
tich(n,m,a,b);
}
Bài 19: Một ma trận các số thực được gọi là ma trận tam
giác nếu toàn bộ các phần tử phía dưới (hoặc phía trên) đường chéo chính đều
bằng 0. Nhập một ma trận, hãy kiểm tra xem đó có phải là ma trận tam giác hay
không.
#include<stdio.h>
void nhap(int &n,int a[][10]){
printf("nhap kich thuoc ma tran");
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
int kt(int n, int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(a[i][j]!=0)
return 0;
return 1;
}
}
}
int kt2(int n, int a[][10]){
for(int i=0;i<n;i++){
for(int j=n-i;j<n;j++){
if(a[i][j]!=0)
return 0;
return 1;
}
}
}
main()
{
int n, m, a[10][10];
nhap(n,a);
in(n,a);
if(kt(n,a)||(kt2(n,a))){
printf("\nma tran tam giac");
}
else
{
printf("\nkhong phai ma tran tam giac");
}
}
Bài 20: Nhập ma trận A là ma
trận vuông cấp n. Thực hiện xoay ma trận một góc 90 độ ngược chiều kim đồng hồ.
#include<stdio.h>
void nhap(int &n,int a[][10]){
printf("nhap kich thuoc ma tran");
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void xoay90(int n, int a[][10],int b[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[j][n-i-1];//xoay nguoc chieu kim dong ho
}
}
printf("ma tran sau khi xoay 90\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",b[i][j]);
}
printf("\n\n");
}
}
main()
{
int n, m, a[10][10], b[10][10];
nhap(n,a);
in(n,a);
xoay90(n,a,b);
}
Bài 21Nhập số
nguyên dương n. In ra ma trận xoáy ốc vuông cấp n.
#include<stdio.h>
void xoayoc(int n,int m, int a[][10]){
int hang=n-1, cot=m-1, d=0, dem=1;
while(dem<m*n){
for(int i=d;i<=cot;i++)
{
a[d][i]=dem;
dem++;
}
if(dem==m*n) break;
for(int i=d+1;i<=hang;i++){
a[i][cot]=dem;
dem++;
}
if(dem==m*n) break;
for(int i=cot-1;i>=d;i--){
a[hang][i]=dem;
dem++;
}
if(dem==m*n) break;
for(int i=hang-1;i>d;i--){
a[i][d]=dem;
dem++;
}
if(dem==m*n) break;
d++;hang--,cot--;
}
}
void in(int n, int m,int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
main()
{
int n,m, a[10][10];
printf("nhap n: ");
scanf("%d%d",&n,&m);
xoayoc(n,m,a);
in(n,m,a);
}
Đăng ký:
Bài đăng (Atom)