📄 pku1684.cpp
字号:
// C DDL
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define SIZE 110
#define INF 100000
char line[SIZE][SIZE];
int N;
char ID[SIZE];
int ID_val[SIZE];
int ID_cnt;
int ID_use[SIZE];
void id_init()
{
int i;
for (i = 0; i < SIZE; i++)
{
ID_val[i] = -INF;
ID_use[i] = 0;
}
ID_cnt = 0;
}
int add_id(char c)
{
int i;
for (i = 0; i < ID_cnt; i++)
{
if (ID[i] == c)
{
if (ID_use[i])
{
ID_use[i] = 0;
return 1;
}
return 0;
}
}
ID[ID_cnt] = c;
ID_val[ID_cnt] = 0;
ID_cnt++;
return 1;
}
int inc_id(char c, int v)
{
int i;
for (i = 0; i < ID_cnt; i++)
{
if (ID[i] == c)
{
ID_val[i] += v;
ID_use[i] = 1;
return 1;
}
}
return 0;
}
int set_id(char c, int v)
{
int i;
for (i = 0; i < ID_cnt; i++)
{
if (ID[i] == c)
{
ID_val[i] = v;
ID_use[i] = 1;
return 1;
}
}
return 0;
}
int get_id(char c)
{
int i;
for (i = 0; i < ID_cnt; i++)
{
if (ID[i] == c)
{
ID_use[i] = 1;
return ID_val[i];
}
}
return -INF;
}
void init()
{
int i;
scanf("%d\n", &N);
for (i = 1; i <= N; i++)
gets(line[i]);
}
void To_upper(char cmd[])
{
int i;
for (i = 0; i < strlen(cmd); i++)
{
if (cmd[i] > 'Z')
cmd[i] -= 32;
}
}
void solve()
{
int k = 1;
char cmd[10], id[5];
int lable, ic, id_v;
id_init();
while (k <= N)
{
sscanf(line[k], "%s", cmd);
To_upper(cmd);
if (strcmp(cmd, "DCL") == 0) //定义
{
sscanf(line[k], "%s %s", cmd, id);
if (!add_id(id[0]))
printf("%d 1\n", k); //定义错误
k++;
continue;
}
else if (strcmp(cmd, "END") == 0)
break;
else if (strcmp(cmd, "INC") == 0)
{
sscanf(line[k], "%s %s", cmd, id);
if (!inc_id(id[0], 1))
printf("%d 2\n", k);
k++;
continue;
}
else if (strlen(cmd) == 1)
{
sscanf(line[k], "%s = %d", id, &ic);
if (!set_id(id[0], ic))
printf("%d 2\n", k);
k++;
continue;
}
else if (strcmp(cmd, "DEC") == 0)
{
sscanf(line[k], "%s %s", cmd, id);
if (!inc_id(id[0], -1))
printf("%d 2\n", k);
k++;
continue;
}
else
{
sscanf(line[k], "%s %s", cmd, id);
if (id[1] == 0 && isalpha(id[0]))
{
sscanf(line[k], "%s %s %d", cmd, id, &lable);
id_v = get_id(id[0]);
if (id_v == -INF)
printf("%d 2\n", k);
k = id_v > 0 ? lable : k+1;
continue;
}
else
{
sscanf(line[k], "%s %d", cmd, &lable);
k = lable;
continue;
}
}
}
}
int main()
{
int t, T;
scanf("%d", &T);
for (t = 1; t <= T; t++)
{
init();
printf("%d\n", t);
solve();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -