2008年12月31日星期三

字符串中找出数字并求和

由键盘输入一个字符串,其中包括字母和数字,输出字符串中十进制数的和。
入:AJJJH FJ 378 ,DH DSAUH 1507
出:375+1507=1882

分析:
扫描字符串,发现数字标记数字起始位置。当数字变回非数字字符时,提取数字并将其转换为数字,累加数字求和。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

#define MAX 256

int main(int argc, char **argv)
{
char buffer[MAX], ch;
int i = 0, len;
int start_flg = 0, start_pos = 0, sum = 0;
memset(buffer, '\0', sizeof(char) * MAX);

ch = getchar();
while (ch != 0x0A) {
buffer[i] = ch;
ch = getchar();
i++;
}
len = strlen(buffer);

for (i = 0; i <= len; i++) {
if (!start_flg && buffer[i] >= '0' && buffer[i] <= '9') {
start_pos = i;
start_flg = 1;
} else if (start_flg && (buffer[i] < '0' || buffer[i] > '9')) {
buffer[i] = '\0';
int tmp = atoi(buffer + start_pos);
sum += tmp;
printf("%d\n", tmp);
start_flg = 0;
}
}

printf("%d\n", sum);

return 0;
}

2008年12月30日星期二

字符串操作

由键盘输入一个不超过40个字符的字符串,已知其中有两个“A”,请你编程完成以下任务:
(1)求出每个“A”所在的位置
(2)求出两个“A”之间的字符及字符个数

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

#define MAX_LEN 40

int main(int argc, char **argv)
{
char buffer[MAX_LEN];
int len;
int p1, p2, i;
int flg = 1;
memset(buffer, '\0', sizeof(char) * MAX_LEN);

scanf("%s", buffer);
len = strlen(buffer);

for (i = 0; i < len; i++) {
if (buffer[i] == 'A' && flg) {
p1 = i;
flg = 0;
} else if (buffer[i] == 'A') {
p2 = i;
break;
}
}

printf("p1: %d, p2: %d\n", p1, p2);
printf("len: %d\n", p2 - p1);
for (i = p1; i < p2-1; i++) {
printf("%c", buffer[p2-i-1+p1]);
}
printf("\n");

return 0;
}

圆环上求素数

给出一个取数长度L(1<=L<=5),然后从1开始按顺时针方向连续取L个数字,拼成一个长为L位的数,此时共有9个长为L位的数,然后输出这9个数中的素数。
例如:L=2,此时9个长度为2位的数为:
12,23,34,45,56,67,78,89,90.其中素数有:23,67,89

分析:
先根据长度求出9个数,这里注意并没有0打头的数,所以只有9个。使用数组和下标模运算模拟环状的数据结构。使用循环计算出对应的数据,存入结果数组中。遍历数组,确定素数。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

#define LEN 9

