一.实验要求
实现基于GTK+的单词数值计算器。该功能如下:
(1)按照规则计算单词的值,如果AB C D E F G H I J K L M N O P Q R S T U V W S Y Z 26个大写字母(全部用大写)的值分别为12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26,如:
LOVE=L+O+V+E=12+15+22+5=54%
(2)程序的界面参照书上P224,在第一个单行文本框输入一个单词,单击“计算”按钮,按照以上算法计算出该单词的值。
(3)如果在最下面的单行文本框输入一个文件路径,此文件每行记录一个单词,那么经过程序计算出各个单词的值,并把结果输出到当前目录下result.txt文件中。如果文件不存在,应该提示错误。
二.程序设计思路(含流程图、算法、界面布局说明、控件数量及类型等等)
1.流程图
略
2.算法
2.1计算单词的值
2.1.1 提取单词,用数组存放
2.1.2 计算单词的长度
2.1.3依次计算字母的值,相加。
2.1.4将单词的值显示
2.2计算文件中单词的值
2.2.1提取文件中的单词存入array[][]
2.2.2计算各单词的值,算完一个单词,就将单词及值输入对应文件。
3.界面布局说明
gtk_box_pack_start(GTK_BOX(hbox1),label1,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox1),entry1,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox2),label2,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox2),label4,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox2),button1,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox3),entry3,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(hbox3),button2,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),hbox1,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),hbox2,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),label3,TRUE,FALSE,0);
gtk_box_pack_start(GTK_BOX(vbox),hbox3,TRUE,FALSE,0);
4.控件数量及类型
(1)窗体控件GtkWindow 1个
(2)按钮控件GtkButton 2个
(3)标签控件GtkLabel 4个
(4)文本框控件GtkEntry 2个
(5)消息对话框控件GtkMessageDialog 2个
三.程序核心代码(需要有相关注释)
void button_clicked1(GtkWidget*widget,gpointer data)//计算单词的值
{
intsum=0;
inti,length;
char*input;
char*value;
value=(gchar*)data;//存放单词
length=strlen(value);//单词长度
for(i=0;i<length;i++)sum=sum+value[i]-64;//计算
sprintf((gchar*)value,"%d",sum);
gtk_label_set_text((GtkLabel*)label4,value);//输出
}
void button_clicked2(GtkWidget*widget,gpointer data)//计算文件中单词的值
{
GtkWidget*dialog;
gchar*temp="输入的文件路径不存在!";
gchar*tmp="计算成功";
charc,array[100][100];
char*file,*vlue;
FILE*open,*result;
inti,j,k,length,sum;
file=(gchar*)data;
open=fopen(file,"r");//打开文件
if(!open)//若是文件不存在,则提示
{
dialog=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,temp);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
return;
}
for(i=0;;i++)//将文件中的单词取出来,存入array[][]中
{
for(j=0;;j++)
{
c=fgetc(open);
if(c==10)//若是该单词已结束,跳出当前循环
{
array[i][j]='\0';
break;
}
elseif(c==EOF) break;
elsearray[i][j]=c;
}
if(c==EOF)break;
}
length=i;//表示单词的个数
result=fopen("./result.txt","w++");
for(i=0;i<length;i++)//如上一个函数
{
fprintf(result,"%s ",array[i]);
k=strlen(array[i]);
sum=0;
for(j=0;j<k;j++)sum=sum+array[i][j]-64;
fprintf(result,"%d\n",sum);
}
dialog=gtk_message_dialog_new(NULL,GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_INFO,GTK_BUTTONS_OK,tmp);//提示成功
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
fclose(result);
fclose(open);
}
四.程序运行效果
1.主界面
2.输入单词及执行结果
3.输入错误的文件路径
4.输入正确的文件路径及结果
五.实验总结
本次实验主要按照书上关于控件的用法以及容器的布局就可完成,主要遇到的问题就是GTK+自带的函数不太清楚,需要上网查询。