1.查找中位数
先输入一个整形数字N,接着输入N个无序的数字。要求输出升序排列后的中位数,以及该中位数输入的次序。如果N为偶数,则输出有二个中位数,如果N为奇数,输出最中间的数即可。
样例1:
输入:5
9 2 7 1 6
输出:6 5
样例2:
输入:6
9 6 7 1 2 3
输出:3 6
6 2
#include<stdio.h>
#include<algorithm>
using namespace std;
struct num{//结构体
int value;
int index;
}a[200];
bool cmp(num a,num b){//cmp函数
if(a.value<=b.value)return 1;
else return 0;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i].value);
a[i].index=i+1;
}
sort(a,a+n,cmp);//使用排序函数
int m=n/2;
if(n%2==0){//偶数
printf("%d %d\n",a[m-1].value,a[m-1].index);
printf("%d %d\n",a[m].value,a[m].index);
}
else printf("%d %d\n",a[m].value,a[m].index);
}
return 0;
}
//当不使用sort函数,自己写排序函数
#include<stdio.h>
struct num{
int value;
int index;
}a[200];
void sort(int n){
for(int i=0;i<n;i++){//冒泡
for(int j=0;j<n-i-1;j++){
num temp;
if(a[j].value>a[j+1].value){
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
}
}
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i].value);
a[i].index=i+1;
}
//sort(a,a+n,cmp);
sort(n);
int m=n/2;
if(n%2==0){//偶数
printf("%d %d\n",a[m-1].value,a[m-1].index);
printf("%d %d\n",a[m].value,a[m].index);
}
else printf("%d %d\n",a[m].value,a[m].index);
}
return 0;
}
2.词法分析,查找未定义变量
输入两个C语言语句,第一句为正常的C语言变量定义语句,符合C语言语法要求,变量间可以有多个空格,包含数组,指针定义等。第二句为变量运算语句,要求输出第二个C语言语句中未定义的变量。
样例:
输入:
int x12, y=1, num_stu=89, a[30], p; int x12, y=1;
Sum=num+x12y;
输出:
Sum num
3.找家谱成员
输入若干行,每一行的第一个输入为家谱中的某成员,该行接着输入的信息为每个孩子姓名。最后一行的输入为要求查找的两个家谱成员的关系。要求:根据输入的家谱成员信息,建立二叉树家谱关系图,并输出二位待查找成员在家谱中的关系,包括输出他们最邻近的共同祖先以及在家谱中相差的层次数。
样例:
输入:
YE SHU MEI
SHU GE MEI1
BA SELF MEI2
GE SON1 SON2
SON2 MEI1
输出:
SHU 1
//代码是参考别人的,也有不严谨的地方
#include<stdio.h>
#include<string.h>
const int namesize=20;
struct treenode{
char name[namesize];
char parent[namesize];
int gradation;
treenode* leftchild;
treenode* rightchild;
};
treenode* findtreenode(treenode* root,char parent[]);
int getname(char str[],char parent[],char leftc[],char rightc[] ){
int len=strlen(str);
int index=0;
int flag=0;//标记输入的格式,输入了两个还是三个名字。
for(int i=0;i<len;){
while(str[i]==' ') i++;
while(str[i]!=' ')
parent[index++]=str[i++];
parent[index]='\0';//勿忘!
while(str[i]==' ') i++;
index=0;
while(str[i]!=' '&&i<len)
leftc[index++]=str[i++];
leftc[index]='\0';
while(str[i]==' ') i++;
index=0;
while(str[i]!=' '&&i<len){
rightc[index++]=str[i++];
flag=1;
}
rightc[index]='\0';
while(str[i]==' ') i++;
}
return flag;
}
treenode* addtreenode(treenode* root,char parent[],char leftc[],char rightc[]){
if(root==NULL){//根节点
root=new treenode;
strcpy(root->name,parent);
root->parent[0]='\0';
root->gradation=0;
root->leftchild=NULL;
root->rightchild=NULL;
}
treenode* temp=findtreenode(root,parent);//调用函数,根据结点双亲名寻找结点temp;
treenode *lc=new treenode;//创建左孩子
strcpy(lc->name,leftc);
strcpy(lc->parent,parent);
lc->gradation=temp->gradation+1;//父节点的层数+1
lc->leftchild=NULL;
lc->rightchild=NULL;
treenode *rc=new treenode;//创建右孩子
strcpy(rc->name,rightc);
strcpy(rc->parent,parent);
rc->gradation=temp->gradation+1;
rc->leftchild=NULL;
rc->rightchild=NULL;
temp->leftchild=lc;//连接
temp->rightchild=rc;
return root;//返回根节点
}
treenode* findtreenode(treenode* root,char parent[]){
if(root==NULL) return NULL;
if(strcmp((root->name),parent)==0) return root;
else{
treenode* result =findtreenode(root->leftchild,parent);
if(result==NULL)
result=findtreenode(root->rightchild,parent);
return result;
}
}
void findrelation(treenode* root,char person1[],char person2[]){
treenode* position1=findtreenode(root,person1);
treenode* position2=findtreenode(root,person2);
treenode* min,*max;
if(position1->gradation>position2->gradation){//第一个位置的深度大
min=position1;max=position2;}
else {
min=position2;max=position1;
}
int level=min->gradation-max->gradation;//层数差
while(min->gradation>max->gradation){//层数高的晚辈向上爬,直到层数相同
char parent[namesize];
strcpy(parent,min->parent);
min=findtreenode(root,parent);
}
while(strcmp(min->parent,max->parent)!=0){
char parent[namesize];
strcpy(parent,min->parent);
min=findtreenode(root,parent);//寻找根节点
strcpy(parent,max->parent);
max=findtreenode(root,parent);
}
if(min->gradation==0)
printf("没有共同祖先");
else
printf("%s %d\n",min->parent,level);
}
int main(){
treenode* root=NULL;
char parent[namesize],leftc[namesize],rightc[namesize];
char str[namesize*3];//存放一行字符串
while(gets(str)!=0){
parent[0]=leftc[0]=rightc[0]='\0';
int flag;
flag=getname(str,parent,leftc,rightc);//调用函数
if(flag==1)
root=addtreenode(root,parent,leftc,rightc);//调用函数向树中添加结点
if(flag==0){//输出关系
findrelation(root,parent,leftc);
}
}
return 0;
}