......临近期末了,各种课程设计,综合性实验接踵而来,忙得人不可开交。
当然,在这种情况下,Linux的实验肯定不会错过。给我们出了个题目:其于GTK+的单词数值计算器
其实这个实验对逻辑思维的考验并不高,要求按规定输入由大写字母组合成的一个单词,计算这个单词的值,规定如下
A=1,B=2,C=3.........
若输入的单词为ABC,那自然结果就是6了。
还有就是接收输入的一个文件路径,此文件内容就是一行一行的大写字母组成的单词,分别计算出其中的值并写到当前目录下的result.txt文件中。
在写这个程序中遇到的种种困难,使我感慨万分。尤其这是在落后于其他同学的情况下赶工出来的,有些地方实现的是多么的蠢蛋。
感慨1:对于GTK+的理解,在linux下通过GTK+来设计GUI界面和通过JAVA来设计GUI的过程几乎大同小异,定义组件,定义布局,定义好事件及事件处理函数等等(只不过在GTK+中是以信号来
表示而已)。不过明显感觉到自己在GUI编程方面的不足。
感慨2:因为编写这个GTK+程序是通过c语言来写的,很明显看出自己在c基础上的薄弱。就拿其中困扰了我一段时间的回调函数传参数问题,void on_btn_word_clicked(GtkWidget *widget,gpointer data);
这个我定义的回调函数中,能够给其传其他参数的只有data这个指针了,而我想出入两个entry输入框组件,那我就纳闷了,究竟怎么传两个进去呢?想到结构体?对的,不过由于我在调用这个回调函数之前,已近把
这两个entry组件分别定义完毕且添加到table面板上了,难道要把前面的内容全部修改并重新定义一个包含这两个组件的结构体??我当然不会那么有耐心,所以不断的查啊查,解决的方法少之又少,后来给同学提醒
后才恍然大悟,只要把这两个组件的定义作为全局变量不就可以吗?才发现我原来是在用c语言来编写的,而我已经脱离了c语言来想问题。
感慨3:同样是脱离c语言来想问题,题目中要求通过一个路径来读取文件中的内容,而我竟然是去查关于如何在GTK中执行SHELL命令来打开文件,当然方法是有的,不过打开后想去操作就麻烦了,这里把我搞出了
一堆的头皮。后来只能去请教同学,得到的结果是,c语言中不就有对文件处理的方法吗?啊......郁闷啊,怎么就把它给想复杂了呢?
感慨4:对c基础的不熟悉,都已经是大3的人了,老师的美言道:“你们已经是一个中级程序员了”,可发现自己连c中对文件的操作还东查西找的。好不容易啊,看来自己要好好反省一下了。
//读文件操作 #include<stdio.h> #include<stdlib.h> int main() { char b[10]; //接受读文件后的一段 FILE *fp; //定义一个文件指针 int i; fp=fopen("a.c","rb"); //打开一个文件FILE*=fopen("\\","r+"); if(!fp) puts("File open error"); //char* fgets(string,int n,FILE *); while(fgets(b,4,fp)){ printf("%s",b); } //关闭文件 i=fclose(fp); return 1; }
最后贴出自己的这个冗长的,有点傻得代码,供以后的同胞作对比,看看要改进的地方有多少。
#include<gtk/gtk.h> #include<stdio.h> #include<string.h> #include<stdlib.h> GtkWidget *entry_word,*entry_count,*entry_path; void closeApp(GtkWidget *window,gpointer data){ gtk_main_quit(); } void on_btn_path_clicked(GtkWidget *widget,gpointer data){ const char*str=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)data)); char buf[100]; int count[100]; int len; int exchange; int i; int j=0; FILE *f; FILE *fp=fopen(str,"r+"); if(!fp){ g_print("not exit!"); gtk_main_quit(); } while(fgets(buf,100,fp)!=NULL) { len=strlen(buf); buf[len-1]='\0'; for(i=0;i<len-1;i++) { exchange=buf[i]-64; count[j]+=exchange; } j++; g_print(buf); } f=fopen("result.txt","w+"); for(i=0;i<j-1;i++) fprintf(f,"%d\n",count[i]); //fwrite(count,sizeof(int),j,f); fclose(f); printf("%d\n",count[0]); printf("%d\n",count[1]); } void on_btn_word_clicked(GtkWidget *widget,gpointer data){ const char *str=gtk_entry_get_text(GTK_ENTRY((GtkWidget *)data)); char *c; int len=strlen(str); int flag=0; int count=0; int i=0; for(i=0;i<len;i++){//此处能修改,不需如此操作 switch(str[i]){ case 'A':{count+=1;break;} case 'B':{count+=2;break;} case 'C':{count+=3;break;} case 'D':{count+=4;break;} case 'E':{count+=5;break;} case 'F':{count+=6;break;} case 'G':{count+=7;break;} case 'H':{count+=8;break;} case 'I':{count+=9;break;} case 'J':{count+=10;break;} case 'K':{count+=11;break;} case 'L':{count+=12;break;} case 'M':{count+=13;break;} case 'N':{count+=14;break;} case 'O':{count+=15;break;} case 'P':{count+=16;break;} case 'Q':{count+=17;break;} case 'R':{count+=18;break;} case 'S':{count+=19;break;} case 'T':{count+=20;break;} case 'U':{count+=21;break;} case 'V':{count+=22;break;} case 'W':{count+=23;break;} case 'X':{count+=24;break;} case 'Y':{count+=25;break;} case 'Z':{count+=26;break;} default:flag=1; }//~switch }//~for sprintf(c,"%d",count); if(flag==0){ gtk_entry_set_text(GTK_ENTRY(entry_count),c); } else gtk_entry_set_text(GTK_ENTRY(entry_count),"Error!"); } int main(int argc,char* argv[]){ GtkWidget *window; GtkWidget *btn_word,*btn_path; GtkWidget *label_word,*label_count,*label_path; GtkWidget *table; gtk_init(&argc,&argv); window=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window),"caculate"); gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window),400,400); g_signal_connect(GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(closeApp),NULL); table=gtk_table_new(7,3,TRUE); gtk_table_set_row_spacings(GTK_TABLE(table),2); gtk_table_set_col_spacings(GTK_TABLE(table),2); gtk_container_add(GTK_CONTAINER(window),table); entry_word=gtk_entry_new_with_max_length(26); gtk_table_attach_defaults(GTK_TABLE(table),entry_word,0,2,1,2); btn_word=gtk_button_new_with_label("Sure"); g_signal_connect(G_OBJECT(btn_word),"clicked",G_CALLBACK(on_btn_word_clicked),entry_word); gtk_table_attach_defaults(GTK_TABLE(table),btn_word,2,3,1,2); entry_path=gtk_entry_new_with_max_length(30); gtk_table_attach_defaults(GTK_TABLE(table),entry_path,0,2,5,6); btn_path=gtk_button_new_with_label("Sure"); g_signal_connect(G_OBJECT(btn_path),"clicked",G_CALLBACK(on_btn_path_clicked),entry_path); gtk_table_attach_defaults(GTK_TABLE(table),btn_path,2,3,5,6); label_word=gtk_label_new("import a String!"); gtk_table_attach_defaults(GTK_TABLE(table),label_word,0,1,0,1); label_count=gtk_label_new("Count:"); gtk_table_attach_defaults(GTK_TABLE(table),label_count,0,1,2,3); entry_count=gtk_entry_new_with_max_length(3); gtk_table_attach_defaults(GTK_TABLE(table),entry_count,1,2,2,3); label_path=gtk_label_new("Import a Path!"); gtk_table_attach_defaults(GTK_TABLE(table),label_path,0,1,4,5); gtk_widget_show_all(window); gtk_main(); return 0; }
在shell下执行编译命令:gcc caculate.c -o caculate `pkg-config gtk+-2.0 --cflags --libs`