Tải bản đầy đủ (.docx) (81 trang)

Đáp án bài tập Kĩ thuật lập trình Viện Điệntrường Đại Học Bách Khoa Hà Nội

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 (174.24 KB, 81 trang )

Đá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; iprintf("%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; iprintf("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; ip2[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; iprintf("%.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; ip2[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; iprintf("%s\n", p[i]);
/* Giải phóng bộ nhớ từng phần tử */
for (i=0; ifree(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; kif (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; kprintf("%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; iprintf("%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; iprintf("%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; iprintf("%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;
}


×