int main(int argc, char **argv)
{
int ring[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int re[LEN];
memset(re, 0, sizeof(int) * LEN);
int l, i, j, flg;
scanf("%d", &l);

for (i = 0; i < 10; i++) {
for (j = 0; j < l; j++) {
re[i] = re[i] + ring[(i+j) % 10] * (int)pow((double)10, (double)(l-1-j));
}
}

for (i = 0; i < LEN; i++) {
flg = 1;
for (j = 2; j < re[i]; j++) {
if (re[i] % j == 0) {
flg = 0;
}
}
if (flg) {
printf("%d\t", re[i]);
}
}
printf("\n");

/**
for (i = 0; i < LEN; i++) {
printf("%d\n", re[i]);
}
*/

return 0;
}

2008年12月28日星期日

05年第四题 约定的密码

05年第四题 约定的密码

林林和他的几个同学对计算机程序设计都相当有兴趣,假期临近了,他们平时商量研究的一些问题想利用假期进一步完善.因为放假他们无法天天见面,因此他们决定以电子邮件来传送每个人的研究报告,但考虑邮件在传输过程中有可能出现问题,因此商定了一组加密的方式。你作为研究组的成员之一,编程将明码破解出密码。

明码方式一:由四部分组成(此四部分,两两之间用一个空格隔开,以一个$为结束标志),第一部分为数字1用来表示方式1;第二部分为一个键盘符号(不包括空格和$)组成的字符串(长度不超过30个字符);第三部分(m)、第四部分(n) 均为正整数(0<30),表示对于给定的字符串从第m个字符起,截取n个。然后将截得的字符串逆序输出则为密码。

例如:

明码的键盘输入:1 abcdefghlmnopq 3 5$

密码的屏幕输出:gfedc

明码方式二:由三部分组成(此三部分,两两之间用空格隔开,以一个$为结束标志),第一部分为数字2表示方式2;其后为两个不超过五位长的正整数(m,n,2<99999),

求这两个数从m到n之间的所有素数(质数),并将这些素数连结成的没有空格的字符串为密码。

例如:

明码的键盘输入:2 30 80$

密码的屏幕输出:3137414347515357596167717379

分析:
  本题分为两种模式,一种是字符串反向输出,另一种是求某区间内的素数。具体内容是基本算法,本体主要难度在于对输入的处理,应根据空格和$符号对输入进行拆分,在分别根据条件进行处理。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

int main(int argc, char **argv)
{
int len, i, t;
char buffer[60];
char s[4][31], ch;
int last, current;

for (i = 0; i < 4; i++) {
memset(s[i], '\0', sizeof(char) * 31);
}

len = 0;
ch = getchar();
while (ch != 0x0A) {
buffer[len] = ch;
ch = getchar();
len++;
}
buffer[len] = '\0';

t = 0;
last = 0;
current = 0;
for (i = 0; i < len; i++) {
if (buffer[i] == ' ' || buffer[i] == '$') {
current = i;
strncpy(s[t], &buffer[last], current - last);
t++;
last = current;
}
}

if (s[0][0] == '1') {
len = strlen(s[1]);
printf("%d\n", atoi(s[3]));
for (i = atoi(s[2]); i < atoi(s[2]) + atoi(s[3]); i++) {
printf("%c", s[1][len-i]);
}
printf("\n");
} else {
int min, max, j, flg;
min = atoi(s[1]);
max = atoi(s[2]);
for (i = min; i <= max; i++) {
flg = 1;
for (j = 2; j < i; j++) {
if (i % j == 0) {
flg = 0;
break;
}
}
if (flg == 1) {
printf("%d", i);
}
}
printf("\n");
}

return 0;
}

05年复赛第三题 求两数相加的和

05年复赛第三题 求两数相加的和

对于任意输入的位长可达100位的两个正整数,求它们的和。

输入样例:
234,456
输出样例:
790

分析:
大数加法,使用数组模拟存储,加法计算方法使用循环模拟。
此部分由于C语言特点,使用了命令行参数,以后有待完善。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

int main(int argc, char **argv)
{
int *a, *b, *c, m, n, p, i;
m = strlen(argv[1]);
n = strlen(argv[2]);

p = m>n ? m:n;

a = malloc(sizeof(int) * p);
b = malloc(sizeof(int) * p);
c = malloc(sizeof(int) * (p+1));
memset(a, 0, sizeof(int) * p);
memset(b, 0, sizeof(int) * p);
memset(c, 0, sizeof(int) * (p+1));

for (i = m-1; i >= 0; i--) {
a[i] = argv[1][m-1-i] - '0';
}

for (i = n-1; i >= 0; i--) {
b[i] = argv[2][n-1-i] - '0';
}

for (i = 0; i < p; i++) {
c[i] = a[i] + b[i] + c[i];
if (c[i] >= 10) {
c[i+1]++;
c[i] = c[i] % 10;
}
}

for (i = 0; i < m; i++) {
printf("%d", a[i]);
}
printf("\n");
for (i = 0; i < n; i++) {
printf("%d", b[i]);
}
printf("\n");
for (i = 0; i < p+1; i++) {
printf("%d", c[i]);
}
printf("\n");
if (c[p] == 0) {
for (i = p-1; i >= 0; i--) {
printf("%d", c[i]);
}
} else {
for (i = p; i >= 0; i--) {
printf("%d", c[i]);
}
}
printf("\n");

free(a); free(b); free(c);

return 0;
}

05年复赛第二题 城市的道路

05年复赛第二题 城市的道路

某城市的道路呈整齐的方格网状,东西走向的道路为M条,南北走向的道路为N条,某人住在城市的西南角A处,每天骑自行车到东北角的B处上班。为了顺便观光市容,他经常改变行车路线,他的原则是每次行车只能向北或向东,总是朝着单位的方向,最后一定到达单位.这样从A点到B点有多少种走法?
由键盘输入M和N的值(1<=20,且为整数),在屏幕上输出显示走法总数.>
例如:左图为东西向有5条,南北向有9条路,从A点(西南角)走向B点(东北角)共有495种走法.
输入样例:(键盘)
5,9
输出样例:(屏幕)
495

分析:
  本题使用二维数组进行道路的模拟,每个结点表示从(0,0)点到本结点的路线总数。
1----1

1----1
| |
| |
| |
1----2

1----1
| |
| |
| |
1----2
| |
| |
| |
1----3

1----1----1
| | |
| | |
| | |
1----2----3
| | |
| | |
| | |
1----3----6

根据此分析,路线数=左侧路线数+上方路线数,由此迭代解决此问题。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >
#include < string.h >

int main(int argc, char **argv)
{
int m, n, i, j;
long long **matrix;
scanf("%d, %d", &m, &n);
matrix = malloc(sizeof(long long *) * m);
for (i = 0; i < m; i++) {
matrix[i] = (long long *)malloc(sizeof(long long) * n);
}
for (i = 0; i < m; i++) {
matrix[i][0] = 1;
}
for (j = 0; j < n; j++) {
matrix[0][j] = 1;
}

for (i = 1; i < m; i++) {
for (j = 1; j < n; j++) {
matrix[i][j] = matrix[i-1][j] + matrix[i][j-1];
}
}

for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%lld\t", matrix[i][j]);
}
printf("\n");
}
printf("%lld\n", matrix[m-1][n-1]);

