background img

Bài Viết Mới

[C/C++] Các khái niệm cơ bản trong C/C++

Bài này mình sẽ khái quát cơ bản về C/C++, nó chỉ mang giá trị tham khảo và tổng hợp kiến thức, chủ yếu là để hổ trợ cho seri bài học về C++, các bạn có thể tham khảo thêm thông qua internet nhé.

Nhập xuất cơ bản
#define max(a,b) (a>b)?a:b //khai báo macro
typedef unsigned int byte; //định nghĩa kiểu dữ liệu
const float PI=3.14; //khai báo hằng số
char c;char s[20];

Cách của C
//không dùng scan nếu muốn nhập khoảng trắng
gets(s); //có thể nhập khoảng trắng
puts(s);
fflush(stdin); //xóa bộ đệm nhập
c=getchar();
putchar©;

Cách của C++
//không dùng cin>> nếu muốn nhập khoảng trắng
cin.getline(a,21); //có thểnhập khoảng trắng
cout<<a;
cin.get(); //xóa bộ đệm nhập

Con trỏ cơ bản
int a=5,*p;
//p=3; //khong hop ve vi khong the gan gia tri kieu int cho bien kieu int*
//&p=3; //khong hop le vi dia chi cua p la co dinh
p=&a; //hop le, gan dia chi ma p tro den
*p=3; //hop le, gan gia tri tai dia chi ma p tro den
cout<<p<<endl; //cai gi do bat ki, dia chi cua a
cout<<&p<<endl; //cai gi do bat ki, dia chi cua p
cout<<*p<<endl; //3,dau * luc nay mang y nghia "gia tri tai dia chi cua"

Truyền giá trị cho hàm
Trong C có khái niệm con trỏ (pointer) Trong C++ có thêm khái niệm tham chiếu (reference)
int a;
int& b=a;

Lúc này biến a có một cái nickname là b
Như vậy có tất cả 3 cách viết hàm và truyền tham số
Cách 1:
void add10(int a)
{
a=a+10;
}

gọi:
add10(n);
Không hiệu quả, a vẫn giữ nguyên giá trị
Cách 2:
void add10(int *a)
{
*a=*a+10;
}

gọi:
add10(&n);
Hiệu quả.
Cách3:
void add10(int &a)
{
a=a+10;
}

gọi:
add10(n);
Hiệu quả, tiện hơn cách 2.
Nhập xuất dữ liệu với kiểu mảng số nguyên
int a[3];

Truyền dữ liệu trực tiếp theo kiểu C,cách 1
for(int i=0;i<3;++i) scanf("%d",&(*(a+i)));
for(int i=0;i<3;++i) printf("%d",*(a+i));

Truyền dữ liệu trực tiếp theo kiểu C, cách 2
for(int i=0;i<3;++i) scanf("%d",&a[i]);
for(int i=0;i<3;++i) printf("%d",a[i]);

Truyền dữ liệu trực tiếp theo kiểu C++, cách 1
for(int i=0;i<3;++i) cin>>*(a+i);
for(int i=0;i<3;++i) cout<<*(a+i);

Truyền dữ liệu trực tiếp theo kiểu C++, cách 2
for(int i=0;i<3;++i) cin>>a[i];
for(int i=0;i<3;++i) cout<<a[i];

Nhập xuất dữ liệu bằng hàm với kiểu mảng số nguyên
Nhập xuất dữ liệu bằng hàm với kiểu mảng số nguyên theo kiểu C, cách 1
void input(int[]);
input(a);
void input(int *a)
{
for(int i=0;i<3;++i)
scanf("%d",&(*(a+i)));
}
void output(int[]);
output(a);
void output(int *a)
{
for(int i=0;i<3;++i)
printf("%d",*(a+i));
}

Nhập xuất dữ liệu bằng hàm với kiểu mảng số nguyên theo kiểu C, cách 2
void input(int[]);
input(a);
void input(int a[])
{
for(int i=0;i<3;++i)
scanf("%d",&a[i]);
}
void output(int[]);
output(a);
void output(int a[])
{
for(int i=0;i<3;++i)
printf("%d",a[i]);
}

Nhập xuất dữ liệu bằng hàm với kiểu mảng số nguyên theo kiểu C++, cách 1
void input(int[]);
input(a);
void input(int *a)
{
for(int i=0;i<3;++i)
cin>>*(a+i);
}
void output(int[]);
output(a);
void output(int *a)
{
for(int i=0;i<3;++i)
cout<<*(a+i);
}

