Đáp án KTLT thầy Tùng
ĐHBKHN
MADE BY TẠ TUẤN MINH-K58
Email:
Bài Tập
Chương 2 (T21)
Bài 3:
#include <stdio.h>
int main() {
struct SinhVien {
char ten[20];
int nam_sinh;
int khoa;
} sv;
printf("Nhap du lieu:\n");
printf("Ten: ");
fflush(stdin);
gets(sv.ten);
printf("Nam sinh: ");
scanf("%d", &sv.nam_sinh);
printf("Khoa: ");
scanf("%d", &sv.khoa);
printf("Thong tin sinh vien:\n"
" Ten: %s\n"
" Nam sinh: %d\n"
" Khoa: %d\n",
sv.ten, sv.nam_sinh, sv.khoa);
return 0;
}
Bài 4:
#include <stdio.h>
int main() {
char x = -1;
unsigned char y = (unsigned char)x;
printf("Gia tri cua x: %d\n", x);
printf("Gia tri cua y: %d\n", y);
return 0;
}
Bài 5+6:
#include <stdio.h>
int main()
{
struct {
char model[20];
float khoi_luong;
char mau_son[10];
struct {
char chung_loai[20];
float ban_kinh;
float khoi_luong;
} banh[4];
} oto;
int i;
printf("Nhap du lieu:\n");
printf("Model: ");
fflush(stdin);
gets(oto.model);
printf("Khoi luong: ");
scanf("%f", &oto.khoi_luong);
printf("Mau son: ");
fflush(stdin);
gets(oto.mau_son);
printf("Nhap du lieu cho cac banh:\n");
for (i=0; i<4; i++) {
printf("Banh thu %d:\n", i+1);
printf("Chung loai: ");
fflush(stdin);
gets(oto.banh[i].chung_loai);
printf("Ban kinh: ");
scanf("%f", &oto.banh[i].ban_kinh);
printf("Khoi luong: ");
scanf("%f", &oto.banh[i].khoi_luong);
}
printf("\n\nThong tin ve oto:\n"
" Model: %s\n"
" Khoi luong: %.3f\n"
" Mau son: %s\n", oto.model, oto.khoi_luong, oto.mau_son);
for (i=0; i<4; i++) {
printf(" Banh thu %d:\n"
" Chung loai: %s\n"
" Ban kinh: %.3f\n"
" Khoi luong: %.3f\n",
i+1,
oto.banh[i].chung_loai,
oto.banh[i].ban_kinh,
oto.banh[i].khoi_luong);
}
return 0;
}
Chương 3: Câu lệnh
Bài 1: (nhập các hệ số a,b,c và gpt bậc 2)
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c, delta;
printf("Nhap a: ");
scanf("%lf", &a);
printf("Nhap b: ");
scanf("%lf", &b);
printf("Nhap c: ");
scanf("%lf", &c);
if (a == 0.) {
if (b == 0.) {
if (c == 0.)
printf("Phuong trinh co vo so nghiem\n");
else printf("Phuong trinh vo nghiem\n");
} else printf("Phuong trinh co 1 nghiem: %.3f\n", -c/b);
} else {
delta = b*b - 4*a*c;
if (delta > 0)
printf("Phuong trinh co 2 nghiem: %.3f va %.3f\n",
(-b-sqrt(delta))/(2*a),
(-b+sqrt(delta))/(2*a));
else if (delta == 0.)
printf("Phuong trinh co 1 nghiem: %.3f\n", -b/2/a);
else printf("Phuong trinh vo nghiem\n");
}
return 0;
}
Bài 2: (Tính tổng nghịch đảo…)
#include <stdio.h>
int main() {
int n;
float s;
for (n=2, s=0.; n<=100; n+=2)
s += 1./n;
printf("Tong nghich dao: %.5f\n", s);
return 0;
}
Bài 3:
#include <stdio.h>
int main() {
int n,i;
double x, s;
printf("Nhap so phan tu cua day so: ");
scanf("%d", &n);
for (i=0, s=0.; i
printf("Nhap phan tu thu %d: ", i+1);
scanf("%lf", &x);
s += x;
}
printf("Gia tri trung binh: %.3lf\n", s/n);
return 0;
}
Bài 5 (dùng mạng):
#include <stdio.h>
int main() {
const char* menu[] = {
"Switch user",
"Open ...",
"Log off",
"Exit"
};
int lua_chon, i,
n = sizeof(menu)/sizeof(menu[0]);
printf("MENU:\n");
for (i = 0; i
printf("%d. %s\n", i+1, menu[i]);
printf("Lua chon: ");
scanf("%d", &lua_chon);
if (lua_chon<1 || lua_chon>n)
printf("Lua chon khong co!\n");
else printf("Ban da chon \"%s\"\n", menu[lua_chon-1]);
return 0;
}
Bài 5 (dùng rẽ nhánh)
#include <stdio.h>
int main() {
int lua_chon;
printf("MENU:\n"
"1. Switch user\n"
"2. Open ...\n"
"3. Log off\n"
"4. Exit\n"
"Lua chon: ");
scanf("%d", &lua_chon);
switch(lua_chon) {
case 1:
printf("Ban da chon \"Switch user\"\n");
break;
case 2:
printf("Ban da chon \"Open ...\"\n");
break;
case 3:
printf("Ban da chon \"Log off\"\n");
break;
case 4:
printf("Ban da chon \"Exit\"\n");
break;
default:
printf("Lua chon khong co!\n");
}
return 0;
}
Bài 6:
#include <stdio.h>
int main() {
int t;
const double g = 9.8;
for (t=1; t<=20; t++)
printf("Quang duong vat di duoc sau %2d giay: %8.3lfm\n",
t,
g*t*t/2);
return 0;
}
Bài 7:
#include <stdio.h>
int main() {
int t;
const double g = 9.8;
double h, s;
printf("Do cao ban dau: ");
scanf("%lf", &h);
for (t=1; ; t++) {
s = g*t*t/2;
if (s>h) {
printf("Giay thu %d: vat da cham dat\n", t);
break;
}
printf("Quang duong vat di duoc sau %2d giay: %8.3lfm\n", t, s);
}
return 0;
}
Chương 4: Con trỏ, mảng và quản lý bộ nhớ. (BT T17)
Bài 1:
#include <stdio.h>
int main()
{
int N, i;
int *p;
printf("Nhap N: ");
scanf("%d", &N);
p = (int*)malloc(N*sizeof(int));
for (i=0; i
printf("Nhap phan tu thu %d: ", i+1);
scanf("%d", p+i); /* &p[i] */
}
printf("Mang da nhap theo thu tu nguoc: \n");
for (i=N-1; i>=0; i--)
printf("%d ", p[i]);
printf("\n");
free(p);
return 0;
}
Bài 2:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int N, i;
float* p = NULL, *p2;
char c = 'y';
for (N=1; c!='n'; N++) {
/* Mở rộng mảng p */
p2 = (float*)malloc(N*sizeof(float)); /* Cấp phát vùng nhớ mới */
if (p!=NULL) {
/* Copy dữ liệu cũ sang vùng nhớ mới */
for (i=0; i
p2[i] = p[i];
free(p); /* Giải phóng vùng nhớ cũ */
}
/* p trỏ sang vùng nhớ mới */
p = p2;
/* Kết thúc mở rộng mảng p */
printf("Nhap phan tu thu %d: ", N);
scanf("%f", &p[N-1]);
printf("Ban co muon nhap nua khong (y/n): ");
fflush(stdin);
scanf("%c", &c);
}
N--;
printf("Mang ban da nhap: ");
for (i=0; i
printf("%.3f ", p[i]);
free(p);
return 0;
}
Bài 3:
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* s1 = "abcd123154";
int i;
char* s2;
for (i=0; s1[i]!=0; i++) ;
s2 = (char*)malloc(i+1);
for (i=0; s1[i]!=0; i++)
s2[i] = s1[i];
s2[i] = 0;
printf("s2 = %s\n", s2);
free(s2);
return 0;
}
Bài 4:
#include <stdio.h>
#include <stdlib.h>
int main() {
const char* s1 = "footballer";
const char* s2 = "football";
const char* p1, *p2;
int ketqua;
for (p1=s1, p2=s2; *p1!=0 && *p2!=0; p1++, p2++) {
if (*p1 < *p2) {
ketqua = -1;
break;
} else if (*p1 > *p2) {
ketqua = 1;
break;
}
}
if (*p1 == 0 && *p2 == 0) ketqua = 0;
else if (*p1==0) ketqua = -1;
else if (*p2==0) ketqua = 1;
printf("Ket qua: %d\n", ketqua);
return 0;
}
Bài 5:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main(int argc, const char* argv[]) {
const char* s;
/* Chuỗi nhập từ dòng lệnh */
const char *s1, *s2; /* Các con trỏ duyệt chuỗi s */
char** p = NULL, **p2;
/* p: mảng các từ, p2: biến tạm để cấp phát bộ nhớ */
int i, n, len;
/* n: số phần tử của mảng */
/* Kiểm tra xem đã nhập chuỗi ở tham số chưa */
if (argc != 2) {
printf("Chua nhap chuoi ky tu o tham so dong lenh\n");
return -1;
}
/* Gán s bằng chuỗi tham số */
s = argv[1];
for (n=0, s2=s1=s; ; n++) {
/* Bỏ qua các ký tự trắng */
for (s1=s2; *s1==' '; s1++) ;
if (*s1==0) break; /* Nếu đã tới cuối chuỗi s thì dừng */
/* Khi tới đây thì s1 trỏ tới ký tự đầu tiên của một từ */
/* Tìm tới vị trí kết thúc từ bằng cách tìm ký tự trắng tiếp theo sau s1 */
for (s2=s1; *s2!=0 && *s2!=' '; s2++) ;
/* Khi tới đây thì s2 trỏ tới ký tự trắng hoặc vị trí kết thúc chuỗi s */
/* Mở rộng mảng p thêm một phần tử mới */
p2 = (char**)malloc((n+1)*sizeof(char*)); /* Cấp phát vùng nhớ mới */
if (p!=NULL) {
/* Copy mảng cũ sang mảng mới */
for (i=0; i
p2[i] = p[i];
free(p); /* Giải phóng vùng nhớ cũ */
}
p = p2; /* Trỏ con trỏ p sang vùng nhớ mới */
/* Kết thúc mở rộng mảng p */
len = (int)(s2-s1);
/* len = độ dài của từ mới */
p[n] = (char*)malloc(len+1); /* Cấp phát bộ nhớ cho từ mới */
memcpy(p[n], s1, len);
p[n][len] = 0;
}
/* In mảng các từ ra màn hình */
for (i=0; i
printf("%s\n", p[i]);
/* Giải phóng bộ nhớ từng phần tử */
for (i=0; i
free(p[i]);
/* Giải phóng bộ nhớ của mảng p */
free(p);
return 0;
}
Bài 6:
#include <stdio.h>
int main() {
double a[] = {1, 3, 5, 7};
double b[] = {2, 4, 5, 6, 7, 8, 10};
double*c ;
int na = sizeof(a)/sizeof(a[0]),
nb = sizeof(b)/sizeof(b[0]),
nc = na+nb;
int i, j, k;
c = (double*)malloc(nc*sizeof(double));
for (i=0, j=0, k=0; k
if (i==na) c[k] = b[j++];
else if (j==nb) c[k] = a[i++];
else if (a[i] < b[j]) c[k] = a[i++];
/* Copy từ */
/* Thêm ký tự 0 vào cuối từ */
else c[k] = b[j++];
}
printf("Mang da tron: \n");
for (k=0; k
printf("%g ", c[k]);
free(c);
return 0;
}
Chương 5: Hàm ( BT T21)
Bài 1:
#include <stdio.h>
#include <stdlib.h>
int* nhap_mang(int* n)
{
int i;
int* a;
printf("Nhap so phan tu: ");
scanf("%d", n);
a = (int*)malloc((*n)*sizeof(int));
for (i=0; i<*n; i++) {
printf("Nhap phan tu thu %d: ", i+1);
scanf("%d", a+i);
}
return a;
}
int main()
{
int i, n;
int *a = nhap_mang(&n);
printf("Mang da nhap:\n");
for (i=0; i
printf("%d ", a[i]);
printf("\n");
free(a);
return 0;
}
*Bài 1.2*:
#include <stdio.h>
void hoan_doi(int* x, int* y)
{
int z = *x;
*x = *y;
*y = z;
}
int main()
{
int x = 10, y = 20;
printf("x = %d, y = %d\n", x, y);
hoan_doi(&x, &y);
printf("x = %d, y = %d\n", x, y);
return 0;
}
Bài 2:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int is_prime(int n)
{
int i;
int cn = sqrt(n);
if (n==1) return 0;
if (n==2) return 1;
for (i=2; i<=cn; i++)
if (n%i == 0) return 0;
return 1;
}
int* prime(int n, int* m)
{
int* z = (int*)malloc(n*sizeof(int));
int i;
for (i = 1, *m = 0; i < n; i++)
if (is_prime(i)) {
z[*m] = i;
(*m)++;
}
return z;
}
int main()
{
int i, n;
int *a = prime(20, &n);
printf("Cac so nguyen to < 20:\n");
for (i=0; i
printf("%d ", a[i]);
printf("\n");
free(a);
return 0;
}
Bài 3:
#include <stdio.h>
#include <math.h>
typedef struct {
const char* name;
int (*func)();
} MenuItem;
double x = 3.14159/6;
int nhap_x()
{
printf("x = ");
scanf("%lf", &x);
return 0;
}
int tinh_sin()
{
printf("sin(x) = %g\n", sin(x));
return 0;
}
int tinh_cos()
{
printf("cos(x) = %g\n", cos(x));
return 0;
}
int tinh_tan()
{
printf("tan(x) = %g\n", tan(x));
return 0;
}
int thoat()
{
return 1;
}
int main()
{
MenuItem m[] = {
{"Nhap x", nhap_x},
{"Tinh sin x", tinh_sin},
{"Tinh cos x", tinh_cos},
{"Tinh tan x", tinh_tan},
{"Thoat", thoat}
};
int i, n = sizeof(m)/sizeof(m[0]);
int lua_chon;
for (;;) {
printf("\nx = %g\nMENU:\n", x);
for (i=0; i
printf("%d. %s\n", i+1, m[i].name);
printf("Lua chon: ");
scanf("%d", &lua_chon);
if (lua_chon<1 || lua_chon>n) {
printf("Lua chon khong co\n");
continue;
}
if (m[lua_chon-1].func()) break;
}
return 0;
}
Bài 4:
#include <stdio.h>
unsigned int fib(unsigned int n)
{
if (n==0) return 0;
if (n==1) return 1;
return fib(n-1) + fib(n-2);
}
int main()
{
int i;
for (i=0; i<=20; i++)
printf("fib(%d) = %d\n", i, fib(i));
return 0;
}
Bài 5.1:
#include "bt_5_string.h"
int main()
{
String s1, s2;
khoi_tao_chuoi(&s1, "abcd");
khoi_tao_chuoi(&s2, "12345");
printf("s1 = %s, s2 = %s\n", s1, s2);
copy_chuoi(&s1, s2);
printf("s1 = %s, s2 = %s\n", s1, s2);
huy_chuoi(&s1);
huy_chuoi(&s2);
return 0;
}
Bài 5.2:
#include <string.h>
#include "bt_5_string.h"
void khoi_tao_chuoi(String* s, const char* s1)
{
int n = strlen(s1);
if (*s == NULL) free(*s);
*s = (char*)malloc(n+1);
strcpy(*s, s1);
}
void copy_chuoi(String* s1, const String s2)
{
int n = strlen(s2);
if (*s1 == NULL) free(*s1);
*s1 = (char*)malloc(n+1);
strcpy(*s1, s2);
}
void huy_chuoi(String* s)
{
free(*s);
}
Bài 5.3:
#ifndef __BT5_STRING__
#define __BT5_STRING__
typedef char* String;
void khoi_tao_chuoi(String* s, const char* s1);
void copy_chuoi(String* s1, const String s2);
void huy_chuoi(String* s);
#endif
Bài 6.1: (Dùng switch)
#include <stdio.h>
#include <stdlib.h>
typedef enum {Circle, Square, Rect} TYPE;
typedef struct {
TYPE type;
void* data;
} Shape;
double area(Shape s)
{
double x, y;
switch(s.type) {
case Circle:
x = *(double*)s.data;
return 3.14*x*x;
case Square:
x = *(double*)s.data;
return x*x;
case Rect:
x = ((double*)s.data)[0];
y = ((double*)s.data)[1];
return x*y;
}
return 0;
}
int main()
{
Shape s[3];
int i;
s[0].type = Circle;
s[0].data = (double*)malloc(sizeof(double));
(*(double*)s[0].data) = 5.;
s[1].type = Square;
s[1].data = (double*)malloc(sizeof(double));
(*(double*)s[1].data) = 10.;
s[2].type = Rect;
s[2].data = (double*)malloc(2*sizeof(double));
((double*)s[2].data)[0] = 10.;
((double*)s[2].data)[1] = 20.;
for (i=0; i<3; i++)
printf("Dien tich hinh thu %d: %g\n", i+1, area(s[i]));
free(s[0].data);
free(s[1].data);
free(s[2].data);
return 0;
}
Bài 6.2 (dùng con trỏ hàm):
#include <stdio.h>
#include <stdlib.h>
typedef enum {Circle, Square, Rect} TYPE;
typedef struct {
void* data;
double (*area)(void*);
} Shape;
double area_circle(void* data)
{
double r = *(double*)data;
return 3.14*r*r;
}
double area_square(void* data)
{
double l = *(double*)data;
return l*l;
}
double area_rect(void* data)
{
double l1 = ((double*)data)[0];
double l2 = ((double*)data)[1];
return l1*l2;
}
int main()
{
Shape s[3];
int i;
s[0].data = (double*)malloc(sizeof(double));
(*(double*)s[0].data) = 5.;
s[0].area = area_circle;
s[1].data = (double*)malloc(sizeof(double));
(*(double*)s[1].data) = 10.;
s[1].area = area_square;
s[2].data = (double*)malloc(2*sizeof(double));
((double*)s[2].data)[0] = 10.;
((double*)s[2].data)[1] = 20.;
s[2].area = area_rect;
for (i=0; i<3; i++)
printf("Dien tich hinh thu %d: %g\n",
i+1, s[i].area(s[i].data));
free(s[0].data);
free(s[1].data);
free(s[2].data);
return 0;
}