for (i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);

return 0;
}

05年复赛第一题 不高兴的津津

05年复赛第一题 不高兴的津津

将要升入七年级的津津,希望按照每天8小时的学习时间,其他时间让他接触自己有兴趣的活动.对于家长为他安排的校外学习,超过了8小时他是不高兴的.对于给出的下一周(7天)每天上午、下午、晚上三个学习时间(正整数)安排,找出津津哪一天不高兴(周一用1表示、周二用2表示、周三用3表示.......周六用6表示,周七用7表示)。当"不高兴的一天"学习时间一样时则输出最靠前的一天。当一周没有“不高兴”的一天则输出0。

输入样例:(键盘输入)

4,3,1

4,2,1

4,3,2

4,3,1

4,3,2

3,3,1

2,2,1

输出样例:(屏幕输出)

3

分析:
本题要求对每天学习时间求和,并对和作出判断。由于一周有7天,每天三个时段,使用7行3列的二维数组存储数据,行为每天三个时段学习时间,对每一行求和,判断和是否大于8。如大于8输出当前日期序号,如一周都没有则输出0。

C代码:

#include < stdio.h >
#include < stdlib.h >
#include < math.h >

#define DAYS 7

int main(int argc, char **argv)
{
int i;
int a[7][3];

for (i = 0; i < DAYS; i++) {
scanf("%d, %d, %d", &a[i][0], &a[i][1], &a[i][2]);
}

for (i = 0; i < DAYS; i++) {
if (a[i][0] + a[i][1] + a[i][2] > 8) {
printf("%d\n", i + 1);
return 0;
}
}
printf("0\n");

return 0;
}

2008年12月16日星期二

绘制圆[趣味编程百例]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

    在屏幕上用"*"画一个空心的圆
*问题分析与算法设计
    打印圆可利用图形的左右对称性。根据圆的方程:
    R*R=X*X+Y*Y
    可以算出圆上每一点行和列的对应关系。
