Posted on 2006-04-29 16:53
魔のkyo 阅读(624)
评论(0) 编辑 收藏 引用 所属分类:
Programming
实验二:寻找基数
问题描述:同一个数会由于采用不同的基数而似的其表现形式是完全不一样的,在我们的学习中,我们熟悉的基数有10进制、12进制、60进制、2进制、8进制和16进制。比如数据12,如果我们用2进制表示,则它就是1100;如果用3进制表示就是110;如果用8进制表示则是14。我们的编程任务就是与数的进制(也就是基数)有关。
程序中我们会给大家很多个数对(假设每个数对的数用X和Y表示),程序需要解决的问题就是为X和Y各选择一个最小的基数,以使得这两个数在其选择的基数上是一对相等的数。
例如,12和5 这个数对,我们可以为12选择基数3,为5选择基数6,这样一来12(base 3)=5(base 6),因为12(base 3)就是10进制数5,而5(base 6)也是10进制数中的5。
输入:
程序的输入是通过文件完成的。
文件的每一行都包含一个数对X和Y,两个数通过一个或多个空格符分割,与X和Y相关联的有效基数值范围为2~36。X和Y的合理数值表示字符包括0-9和A-Z(表示数值10-35)。
文件的最后一行用一个数字0表示输入的结束。
样例输入文件(base.in)
12 5
10 A
12 34
123 456
1 2
10 2
0
输出:
结果应该存放在一个文件中,该文件中的的每一行对应为输入文件中相应的那行数对,输出的格式按照下面的的示例文件即可。
样例输出文件(base.out)
12(base 3)=5(base 6)
10(base10)=A(base 11)
12(base 17)=34(base 5)
123 is not equal to 456 in any base 2..36
1 is not equal to 2 in any base 2..36
10 (base 2)=2(base 3)
/*
下面是一个控制台输入输出版本
*/
#include
<
stdio.h
>
#include
<
stdlib.h
>
#include
<
string
.h
>
#include
<
ctype.h
>
int
strtoi(
const
char
*
str,
int
base
);
int
main()
{
int
X,Y,base1,base2;
char
line[
100
],str1[
100
],str2[
100
],
*
p,
*
q;
while
(
1
){
gets(line);
if
(
!
atoi(line))
break
;
/*
set str1
*/
for
(p
=
line;isspace(
*
p);p
++
);
for
(q
=
p;
*
q
&&
!
isspace(
*
q);q
++
);
memcpy(str1,p,q
-
p);
str1[q
-
p]
=
'
\0
'
;
/*
set str2
*/
for
(p
=
q
+
1
;isspace(
*
p);p
++
);
for
(q
=
p;
*
q
&&
!
isspace(
*
q);q
++
);
memcpy(str2,p,q
-
p);
str2[q
-
p]
=
'
\0
'
;
for
(base1
=
2
;base1
<=
36
;base1
++
){
X
=
strtoi(str1,base1);
if
(
!
X)
continue
;
for
(base2
=
2
;base2
<=
36
;base2
++
){
Y
=
strtoi(str2,base2);
if
(
!
Y)
continue
;
if
(X
==
Y){
printf(
"
%s(base %d)=%s(base %d)\n
"
,str1,base1,str2,base2);
goto
next;
}
}
}
next:
if
(base1
>
36
){
printf(
"
%s is not equal to %s in any base 2..36\n
"
,str1,str2);
}
}
return
0
;
}
int
strtoi(
const
char
*
str,
int
base
)
{
int
res
=
0
,t;
const
char
*
p;
for
(p
=
str;
*
p;p
++
){
if
(isdigit(
*
p)){
t
=*
p
-
'
0
'
;
}
else
if
(isupper(
*
p)){
t
=*
p
-
'
A
'
+
10
;
}
else
{
printf(
"
parameter is not legitimate!\n
"
);
exit(
1
);
}
if
(t
>=
base
)
return
0
;
res
*=
base
;
res
+=
t;
}
return
res;
}
实验三
词汇统计
问题描述:
统计输入文件中出现的不同的单词个数依旧每个单词出现的频率,并且将这些单词按照词典顺序排列好输出到文件中。
输入:
以文件形式记录程序中所需要的数据。
样例输入文件(
word.in
)
This is a book.Its name is “C Programming”.
输出:
结果应该存放在一个文件中,该文件中的第一行为不同的单词个数,从第二行开始则为每一个单词和其相应出现的频率,单词与频率数之间用空格符分割,单词需按字典顺序排列。
样例输出文件(
word.out
)
8
a 1
book 1
c 1
is 2
its 1
name 1
programming 1
this 1
#include
<
stdio.h
>
#include
<
stdlib.h
>
#include
<
string
.h
>
#include
<
ctype.h
>
#define
OK 1
#define
ERROR 0
typedef
int
Status;
#define
MAXLENGTH 20
//
设置单词的最大长度,我想应该没有超过19的字母的单词
FILE
*
fin,
*
fout;
//
将出现的单词与频率数保存在一个带有头结点的链表中进行统计
typedef
struct
node{
char
word[MAXLENGTH];
//
单词
int
counts;
//
频率
struct
node
*
next;
} node,
*
nodeptr,
*
list;
//
初始化L,头节点的counts域记录不同单词的个数(也是L中的数据结点的个数)
Status InitList(list
&
L){
L
=
(list)malloc(
sizeof
(node));
if
(
!
L)
return
ERROR;
L
->
counts
=
0
;
L
->
next
=
NULL;
return
OK;
}
void
DestoryList(list
&
L){
nodeptr p;
while
(L
!=
NULL){
p
=
L;
L
=
L
->
next;
free(p);
}
}
//
将p指向的结点按照word域对应的字母表顺序插入到表L中
Status InsertList(list L,nodeptr p){
nodeptr pre
=
L;
while
(
!
( (pre
==
L
||
strcmp(pre
->
word,p
->
word)
<
0
)
&&
(pre
->
next
==
NULL
||
strcmp(p
->
word,pre
->
next
->
word)
<
0
)))
pre
=
pre
->
next;
//
用上面这句确定pre的正确位置,即保证p被插入到按字母表排序的适当位置
p
->
next
=
pre
->
next;
pre
->
next
=
p;
p
->
counts
=
1
;
L
->
counts
++
;
return
OK;
}
//
在L中查找str,如果找到就将对应结点的counts域加一并返回OK
//
返回值为OK表示找到,ERROR表示没有找到
Status SearchList(list L,
const
char
*
str){
nodeptr p
=
L
->
next;
while
(p
!=
NULL){
if
(
!
strcmp(p
->
word,str)){
p
->
counts
++
;
return
OK;
}
p
=
p
->
next;
}
return
ERROR;
}
//
按照题目要求打印线性表
void
PrintList(list L){
nodeptr p;
fprintf(fout,
"
%d\n
"
,L
->
counts);
p
=
L
->
next;
while
(p
!=
NULL){
fprintf(fout,
"
%s %d\n
"
,p
->
word,p
->
counts);
p
=
p
->
next;
}
}
int
main()
{
char
str[MAXLENGTH],ch,
*
str_p;
list L;
nodeptr p;
int
status;
InitList(L);
fin
=
fopen(
"
word.in
"
,
"
r
"
);
if
(fin
==
NULL){
printf(
"
输入文件打开失败!
"
);
exit(
1
);
}
fout
=
fopen(
"
word.out
"
,
"
w
"
);
if
(fout
==
NULL)exit(
1
);
//
ch
=
fgetc(fin);
while
(
1
){
if
(ch
==
EOF)
goto
end;
while
(
!
isalpha(ch)){
ch
=
fgetc(fin);
if
(ch
==
EOF)
goto
end;
}
str_p
=
str;
while
(isalpha(ch)){
*
(str_p
++
)
=
tolower(ch);
ch
=
fgetc(fin);
}
*
str_p
=
'
\0
'
;
//
status
=
SearchList(L,str);
if
(status
==
ERROR){
p
=
(nodeptr)malloc(
sizeof
(node));
strcpy(p
->
word,str);
InsertList(L,p);
}
}
end:
PrintList(L);
DestoryList(L);
return
0
;
}
实验四、设计能够计算日期相减的计算器
要求:
1.
使用对话框的形式实现一个可视化的计算器;
2.
实现
+
、—、
*
、
/
、
C
、
CE
等数学计算功能。
3.
在文本框中输入格式为
yyy/mm/dd
的数据,然后按‘—’运算按纽,再输入一个
yyy/mm/dd
的数据,紧接着按‘
=
’按纽即可得到两个日期之间相差的天数。例如:
2006/03/20
—
2006/03/19 = 1
2006/03/20
—
2006/03/21 = -1
实验五、指针式时钟
要求:
1.
为该程序设计一个美观大方的图标;
2.
可视化的显示一个时钟;
3.
通过菜单可以定时钟的各种属性,比如指针,表盘等等的颜色;
因为还没学过图形界面的东西,这两题没有做