非常想不开的在下参加了学校的ACM集训队,发现本人实在是太菜了!菜的抠脚,玩了半年了,手写KMP都不大熟练,所以个人觉得自己还是基础太差了,没办法,基础不牢的人不是玩ACM,而是被ACM玩,所以我来打基础了!从最简单的三元组开始!!逐步的爬!爬!爬!!!!!
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#define MAXN 100005
#define true 1
#define fause 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
using namespace std;
typedef struct
{
int a,b,c;
char str[100];
double num;
/*这里基本的数据类型大致都有了,当你想用三元组的操作,别和我说什么枚举类型,bool类型什么的,毕竟我懒*/
}Elemtype;
bool cmp(Elemtype a,Elemtype b)
{
/*这里cmp函数里的全都是升序时用的,如果你想写降序,把cmp里的东西换成小于号换成大于号就行了*/
//return a.a<=b.a;
return strcmp(a.str,b.str)<0;
}
bool swap(Elemtype &a,Elemtype &b)
{
Elemtype temp;
temp = a ;
a = b;
b = temp;
/*这里的赋值和triplet里的原理相同,也要注意C中是不能直接用的!*/
return OK;
}
bool input(Elemtype &a)
{
scanf("%d%d%d %s %lf",&a.a,&a.b,&a.c,a.str,&a.num);
return 0;
}
bool output(Elemtype &a)
{
printf("%d %d %d\n%s\n%lf\n",a.a,a.b,a.c,a.str,a.num);return 0;
}
/******************************************************************
前面的部分单纯是我想偷懒,比如如果以后我想用三元组什么的直接去粘下面的代码就好了,
只要对上面的代码进行适当的修改就好了。。。。
*******************************************************************/
typedef struct Triplet
{
/********************************/
//数据定义
/********************************/
Elemtype *x;
/********************************/
//函数部分
/********************************/
Status InitTriplet(Elemtype a,Elemtype b,Elemtype c)
{
x= (Elemtype *)malloc(3*sizeof(Elemtype));
if(!x) exit(OVERFLOW);
x[0] = a;
x[1] = b;
x[2] = c;
/*为了方便,这里直接采用了C++中的赋值模式,如果用C的话,貌似是不可以这样赋值的吧~*/
return OK;
}//初始化
Status Destroy()
{
free(x);
x = NULL;
return OK;
}//销毁整个三元组
Status Get(int i,Elemtype &e)
{
if(i<1||i>3||x==NULL) return ERROR;
e= x[i-1];return OK;
}//获得某个值
Status Put(int i,Elemtype &e)
{
if(i<1||i>3||x==NULL) return ERROR;
x[i-1] = e;
return OK;
}//修改某个值
Status IsAscending() //s是否升序排列
{
return cmp(x[0],x[1])&&cmp(x[1],x[2]);
}
Status IsDescending()//是否降序排列
{
return cmp(x[1] ,x[0] )&&cmp(x[2],x[1]);
}
/*事实上上述两函数可用同一个函数替换,仅需修改cmp函数即可!
下面的排序函数就只用一种形式描述了,但只用一种形式描述的话缺点也很明显,就是不够灵活。*/
Status Sort()//排序函数
{
if(x==NULL) return ERROR;
cmp(x[0],x[1])?1:swap(x[0],x[1]);
cmp(x[1],x[2])?2:swap(x[1],x[2]);
cmp(x[0],x[1])?3:swap(x[0],x[1]);
/*没什么技术含量的冒泡排序,但这种数据规模,
没必要动用快排之类的高端货色的吧*/
return OK;
}
Status Min(Elemtype &e)
{
if(x==NULL) return ERROR;
e= cmp(x[0],x[1])?(cmp(x[0],x[2])?x[0]:x[2]):(cmp(x[1],x[2])?x[1]:x[2]);
return OK;
}//找出最小值
Status Max(Elemtype &e)
{
if(x==NULL) return ERROR;
e= cmp(x[0],x[1])?(cmp(x[1],x[2])?x[2]:x[1]):(cmp(x[0],x[2])?x[2]:x[0]);
return OK;
}
//找出最大值
void outputall()
{
for(int i =0;i<3;i++)
{
output(x[i]);
}
}
}Triplet;
/*下面的部分是在下为测试代码写的main,test.txt就不上传了,随便敲的几行测试数据,没太多的代表性*/
int main()
{
freopen("test.txt","r",stdin);
Elemtype a,b,c,d;
input(a);
//output(a);
input(b);
input(c);
Triplet T;
T.InitTriplet(a,b,c);
printf("最开始的数据\n");
T.outputall();
printf("是升序的吗?\n");
printf("%d\n",T.IsAscending());
T.Sort();
T.outputall();
printf("现在升序了吗?\n");
printf("%d\n",T.IsAscending());
//T.outputall();
T.Get(1,d);
printf("取出了个什么东西:\n");
output(d);
T.Put(2,d);
printf("把取出的东西放第二位\n");
T.outputall();
printf("最大的\n");
T.Max(d);
output(d);
printf("最小的\n");
T.Min(d);
output(d);
return 0;
}
博主加入ACM集训队后发现自己基础薄弱,尤其是对KMP算法不熟练。因此,他决定从基础知识——三元组开始,逐步提升自己的编程能力。
1万+





