17年上机题
题目:数组中值
描述:从一个无序不重复数组中,输出中间的数和它在数组中的次序(从1开始)如果是偶数个元素,则输出两个,奇数则输出中间一个
样例:
输入
1 5 6 4 3 2 7 9 11
输出
5 5
输入
1 5 6 4 3 2 7 9 11 8
输出
5 5
6 6
题目:词法分析
描述:输入两行语法正确的C语言语句,第一行是定义变量,第二行是基本C语言表达式,输出第二行中没有在第一行被定义的变量名,如果是数组和指针,只输出数组名或指针名 。
样例:
输入
int a,b,_x,_y,Min,MAx;
result=a+b/2*_x+Min;
输出
result
输入
int a,*b,_x,_y,Min[20],MAx[30];
result=a+b/25 *_x+Min[5];
输出
result
#include <stdio.h>
#include <string.h>
char stra[100];
char strb[100];
char dica[100][10];
char dicb[100][10];
int main()
{
gets(stra);
gets(strb);
int p=0;
while(stra[p]!=' '){
p++;
}//定位第一个空格
p++;
//printf("stra空格位置:%d\n",p);
char c[10];
int len=0;//标识符长度
int ta=0;//词汇表dica指针
bool flag=false;
for(int i=p;stra[i]!=0;i++){
if(stra[i]=='*')continue;//跳过指针
if(stra[i]=='['){
while(stra[i]!=']')i++;
continue;
}//跳过数组
if(stra[i]!=','&& stra[i]!=';'){
c[len++]=stra[i];
c[len]=0;
flag=true;
}else if(flag){
strcpy(dica[ta++],c);
len=0;
flag=false;
}
}
//printf("词汇表dica长度:%d\n",ta);
len=0;//标识符长度
int tb=0;//词汇表dicb指针
flag=false;
for(int i=0;strb[i]!=0;i++){
if(strb[i]=='['){
while(strb[i]!=']')i++;
continue;
}//跳过数组
if(strb[i]!='+' && strb[i]!='-' && strb[i]!=';' &&\
strb[i]!='*' && strb[i]!='/'&& strb[i]!='='){
c[len++]=strb[i];
c[len]=0;
flag=true;
}else if(flag){
strcpy(dicb[tb++],c);
len=0;
flag=false;
}
}
//printf("词汇表dicb长度:%d\n",tb);
// for(int i=0;i<ta;i++){
// printf("dica[%d]: %s\n",i,dica[i]);
// }
//
// for(int i=0;i<tb;i++){
// printf("dicb[%d]: %s\n",i,dicb[i]);
// }
for(int i=0;i<tb;i++){
int k;
for(k=0;dicb[i][k]!=0;k++){
if(dicb[i][k]<'0' || dicb[i][k]>'9')break;
}
if(dicb[i][k]==0)continue;
int j=0;
for(j=0;j<ta;j++){
if(strcmp(dicb[i],dica[j])==0){
break;
}
}
if(j==ta){
printf("%s\n",dicb[i]);
}
}
return 0;
}
其他解法(数组问题没有完全处理):
#include <stdio.h>
#include <string.h>
char name[100][20];//保存变量名
char output[100][20];//保存输出变量名
int num;//num为name中元素个数
int num2;//num2为output中元素个数
//判断是否为命名字符
bool judge(char c){
if((c>='0'&&c<='9') || (c>='a'&&c<='z') || \
(c>='A'&&c<='Z') || (c=='_')){
return true;
}
return false;
}
//从变量表name中筛选未使用的变量名存入output
void delname(char *tmp){
bool flag=true;//判断是否存入output
int i;
for(i=0;i<num;i++){
if(strcmp(name[i],tmp)==0){
flag=false;//变量名已使用
break;
}
}
if(flag){
for(i=0;i<num2;i++){
if(strcmp(output[i],tmp)==0)break;
}//判断output里是否已存入该未使用的变量名
if(i==num2){
strcpy(output[num2++],tmp);
}
}
}
int main()
{
char c,a[100],tmp[100];
int i=0,size=0,count=0;
num=0;
//输入字符串
while(scanf("%c",&c)!=EOF && count!=2){
a[size++]=c;
if(c==';'){
count++;
}
}
a[size]=0;
while(a[i++]!=' ');//跳过关键字
int len=0;
bool flag=true;
for(;a[i]!='\n';i++){
//不能用a[i]!=';',会丢失最后一个单词
if(judge(a[i])){
tmp[len++]=a[i];
tmp[len]=0;
flag=true;
}else if(flag){
strcpy(name[num++],tmp);
len=0;
flag=false;
}
}
len=0;
flag=false;
i++;
for(;i<size;i++){//i已经定位到第二行行首
if(judge(a[i])){
tmp[len++]=a[i];
tmp[len]=0;
flag=true;
}else if(flag){
delname(tmp);
len=0;
flag=false;
}
}
//输出
for(i=0;i<num2;i++){
int j;
for(j=0;output[i][j]!=0;j++){
if(output[i][j]<'0' || output[i][j]>'9')break;
}
if(output[i][j]==0){
continue;//跳过输出纯数字变量
}else{
printf("%s\n",output[i]);
}
}
return 0;
}