[Question] lập trình C trong ubuntu! |
26/05/2010 13:31:17 (+0700) | #1 | 211680 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
Các anh chi ơi giúp em với!
Em có một bài tập về lập trình C trong Ubuntu em không làm được, mong các anh chị giúp đỡ em!
Đề bài là: Viết chương trình tìm dòng dài nhất trong một tập tin!
Mong các anh chị giúp em!Em cảm ơn nhiều nhiều |
|
|
|
|
[Question] lập trình C trong ubuntu! |
26/05/2010 17:17:52 (+0700) | #2 | 211694 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
Code:
/*
Pham The Chung
26/5/2010
*/
#define MAX(x,y) ((x)>(y)?(x):(y))
struct Line_Object{
int length;
int lineth;
char text[0];
};
/*
m must end with NULL character
*/
void get_longest_line(char *m,struct Line_Object *buf){
int len=0,lenp=0,lineth=1,linepos=0;
while(*m!=NULL){
len++;
if(*m=='\n') {
if(len>lenp) linepos=lineth;
len=MAX(len,lenp);
lenp=len;
len=0;
lineth++;
}
m++;
}
out:
buf->length=lenp;
buf->lineth=linepos;
//buf->text=... unable to written now
}
đó là phần mới phát triển được
đã test thành công chạy đúng.
nếu đưa host hay email thì mình đưa cho bạn file source đã test
update: bạn test thử dùm mình vì hàm này chưa chắc đúng hoàn toàn
mình chỉ thử 1 trường hợp thì đúng
nếu có nhiều hàng dài và bằng nhau thì hàm này record hàm đầu tiên |
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
26/05/2010 19:01:14 (+0700) | #3 | 211698 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
Em cảm ơn anh nhiều nhiều ạ! Cảm ơn anh đã giúp đỡ em! |
|
|
|
|
[Question] lập trình C trong ubuntu! |
26/05/2010 19:20:33 (+0700) | #4 | 211699 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
không có chi,nếu bạn có thuật toán tốt hơn post lên cho mình tham khảo
tiện hỏi, bạn học trường nào mà bài tập khó vậy ?
|
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
26/05/2010 20:16:57 (+0700) | #5 | 211701 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
hihi!Giờ tớ mới học ubuntu nên không biết lập trình như thế nào !Tớ hoc trường Tây Bắc ah.Bạn học trwongf nào thế?ah bạn có tài liệu nào về lập trình trên ubuntu thì cho share tớ với, tớ muốn học vì sắp thi rồi mà không biết gì hết a! |
|
|
|
|
[Question] lập trình C trong ubuntu! |
26/05/2010 22:43:14 (+0700) | #6 | 211708 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
‘NULL’ undeclared (first use in this function)
maianh.c:13: error: (Each undeclared identifier is reported only once
maianh.c:13: error: for each function it appears in.)
bạn ơi lỗi này là như thế nao?
Tớ không chạy đựoc a.
|
|
|
|
|
[Question] lập trình C trong ubuntu! |
26/05/2010 22:44:24 (+0700) | #7 | 211709 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 06:31:06 (+0700) | #8 | 211716 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
Chỉ nên gợi ý, không nên làm giúp bất cứ thứ gì. Làm giúp là làm hư và tập tính ỷ lại. Mai sau đi làm sẽ cực kỳ vất vả nếu quen với tính ỷ lại này. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 07:12:49 (+0700) | #9 | 211717 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
conmale: quá cảm tính rùi !
mình cũng chỉ gơi ý,nếu gặp trục trặc thì phải giúp thôi
hoangphuong0808:
nếu không có NULL thì bạn định nghĩa NULL
Code:
#ifndef NULL
#define NULL (0)
#endif
//định nghĩa này là định nghĩa không chuẩn, sẽ warning trong một số trường hợp nhưng xài được
mình đã gửi email
|
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 08:07:05 (+0700) | #10 | 211720 |
|
conmale
Administrator
|
Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
|
|
panfider wrote:
conmale: quá cảm tính rùi !
mình cũng chỉ gơi ý,nếu gặp trục trặc thì phải giúp thôi
hoangphuong0808:
nếu không có NULL thì bạn định nghĩa NULL
Code:
#ifndef NULL
#define NULL (0)
#endif
//định nghĩa này là định nghĩa không chuẩn, sẽ warning trong một số trường hợp nhưng xài được
mình đã gửi email
Không phải cảm tính mà là nguyên tắc. Bất cứ bài tập hoặc thực hành nào cũng nên tự làm và tự vận động thì mới thu thập được kiến thức + kinh nghiệm. Làm giúp chỉ khiến cho người "hưởng" copy & paste là xong. Không nên. |
|
What bringing us together is stronger than what pulling us apart. |
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 09:55:17 (+0700) | #11 | 211727 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
sorry conmale
mình cũng không cho là conmale "cảm tính"
với lại hàm mình viết hoàn toàn chưa hoàn chỉnh, và đề bài thì yêu cầu không rõ ràng
muốn viết tới đâu thì viết tới đó
|
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 11:46:56 (+0700) | #12 | 211729 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
Hihi! Sorry conmale và mọi người nha, tớ vừa mới bắt đầu học ubuntu mà đã phải lập trình trên đó rồi, tớ đọc tài liệu thấy khó hiểu quá mới đi hỏi mọi người mà. Có gì thì mọi người thông cảm cho tớ nha. Tớ là thành viên mới nên chưa biết nhiều mà. Chắc chắn là tớ sẽ còn nhiều thắc mắc trong thời gian tới mong mọi người giúp đỡ tớ. Nếu có gì không đúng mong conmale và mọi ngừoi bỏ qua cho tớ nha!hihi |
|
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 19:50:02 (+0700) | #13 | 211744 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
qua http://congdongcviet.com để chuyên về C hơn
với lại tụi nó code C++ hoặc C# more advance hơn mình he he |
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
27/05/2010 23:44:32 (+0700) | #14 | 211753 |
|
H3x4
Member
|
0 |
|
|
Joined: 02/04/2009 00:03:16
Messages: 242
Offline
|
|
Theo mình để giải quyết 1 bài toán như vậy bạn hãy suy nghĩ xem nếu bạn là CPU bạn sẽ làm gì, mình sẽ:
1/ Mở file/Tập tin đó ra
2/Đọc vào từng dòng
3/Đếm số chữ cái trên 1 dòng
4/Ghi số đó vào 1 tờ giấy nháp( và ghi số dòng)
5/Đọc đến hết file/tập tin
6/Đóng file/tập tin lại
7/ Tìm con số lớn nhất trong tờ nháp
=> hiện thực tương tự bằng C.
Lấy thí dụ để mở tập tin bạn có thể google : "C open file", tờ giấy nháp là một mảng tạm để lưu các con số ......
|
|
|
|
|
[Question] lập trình C trong ubuntu! |
28/05/2010 20:55:11 (+0700) | #15 | 211838 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
ừ mình cũng nghĩ tuơng tự như thế
|
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
28/05/2010 22:46:10 (+0700) | #16 | 211841 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
tớ chạy rùi nhưng nó báo:
laptrinhnhom4.c: In function ‘get_longest_line’:
laptrinhnhom4.c:14: warning: comparison between pointer and integer
laptrinhnhom4.c: In function ‘main’:
laptrinhnhom4.c:51: warning: assignment makes integer from pointer without a cast
laptrinhnhom4.c:55: warning: assignment makes integer from pointer without a cast
giúp tớ với, tớ không biết sửa thế nào
|
|
|
|
|
[Question] lập trình C trong ubuntu! |
28/05/2010 23:59:35 (+0700) | #17 | 211842 |
|
H3x4
Member
|
0 |
|
|
Joined: 02/04/2009 00:03:16
Messages: 242
Offline
|
|
bạn cứ dịch các câu warning của nó ra mà sửa là được. Thí dụ nha:
laptrinhnhom4.c:14: warning: comparison between pointer and integer
ở dòng thứ 14 trong file laptrinhnhom4.c bạn đã so sánh 1 con trỏ và 1 số interger.
Thí dụ thế này: int *p=1
Và a=1
bạn so sánh p va a nó sẽ báo vậy, bạn phải chỉnh lại cho nó so sánh giữa *p và a thì nó mới chịu |
|
|
|
|
[Question] lập trình C trong ubuntu! |
29/05/2010 06:36:07 (+0700) | #18 | 211843 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
Hix. Bạn giúp tớ sửa được không. Tớ mới tìm hiểu về ubuntu mà thầy đã yêu cầu lập trình trên nó. Mọi người giúp tớ sửa rùi chạy bài này vơi. Thank mọi người nhiều:
Code:
#include <stdio.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/fcntl.h>
#include <malloc.h>
#define MAx,y) ((x)>(y)?(x)y))
struct Line_Object{
int length;
int lineth;
char text[0];
};
void get_longest_line(char *m,struct Line_Object *buf){
int len=0,lenp=0,lineth=1,linepos=0;
while(*m!=NULL){
len++;
if(*m=='\n') {
if(len>lenp) linepos=lineth;
len=MAlen,lenp);
lenp=len;
len=0;
lineth++;
}
m++;
}
out:
buf->length=lenp;
buf->lineth=linepos;
//buf->text=... unable to written now
}
int main(int argc,char **argv){
#define FILEFRAG (1024*16)
char *filename;
int filesize=0,fd=-1,sta_read=0;
char *buf=NULL;
/*get file name*/
if(argc>1) filename = argv[1];
else {
printf("%s: no file name argument \n",argv[0]);
exit(1);
}
struct stat fod;
int sta_file=stat(filename,&fod);
if(sta_file) {printf("%s: error stat file %s\n",argv[0],filename);exit(1);}
filesize=fod.st_size;
fd=open(filename,O_RDONLY,0);
if(fd<0) {printf("%s:error open file %s",argv[0],filename);exit(1);}
if(filesize<=FILEFRAG){
buf=(char*)malloc(filesize+2);
sta_read=read(fd,buf,filesize);
buf[filesize]=NULL;
}else{
buf=(char*)malloc(FILEFRAG+2);
sta_read=read(fd,buf,FILEFRAG);
buf[FILEFRAG]=NULL;
}
if(sta_read!=filesize){
printf("%s: cant read file %s\n",argv[0],filename);
exit(1);
}
//File *fpt=openfile(filename,O_RDONLY);
// continue
struct Line_Object Line;
get_longest_line(buf,&Line);
printf("%s: longest lineth %d %d\n",filename,Line.lineth,Line.length);
return 0;
} |
|
|
|
|
[Question] lập trình C trong ubuntu! |
29/05/2010 06:49:11 (+0700) | #19 | 211844 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
hix. bạn có thể hộ tớ phần code cho ý tưởng ấy được không. Giúp tớ với. Tớ rất cần! |
|
|
|
|
[Question] lập trình C trong ubuntu! |
29/05/2010 06:51:35 (+0700) | #20 | 211845 |
hoanphuong0808
Member
|
0 |
|
|
Joined: 25/05/2010 21:06:24
Messages: 16
Offline
|
|
H3x4 wrote:
Theo mình để giải quyết 1 bài toán như vậy bạn hãy suy nghĩ xem nếu bạn là CPU bạn sẽ làm gì, mình sẽ:
1/ Mở file/Tập tin đó ra
2/Đọc vào từng dòng
3/Đếm số chữ cái trên 1 dòng
4/Ghi số đó vào 1 tờ giấy nháp( và ghi số dòng)
5/Đọc đến hết file/tập tin
6/Đóng file/tập tin lại
7/ Tìm con số lớn nhất trong tờ nháp
=> hiện thực tương tự bằng C.
Lấy thí dụ để mở tập tin bạn có thể google : "C open file", tờ giấy nháp là một mảng tạm để lưu các con số ......
]hix. bạn có thể hộ tớ phần code cho ý tưởng ấy được không. Giúp tớ với. Tớ rất cần!
|
|
|
|
|
[Question] lập trình C trong ubuntu! |
29/05/2010 12:01:31 (+0700) | #21 | 211853 |
FaL
Moderator
|
Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
|
|
Bạn hoanphuong0808:
Từ những gợi ý trên bạn nên tự tìm tòi và tự viết lấy chương trình của mình. |
|
Hãy giữ một trái tim nóng và một cái đầu lạnh |
|
|
|
[Question] lập trình C trong ubuntu! |
29/05/2010 14:34:44 (+0700) | #22 | 211857 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
để mình code lại file này
và comment từng dòng step by step
OK ?
Sau này để hướng dẫn cho C newbie trên Linux mình sẽ có ví dụ cực hay. Guide theo từng lớp step by step
hoangphuong0808:
bài này mình code dùng system call nên khó hiểu.
bạn có thể dùng thư viện stdio.h : trong đó có hàm fopen để mở file
đề bài: tìm dòng dài nhất trong file text
hiểu đề bài: có một file text trên trời rơi xuống và tìm dòng dài nhất
mà tìm là sao, tức là thấy nó dài thì định vị nó
làm sao định vị nó, bằng cách nói ra số thứ tự của dòng đó
thêm thông tin nữa là ghi nhận lại dòng đó
+thông tin về cách thức file text xuống dòng:
file text là file thường, có nội dung là các kí tự ASCII liên tiếp nhau
để xuống dòng người ta dùng character đặc biệt kí tự xuống dòng: mã là 0xa
vì kí tự này không hiển thị nên để diễn đạt nó: ta dùng LF để nói về nó
đó là cách của Unix phân cách dòng.
Trên Window notepad dùng 2 kí tự để xuống dòng CRLF
Nếu tra trong bảng mã ASCII thì bạn sẽ hiểu
suy ra: nếu quét qua file và count được số kí tự xuống dòng (cũng chính là số dòng) đồng thời count được số kí tự trong dòng. Và quá trình quét so sánh liên tục đến hết file thì sẽ tìm được dòng dài nhất.
+hướng giải:
Vì file trên đĩa và các toán tử của C chỉ làm việc với bộ nhớ, nên ta tìm cách đọc file vào bộ nhớ hay map file vào bộ nhớ.
Việc map file vào bộ nhớ có nhiều cách :
Cách: + dùng thư viện stdio.h có hàm fopen() fclose() //khuyên bạn nên xài vì đơn giản
+dùng system call: cách này hơi khó nhưng hay và nhanh hơn
Cách sử dụng stdio.h thì mình sẽ hướng dẫn mở file và đọc như thế nào.
cách này được sử dụng nhiều nhất vì mở file đơn giản không phức tạp.
Nhưng mình đã gửi code cho bạn xài bằng cách system call. Khó cho newbie.
Nhưng lỡ rùi thì mình giải thích sơ sơ qua:
trước tiên phải stat file để biết file đó có tồn tại không, nếu có thì đồng thời cũng có thể lấy thông tin về file đó, file đó có cho đọc không
Code:
struct stat fod; //của /usr/include/sys/stat.h
if(stat(filename,&fod)) {
printf("error: khong stat được file\n");/của stdio.h
exit (1); //của stdlib.h
}
int filesize=fod.st_size;
int fd =open(const char *filename,int oflag,...); //trong /usr/include/fcntl.h
sau khi mở thì đọc file vào bộ nhớ
để map file thì hơi khó nhưng giả sử file nhỏ dưới 8096 bytes tức 8KB
ta khai báo bộ nhớ chứa:
char buf[8096]; // lưu ý buf là địa chỉ
đọc vào bộ nhớ
int rd_size=read(fd,buf,filesize);
if(rd_size<0) exit(1);//nếu trong main
việc còn lại là module của mình làm thôi
Code:
/*
Written by panfider
module tìm dòng dài nhất trong file
May 28 2010
usage:
struct Line_Object Line; // định nghĩa biến Line
get_longest_line(buf,&Line); // buf là bộ nhớ của file đã map,return lại Line
printf("%s: longest lineth %d %d\n",filename,Line.lineth,Line.length);
*/
#define MAX(x,y) ((x)>(y)?(x):(y)))
struct Line_Object{
int length; //độ dài dòng đó
int lineth; //dòng thứ mấy
char text[0]; // text của dòng đó, kiểu nối tiếp
};
void get_longest_line(char *m,struct Line_Object *buf){
int len=0,lenp=0,lineth=1,linepos=0;
while(*m!=NULL){
len++;
if(*m=='\n') {
if(len>lenp) linepos=lineth;
len=MAX(len,lenp);
lenp=len;
len=0;
lineth++;
}
m++;
}
out:
buf->length=lenp;
buf->lineth=linepos;
//buf->text=... unable to written now
}
Nếu muốn xử lý file quá lớn(vài GB) thì khi stat file kiểm tra xem file đó có lớn hơn một
#define N 8 // thay thế * bằng số khác
#define MAX_READ_SIZE (N*1024) //tính theo Kbytes
Nếu file lớn hơn định nghĩa thì dùng lseek để seek và map từng fragment vào bộ nhớ
/// trình tự logic của việc giải
1. lấy name-of-file (tên file) từ int main(int argc,char **argv)
hoặc file chắc chắn có sẵn:char *filename="abc.txt";
2. mở file,
dùng fopen để mở nếu trả về NULL thì không mở được
hình dạng:FILE *fopen(const char *path, const char *mode);
Code:
FILE *fp=fopen(filename,"r");
if(FILE==NULL) {
printf("There's some problem with this file");
exit(1);
}
3. dùng fget hoặc hàm nào đó để đọc từng kí tự để count thì giải được bài tập
nếu bạn mò được địa chỉ bộ nhớ trong FILE trả về thì dùng được module của mình
đọc link sau đây sẽ có hướng dẫn về cách xài stdio.h
http://en.wikipedia.org/wiki/Fgetc
http://en.wikipedia.org/wiki/Fopen |
|
[Unix] live free or die
|
|
|
|
[Question] lập trình C trong ubuntu! |
29/05/2010 17:41:08 (+0700) | #23 | 211862 |
|
panfider
Member
|
0 |
|
|
Joined: 12/05/2010 01:51:04
Messages: 448
Offline
|
|
mà file source mình gửi cho bạn hoangphuong0808 chạy được mà
tại bạn không biết cách xài
để tránh output warning:
# gcc -o baitap file.c &>/dev/null
để tìm dòng dài nhất trong file.c thì gõ
# ./baitap file.c
nếu có lỗi thì báo cho mình biết nhé
|
|
[Unix] live free or die
|
|
|