posts - 225, comments - 62, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

几道西安交大同学给我做的程序设计

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; * &&   ! isspace( * q);q ++ );
        memcpy(str1,p,q
- p);
        str1[q
- p] = ' \0 ' ;
        
        
/* set str2 */
        
for (p = q + 1 ;isspace( * p);p ++ );
        
for (q = p; * &&   ! 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 == ||  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.  通过菜单可以定时钟的各种属性,比如指针,表盘等等的颜色;


因为还没学过图形界面的东西,这两题没有做

只有注册用户登录后才能发表评论。