*程序说明与注释
#include<stdio.h>
#include<math.h>
void main()
{
    double y;
    int x,m;
    for(y=10;y>=-10;y--)
    {
        m=2.5*sqrt(100-y*y);   
/*计算行y对应的列坐标m,2.5是屏幕纵横比调节系数因为屏幕的
                                 
行距大于列距,不进行调节显示出来的将是椭圆*/
        for(x=1;x<30-m;x++)
printf(" ");     /*图形左侧空白控制*/
        printf("*");                        
/*圆的左侧*/
        for(;x<30+m;x++) printf("
");       /*图形的空心部分控制*/
        printf("*\n");                     
/*圆的右侧*/        
    }
}
运行结果
*思考题
实现函数y=x2的图形与圆的图形叠加显示

- --
马利
richard.ma

My PGP Pulic Key:
http://keyserver.pgp.com

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFJR4XW2mVtRsgDCtsRAkgzAJ9qCAVRKt4yFtDQTgJCstwNzQ2b5wCfZ1XS
Hdsm71cyB3a5dxYsR9lg+iI=
=pUOv
-----END PGP SIGNATURE-----


绘制余弦曲线和直线[趣味编程百例]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

   
在屏幕上显示0~360度的cos(x)曲线与直线f(x)=45*(y-1)+31的迭加图形。其中cos(x)图形用"*"表示,f(x)用"+"表示,在两个图形相交的点上则用f(x)图形的符号。
*问题分析与算法设计
   
本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判断图形的交点,再分别控制打印两个不同的图形。
*程序注释与说明
#include<stdio.h>
#include<math.h>  
void main()
{
    double y;
    int x,m,n,yy;
    for(yy=0;yy<=20;yy++) /*对于第一个y坐标进行计算并在一行中打印图形*/
    {
       
y=0.1*yy;                      
/*y:屏幕行方向坐标*/
       
m=acos(1-y)*10;       /*m:
cos(x)曲线上y点对应的屏幕列坐标*/
       
n=45*(y-1)+31;        /*n:
直线上y点对应的列坐标*/
       
for(x=0;x<=62;x++)             
/*x: 屏幕列方向坐标*/
           
if(x==m&&x==n) printf("+");  /*直线与cos(x)相交时打印"+"*/
            else
if(x==n) printf("+");   /*打印不相交时的直线图形*/
            else
if(x==m||x==62-m) printf("*");  /*打印不相交时的cos(x)图形*/
            else 
printf("
");                 
/*其它情况打印空格*/
        printf("\n");
    }
}
*运行结果
*思考题
    如何实现sin(x)曲线与cos(x)曲线图形的同时显示。

- --
马利
richard.ma

My PGP Pulic Key:
http://keyserver.pgp.com

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFJR4Sn2mVtRsgDCtsRAtZHAJ9bOwY4rUQDh2D6qcxw9xD/GRzyPwCcCkao
Be54Ko4qINBAXYJAO4tIIkw=
=GzV+
-----END PGP SIGNATURE-----


绘制余弦曲线[趣味编程百例]

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

在屏幕上用"*"显示0~360度的余弦函数cos(x)曲线
*问题分析与算法设计
    如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。
   
关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个"*"。
   为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就
应为62-m。程序中利用反余弦函数acos计算坐标(x,y)的对应关系。
    使用这种方法编出的程序短小精炼,体现了一定的技巧。
*程序说明与注释
#include<stdio.h>
#include<math.h>
void main()
{
    double y;
    int x,m;
   
for(y=1;y>=-1;y-=0.1)         
/*y为列方向,值从1到-1,步长为0.1*/
    {
       
m=acos(y)*10;             
/*计算出y对应的弧度m,乘以10为图形放大倍数*/
        for(x=1;x<m;x++) printf(" ");
       
printf("*");               
/*控制打印左侧的 * 号*/
        for(;x<62-m;x++)printf(" ");
       
printf("*\n");            
/*控制打印同一行中对称的右侧*号*/
    }
}
*运行结果
*思考题
    如何实现用"*"显示0~360度的sin(x)曲线。

- --
马利
richard.ma

My PGP Pulic Key:
http://keyserver.pgp.com

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFJR4L12mVtRsgDCtsRAnYyAJ9ekmZRHMNkyasYBzXCX/9ztOKAzgCdEQzK
PtAXsNLxq9tKdvzXtOeGU7E=
=AvA1
-----END PGP SIGNATURE-----


2008年11月1日星期六

辗转相除法求最大公约数1

辗转相除法求最大公约数1


#include

int main(int argc, char **argv)
{
if (argc < 3) {
printf("Usage: gcd_1 num1 num2\n");
return -1;
}
int a = atoi(argv[1]);
int b = atoi(argv[2]);

while (b != 0) {
int temp = a;
a = b;
b = temp % b;
}

printf("%d\n", a);

return 0;
}

2008年10月12日星期日

代码阅读方法

在信息学初赛笔试题目中,有看程序写结果和完善程序这两个形式的大题,这两道题目都需要参赛选手对于程序进行阅读,在读懂程序的基础上,总结程序编写人的意图和解决问题的方式,进而完成题目要求,得出答案。

阅读程序代码作为学习编写计算机程序的一个重要组成部分,在开阔视野,锻炼逻辑思维能力,熟悉计算机语言等方面都有很大的作用,我在培养学生阅读能力上采用以下办法。

语言初级学习阶段(语言基础学习完成前):由于学生还不具备阅读完整程序的能力,先就学生既得知识编写小段程序,让学生在阅读中熟悉计算机语言的语法。

语言中级学习阶段(语言基础学习已完成):学生在这时候已经可以看懂带有一定功能性的程序,让学生将程序按照功能及程序的步骤对程序进行分块阅读训练,使学生学会将复杂问题分解为若干简单问题,在细化解决的方法,渗透计算机问题解决的基本方法。

语言高级学习阶段(已经可以对简单的实际问题用计算机程序进行解决):学生在这个阶段已经具备了一定的解决问题的能力和编写代码的能力,倡导学生使用多种方法解决同一问题,然后互相交换代码,阅读后相互说说对方的思路与解决方法,达到算法多样化和训练快速接受他人思维方式的能力。

2008年10月2日星期四

Qbasic函数一览表

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFI45612mVtRsgDCtsRAoUhAJ9yQBPgy5A5UPxeHg+W878TbvGQFACggPBS
uPmUMDP0HerxAS2CQ3gG4sE=
=dKjy
-----END PGP SIGNATURE-----
*Qbasic函数一览表*
LET (赋值语句)
格式:[LET] 变量=表达式
功能:先计算右边表达式,然后将结果赋给左边的变量

SWAP (变量值交换语句)
格式:SWAP 变量1,变量2
功能:将变量1和变量2的值进行交换

PRINT (显示或输出语句)
格式:PRINT [表达式表][,|;]
功能:将指定的数据显示在屏幕上

LPRINT (打印语句)
格式:LPRINT [表达式表][,|;]
功能:将指定的数据用打印机打印出来

REM (注释语句)
格式1:REM 注释内容
格式2:' 注释内容
功能:在程序中加以解释来说明该程序段的作用

END (结束语句)
格式:END
功能:结束一个程序

CLS (清屏语句)
格式:CLS
功能:清除屏幕上显示的信息

PRINT USING (自选显示格式语句)
格式:PRINT USING 〈"格式字符串"〉;〈表达式表〉 [;]
功能:根据格式字符串规定的格式,将表达式表中的数据显示在屏幕上

LPRINT USING (自选打印格式语句)
格式:LPRINT USING 〈"格式字符串"〉;〈表达式表〉[;]
功能:根据格式字符串规定的格式,将表达式表中的数据打印在打印机纸上

STOP (暂停语句)
格式:STOP
功能:暂停程序的执行

SLEEP (定时暂停语句)
格式:SLEEP [数值表达式]
功能:暂停执行程序,时间为数值表达式所指定的数值(以秒为单位)

INPUT (键盘输入语句)
格式:INPUT [;]["注释内容"][;|,]变量[,变量]
功能:通过键盘给INPUT语句中的各个变量依次提供数据

LINE INPUT (行输入语句)
格式:LINE INPUT [;]["注释内容";]字符串变量
功能:将键盘上输入的字符串(最长为255个)赋给字符串变量

READ/DATA(读数/置数语句)
格式:READ 变量 [,变量]…


DATA 常量 [,常量]…
功能:READ语句将DATA语句中提供的数据依次赋给指定的变量

RESTORE (恢复数据区语句)
格式:RESTORE [行号|行标号]
功能:从指定的DATA语句行中读入常量

数值函数

SIN (正弦函数)
格式:SIN (X)
功能:求X的正弦函数值

COS (余弦函数)
格式:COS(X)
功能:求X的余弦函数值

TAN (正切函数)
格式:TAN(X)
功能:求X的正切函数值

ATN (反正切函数)
格式:ATN(X)
功能:求X的反正切函数值
SQR (平方要函数)
格式:SQR(X)
功能:求X的算术平方根值,其中X必须大于或等于零

EXP (指数函数)
格式:EXP(X)
功能:求以e为底的X次幂,e=2.718282

LOG (对数函数)
格式:LOG(X)
功能:求以e为底的自然数值,即In x 的值

SGN (符号函数)
格式:SGN(X)
功能:求自变量X的符号

ABS (绝对值函数)
格式:ABS(X)
功能:求自变量X的绝对值,即|X|

INT (取整函数)
格式:INT(X)
功能:取不大于X值的最大整数

FIX (截取整数函数)
格式:FIX(X)
功能:把一个带有小数的数去掉小数部分,不进行舍入,直接截取整数部分。自变
量X可以是任意数值表达式

CINT (转为整数函数)
格式:CINT(X)
功能:把一个带有小数的数转换成整数,对小数部分四舍五入

CLNG (转为长整数函数)
格式:CLNG(X)
功能:把自变量X转变为长整数

CSNG (单精度函数)
格式:CSNG(X)
功能:把数值X转变为单精度数,其中自变量X是一个数值表达式,使用该函数它将
被转换成单精度数

CDBL (双精度函数)
格式:CDBL(X)
功能:把数值X转变为双精度数,自变量X可以是任意数值表达式

RND (随机函数)
格式:RND(X)
功能:产生一个0与1之间的随机数

TIMER (?函数)
格式:TIMER
功能:从午夜开始计算秒数

ASCII (ASCII码函数)
格式:ASC(X$)
功能:返回字符串 X$ 第一个字符的ASCII代码

VAL (字符串转数值函数)
格式:VAL(X$)
功能:将字符串 X$ 转换成数值

LEN (测长函数)
格式:LEN(X$)
功能:测量字符串的长度,即字符串的字符个数

INSTR (子字符串检索函数)
格式:INSTR([N,] X$,Y$)
功能:返回字符串 Y$ 在字符串 X$ 中第一次出现的位置


屏幕显示格式中常用的三个函数
TAB (?函数)
格式:TAB(X)
功能:在指定位置X上显示或打印所需要的信息

SPC (?函数)
格式:SPC(X)
功能:空X个空格

SPACE$ (?函数)
格式:SPACE$(N)
功能:返回一个字符串,该字符串由N个空格组成


输入函数
INKEY$ (?函数)
格式:INKEY$
功能:从键盘上读一个字符

INPUT$ (?函数)
格式:INPUT$ (N[,[#] 文件号])
功能:返回从键盘或指定文件中读出的N个字符组成的字符串

CSRLIN (光标行座标函数)
格式:CSRLIN
功能:返回当前光标行座标位置

POS (光标列座标函数)
格式:POS(N)
功能:返回当前光标列座标位置

UBOUND;LBOUND (测试下标上、下界函数)
格式:UBOUND(数组[,维])
LBOUND(数组[,维])
功能:返回一个已定义数组中指定维的上、下界

FRE (测试空字节函数)
格式:FRE(X)
功能:返回空闲内存节数

GOTO
格式:GOTO 行标识符
功能:改变程序的执行顺序,无条件地转去执行GOTO后面所指的行标识符去执行

ON/GOOT
格式:ON 表达式 GOTO 行标识符表
功能:先计算ON后面的表达式的值,再根据计算结果,将程序转移到GOTO所指行标识
符表中的某个行标识符去执行

关系运算
= (等于)
> (大于)
>=(大于或等于)
< (小于)
<=(小于或等于)
<>(不等于)

AND(与)
OR (或)
NOT(非)
表: A B | NOT A | NOT B | A AND B | A OR B
1 1 | 0 | 0 | 1 | 1
1 0 | 0 | 1 | 0 | 1
0 1 | 1 | 0 | 0 | 1
0 0 | 1 | 1 | 0 | 0
逻辑运行顺序: NOT—AND—OR
()—算术—关系—逻辑

IF (条件语句)
单行 IF 条件语句
格式:IF 条件 THEN 语句序列1 [ELSE 语句序列2]
功能:首先计算条件的值,如果为真则执行THEN后的语句序列1,否则执行ELSE后
面的语句序列2

块结构 IF 条件语句
格式:IF 条件1 THEN
[语句块1]
[ELSEIF 条件2 THEN
[语句块2]
……
[ELSE
[语句块n]]
END IF

CASE (条件语句)
格式: SELECT CASE 测试表达式
CASE 表达式表1
[语句块1]
[CASE 表达式表2
[语句块2]]
……
[CASE ELSE
[语句块N]]
END SELECT
功能:根据表达式的值,从多个语句块中选择符合条件的一个语句块执行

FOR/NEXT(循环语句)
格式:FOR A=E1 TO E2 STEP E3
循环体
NEXT A
说明: FOR 语句为循环说明语句,它说明了循环的次数FOR TO STEP 为语句定义符
A--循环控制变量,可以用任一简单变量表示
E1--循环控制变量的初值
E2--循环控制变量的终值
E3--循环控制变量的增值,也称步长
NEXT 语句为循环终端语句,它与FOR语句必须成对出现 NEXT语句中的循环控制
变量必须与FOR语句中的一致
循环体由一条或多条语句构成,是被重复执行的部分

WHILE/WEND (循环语句)
格式: WHILE <条件>
循环体
WEND
说明: WHILE是循环的起始语句又称说明语句,它的作用是给出循环条件 WEND是循
环的终止语句.
<条件>代表一个逻辑条件,它可以是一个关系表达式也可以是一个逻辑表达式,
还可以是一个变量或常数


DO/LOOP (循环语句)
格式1: DO[(WHILE 或 UNTIL)条件]
循环体
[EXIT DO]
LOOP

格式2: DO
循环体
[EXIT DO]
LOOP[(WHILE 或 UNTIL)条件]
说明: 如果条件永远成DO-LOOP循环可能陷入"死循环"这时可用EXIT DO 来退出循环
DO循环可以嵌套,其规则与FOR-NEXT循环相同

字符串函数
CHR$ (字符函数)
格式:CHR$ (N)
功能:将ASCII码值N转换成它所表示的字符

MID$ (取中间字符串函数)
格式:MID$ (A$, N [,M])
功能:从字符串A$中,第N个字符起,取出M个字符

STRING$
格式1:STRING$(N, X)
功能: 产生N个ASCII码X所对应的字符.通常用在无法从键盘按输入的字符
格式2:STRING$(N, X$)
功能: 产生N个字符串X$中的第一个字符

OCT$ (十进制转八进制函数)
格式:OCT$ (X)
功能:将十进制数值转换成八进制字符串

STR$ (数值转换成字符串函数)
格式:STR$ (X)
功能:将数值数据转换成字符串数据

LTRIM$ (删除字符串左边空格函数)
格式:LTRIM$ (X$)
功能:删除字符串X$左边的空格

RTRIM$ (删除字符串右边空格函数)
格式:RTRIM$ (X$)
功能:删除字符串数据X$右边的空格

LCASE$ (小写函数)
格式:LCASE$ (A$)
功能:将A$中所有大写字母改成小写

UCASE$ (大写函数)
格式:UCASE$(A$)
功能:将A$中所有小写字母改成大写

TRIM$ (两头截空函数)
格式:TRIM$ (A$)
功能:截去字符串A$的头尾所有空格

LEFT$ (左取函数)
格式:LEFT$(A$,N)
功能:得到字符串A$最左边的N个字符

RIGHT$ (右取函数)
格式:RIGHT$(A$,N)
功能:得到字符串A$最右边的N个字符

HEX$(十进制数转换十六进制字符串)
格式:HEX$(N)
功能:将十进制数N转换成十六进制字符串

MKI$ (把整数转换为字符串)

IKL$ (把长整数转换为字符串)

MKS$ (把单精度数转换为字符串)

DATE$/TIME$ (取得系统的日期/时间)

GOSUB/RETURN (调用子程序语句和返回语句)
GOSUB (调用子程序)
格式: GOSUB<标号1>
功能:用于转移到子程序的入口语句去执行
RETURN (子程序返回语句)
格式:RETURN [<标号2>]
功能:用于子程序执行完毕从子程序返回,作为子程序的结束语句

DEF FN (用户自定义函数)
格式1: DEF FN <函数名>[(参数表)]=<表达式>
格式2: DEF FN <函数名>[(参数表)]
语句块
FN <函数名>=<表达式>
END DEF
功能: 定义一个用户自己的函数

SUB (过程定义)
格式: SUB 过程名[(参数表)][STATIC]
语句序列
END SUB
功能: 定义一个SUB过程

FUNCTION (过程定义)
格式: FUNCTION 过程名[(参数表)][STATIC]
语句序列
过程名=表达式
END FUNCTION
功能: 定义FUNCTION函数过程

DECLARE (过程说明语句)
格式: DECLARE [RUNCTION/SUB] 过程名[(参数表)]
功能: 对被调用的过程进行说明,对传递的自变量进行检查

DIM SHARED / COMMON SHARED (定义全局变量)
格试: DIM SHARED 变量名表 / COMMON SHARED 变量名表
功能: 将变量名表中的变量定义为全局变量

STATIC (定义局部变量)
格式: STATIC 变量表
功能: 在DEF FN 函数、FUNCTION 或 SUB 过程中把变量定义为局部变量

SHARED (共享变量)
格式: SHARED 变量[AS类型][,变量[AS类型]…
功能: 使主程序与某个过程共享变量

DIM (数组定义)
格式: DIM[SHARED] 变量 [(下标)][AS类型][,变量[(下标)][AS类型]]…
功能:说明变量或数组并分配存储空间

REDIM (改变分配给数组的空间)
格式: REDIM[SHARED] 变量 (下标)[AS类型][,变量(下标[AS类型]……
功能: 改变分配给动态数组的空间

OPTION BASE (?)
格式: OPTION BASE n
功能: 指定数组下标的缺省下界

OPEN (打开或建立文件)
格式1: OPEN 文件说明[FOR 方式1] AS [#] 文件号 [LEN=记录长度]
格式2: OPEN 方式2,[#] 文件号,文件说明[,记录长度]
说明:
1.在格式1中,"方式1"指定文件的输入/输出有以下几种方式:
OUTPUT 指定顺序输出方式
INPUT 指定顺序输入方式
APPEND 指定顺序添加方式
RANDOM 指定随机存取方式,也是缺省方式
2.格式2中的"方式2"指的是以下几种字符
O 指定顺序输出方式
I 指定顺序输入方式
R 指定随机读/写方式
A 指定顺序添加方式

CLOSE (结束文件的读/写操作)
格式:CLOSE [[#] 文件号 [, [#] 文件号 ]……]
功能: 结束文件的读/写操作

FREEFILE
格式:FREEFILE
功能:产生一个尚未使用的最小文件号

LOC
格式:LOC(N)
功能: 返回文件号为N的指定文件的当前位置

LOF
格式:LOF(N)
功能: 返回文件长度

PRINT#
格式:PRINT# 文件号,[USING 格式字符串;] 表达式[{,|;}]
功能: 把数据写入顺序文件中

WRITE#
格式:WRITE# 文件号,表达式表
功能: 把数据写入顺序文件中

INPUT#
格式:INPUT# 文件号,变量名
功能:从顺序文件中读出数据,并把读出的数据赋给相应的程序变量

LINE INPUT#
格式: LINE INPUT# 文件号,字符串变量
功能: 从顺序文件中读取一整行的数据,并赋给其后的字符串变量

EOF
格式: EOF(文件号)
功能:检查文件是否已读完

CLS
格式:CLS[0|1|2]
功能:清除部分或全部屏幕信息
说明: CLS 0 清除整个屏幕,系统缺省值
CLS 1 如果利用VIEW语句设置过图形视见区,则清除该区,否则清除整个画面
CLS 2 清除文本视见区,但屏幕的最底行仍保持不变

WIDTH
格式: 1. WIDTH 宽度
2. WIDTH LPRINT 宽度
功能: 语句格式1的功能是改变屏幕显示行的宽度,2的功能是改变打印机输出行的宽度

SCREEN
格式: SCREEN [模式][,颜色][,当前页][,可见页]
功能: 设置屏幕显示方式

PSET
格式:PSET [STEP](X,Y)[,颜色号]
功能:在指定的坐标位置上,以指定的颜色画一个点

PRESET
格式: PRESET [STEP](X,Y)[,颜色号]
功能:在屏幕的指定位置(X,Y)上画一个点

LINE
格式: LINE[[STEP](X1,Y1)]-[STEP](X2,Y2)[,[颜色号],[,B[F]][,类型符]
功能:在屏幕上画线段或矩形框

CIRCLE
格式: CIRCLE[STEP](X,Y)半径[,颜色][,起始角][,终止角][,纵横比]
功能: 以(X,Y)为圆心,用给定的半径画圆 椭圆或圆弧

DRAW
格式: DRAW 字符串
功能: 按语句中的字符串,逐步描绘出图形


COLOR
格式: 1. COLOR [前景色][,背景色][,边框色]
2. COLOR [背景色][,调色板]

PAINT
格式: PAINT [STEP](X,Y)[,颜色号][,边框色]
功能:给一个封闭的图形,涂上指定的颜色和边框色


VIEW
格式: VIEW [[SCREEN](X1,Y1)-(X2,Y2)[,[颜色号][,边框色]]]
功能:定义输出图形的屏幕尺寸

VIEW PRINT
格式: VIEW PRINT [顶行 TO 底行]
功能: 在屏幕上定义一个文本输出区域

WINDOW
格式: WINDOW[[SCREEN](X1,Y1)-(X2,Y2)
功能:定义当前视见区的逻辑尺寸

GET
格式: GET [STEP](X1,Y1)-[STEP](X2,Y2),数组名[(下标)]
功能:把屏幕上指定区域的图形映象存放到"数组"中

PUT
格式: PUT[STEP](X,Y),数组名[(下标)][,显示方式]
功能: 将GET语句所存入数组中的图形映象在屏幕所指定的区域重新显示出来

BEEP
格式: BEEP
功能: 使电脑喇叭发出"嘟"的一声

SOUND
格式: SOUND 频率,音长
功能: 使喇叭发出一定频率延时的声音

PLAY
格式: PLAY 命令字符串
功能: 用给定字符串表示的音乐演奏

转贴自:http://www.ahtczx.com/bencandy.php?id=291

--
马利
Richard Ma

2008年9月15日星期一

linux下的QBasic——yabasic

yabasic是linux下的QBasic解释器,语法要求相对于windows下的解释器更加严格。

yabasic安装(ubuntu):
apt-get install yabasic

安装到/usr/bin中,可以在命令行下直接调用。

运行模式分为两种,其一是将QBasic脚本作为命令行参数传入执行,再者就是on the fly模式,从标准输入编辑代码,两次回车执行。这个解释器运作模式很像python。

以后的信息学奥赛就靠它了。

--
马利
richard.ma

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.6 (GNU/Linux)

owE9Uj9sElEcRoiDl5imiYu6kLiZYENFEhYHExtHXRw1R0vhEjgIHEE2/t9RKdBo
1XLYHIEDWqFcYzVXOMDRycS4aeLie+8eEw5uLr4DZP193/f7vu/3XvmyxWRe/e4J
bHy2UD8udM2X3Fft6+t2h/O2y+VyOO5se0Pep1wgtMH4PQ++rLyL0246wmyiNz0/
w0afAfW5Xsk8umfMcKs+4XfgQXuqFXCvi97v42YSnaZ0UYW9c9Avxhh2KxiLzDVL
NhLP4I4EVBlJ2q9EiqIWFvAkj+vZqSZE3VGWi061/FSrUHSIs3k9nJVhIxzt91sX
ZIqa06GgrEUj4TU3wwK1S4LAUg8MZFhtw70hGDRwrWDYi2eoKGMlrb9szyzxuEwQ
1K5BrQSFHFD7QG3orV1jQfYjUBOkL1Ryi56ZCqp2wLBKaMutsJRC+wrQJJiVUb5F
JoY2t4sTWaicEnmQtXI+D7Xtj89tCAwGRSTxkM/h0Qsi07VXeLQHBnVdShqo2kCd
GhQP8bA530ii4vEBUI+XtyO5SY5F7pEA06VQnPMF2Vkpo3e5SE4NxjWU7MFuE8oy
/iCSPJO3EjxJg35uRrTZrNTkqAOFIyrMbPro8NatAE0Jdy0XTcaT//8dq+ZYy/Sa
5j89yfwuPPzK37j57XrmSuncZzp0Wp0r3Wv2P3/vO5THjZ/BPCMf/wM=
=lY2i
-----END PGP MESSAGE-----