Nhập xuất dữ liệu bằng hàm với kiểu mảng số nguyên theo kiểu C++, cách 2
void input(int[]);
input(a);
void input(int a[])
{
for(int i=0;i<3;++i)
cin>>a[i];
}
void output(int[]);
output(a);
void output(int a[])
{
for(int i=0;i<3;++i)
cout<<a[i];
}

Nhập xuất dữ liệu với kiểu mảng số thực
Cách dùng biến tạm
float a[2][3],temp;
for(int i=0;i<2;++i)
for(int j=0;i<3;++j)
{
scanf("%f \n",&temp);
a[i][j]=temp;
}

Cách dùng con trỏ
float a[2][3];float *p;
p=(float*)a;
for(int i=0;i<2*3;++i)
scanf("%f",(p+i));

Nhập mảng số thực 2 chiều bằng cách dùng ép kiểu
float a[3][2];float *p;p=(float*)a;
for(int i=0;i<3;i++)
for(int j=0;j<2;j++)
scanf("%f",((float*)p+i*2+j));

Nhập mảng số thực 2 chiều bằng cách dùng malloc
float** p;p=(float**)malloc(2);
for(int i=0;i<3;i++)
for(int j=0;j<2;j++)
scanf("%f",(p+i*2+j));

Cấu trúc (struct)
Con trỏ cấu trúc (structpointer)
struct Student
{
int id;
};
Student *s;
Student m;
s=&m;
s->id=3; //means (*s).id
cout<<m.id;

Sao chép cấu trúc
struct Student
{
int id;
char *name; //một con trỏ, không phải một mảng
};
Student a;
char temp[20];
cin>>temp;
a.name=new char[strlen(temp)+1];
strcpy(a.name,temp); //phải dùng biến tạm
Student b=a;
strcpy(b.name,a.name); //phải dùng strcpy, nếu không sẽ sao chép địa chỉ bộ nhớ

Gọi hàm với cấu trúc
struct Student{
char name[10];
int id;
};
Student m[3],a;
m[0]=(Student){"Pete",1};
add(m[0].name,&m[0].id);

Có 4 cách để thêm dữ liệu vào cấu trúc.
Cách 1
void add(char name[],int *place)
{
cin>>name;
cin.get();
cin>>*place;
}
add(a.name,&a.id);

Cách 2
void add(Student &s)
{
cin>>s.name;
cin.get();
cin>>s.id;
}
add10(a);

Cách 3
void add(Student *s)
{
cin>>(*s).name;
cin.get();
cin>>(*s).id;
}
add(&a);

Cách 4
void add(Student *s)
{
cin>>s->name;
cin.get();
cin>>s->id;
}
add(&a);

Toán tử sizeof với struct
struct Hello
{
char c;
double d;
};
sizeof(Mystruct)=12; vì c lấy một 32-bit word (4 byte, không phải 1 byte)

Con trỏ(pointer)
Con trỏ trỏ đến mộtcon trỏ khác
char a='z'; //a='z' và giảsử địa chỉ của a=8277
char *p=&a; //p=8277 và giả sử địa chỉ của p=6194
char **p2=&p; //p2=6194 và địa chỉ của p2 sẽ là một cái gì đó

Con trỏ void (void pointer)
Con trỏ void dùng để trỏ đến bất cứ một kiểu dữ liệu nào
void increase(void* data,int dataType)
{
switch(dataType)
{
case sizeof(char):
(*((char*)data))++;break;
case sizeof(int):
(*((int*)data))++;break;
}
}
int main()
{
char c=66;int a=-4;
increase(&c,sizeof(char));
increase(&a,sizeof(int));
}

Con trỏ hàm (function pointer)
Con trỏ hàm dùng để trỏ đến một hàm
int addition(int a,int b)
{
return a+b;
}
int subtraction(int a,int b)
{
return a-b;
}
int (*minuse)(int,int) = subtraction;
int primi(int a,int b,int(*functocall)(int,int))
{
return (*functocall)(a,b);
}
int main()
{
int m=primi(7,5,&addition);
int n=primi(20,m,minuse);
cout<<m<<endl;cout<<n<<endl;
return 0;
}

Nguồn: Tự Học IT Online - http://tuhocit.net

0 nhận xét:

Đăng nhận xét

Xem Nhiều