当前位置:首页 » 编程语言 » c语言returnthis

c语言returnthis

发布时间: 2023-03-30 22:22:35

㈠ 听说c语言的结构体可以实现类的基本功能到底怎么做到的

可以通过定义一个 虚函侍辩卜数表实现:

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

structStudent;

typedefstructStudentVtbl
{
char*(*GetName)(structStudent*This);
void(*SetName)(structStudent*This,char*);
}StudentVtbl;

typedefstructStudent
{
StudentVtbl*lpVtbl;
charname[20];
}Student;

char*stu_GetName(Student*This)
{
returnThis->name;
}

voidstu_SetName(Student*This,char*newName)
{
strcpy(This->name,newName);
}

StudentVtblstuVtbl={stu_GetName,stu_SetName};

intmain()
{
Studentstu={&stuVtbl};
stu.lpVtbl->SetName(&stu,"老穗灶弊Jack");
printf("studentname=%s",stu.lpVtbl->GetName(&stu));
return0;
}

㈡ "operator"在C语言里是什么关键字,具体什么功用

1.operator是操作符的意思。operator是C++的关键字,不是C语言当中的,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。

2.C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换)。下面分别进行介绍:
1)operator overloading
C++可能通过operator 重载操作符,格式如下:类型T operator 操作符 (),例如重载 +:
template<typename T> class A
{
public:
const T operator + (const T& rhs)
{
return this->m_ + rhs;
}
private:
T m_;
};

又比如STL中的函数对象,重载 ():
template<typename T> struct A
{
T operator()(const T& lhs, const T& rhs){ return lhs-rhs;}
};

2)operator casting
C++可能通过operator 重载隐式转换,格式如下: operator 类型T (),如下所示
class A
{
public:
operator B* () { return this->b_;}
operator const B* () {return this->b_;}
operator B& () {return *this->b_;}
private:
B* b_;
};
A a;
当if(a),编译时,其中它转换成if(a.operator B*()),其实也就是判断 if(a.b_)

㈢ 200分求高人解决数据结构试题(C语言版),先付100分,解决以后本人还有100分送

本来很简单,我也没时间这是我们的一次实验报告,希望对你的树形结构提高能有帮助
模拟因特网域名查找
一、问题描述
1、 实验内容
利用属性结构的搜索算法模拟因特网域名查找
2、 基本要求
首先要实现一个反映域名结构的树,叶子节点另有一个数据与存放站点的IP地址。
3、 测试数据
去常用到的着名站点的域名和IP地址为例构建域名结构的树,一般要有几十个左右站点域名。当输入域名时,输出其域名;输入找不到的域名时,输出应为“找不到服务器或发生DNS错误”。
二、需求分析
1、程序能达到的基本功能:
本程序能根据内存中存储的树形结构,当输入域名时,输出IP地址或者找不到的信息。
2、输入的形式和输入值的范围:
程序运行后显示提示信息,由用户输入一个域名,程序自动建树,程序将提示是否继续输入,用户可以继续输入域名和IP地址,知道输入“N”,接着程序将在内存中建立一棵二叉树,接着用户就可以输入要查找的域名,系统输出IP地址或者输出出错信息。
输入的域名可以是任意形式,IP地址也可以是任意形式
域名字符数目应不大于30,每一层域名应不大于10,输入的域名数目可以为任意个。
3、用户输入查找的域名后,系统将自动输出IP地址或者输出出错信息。
4、测试数据
域名字符数目应不大于30,每一层域名应不大于10,输入的域名数目可以为任意个。
三、概要设计
为实现上述功能,需要栈、二叉树两个抽象数据类型
1、 栈的抽象数据类型定义为:
ADT Stack
{ 数据对象:typedef struct{
char *elem;
int top;
}Stack;
数据关系:栈中元素先进后出
数据操作:InitStack(Stack&S)
初始条件:栈S不存在。
操作结果:建立一个空栈。
Pop(Stack&S,char &e)
初颤差始条件:栈S非空
操作结果:用e返回栈顶元素
Push(Stack&S,char e)
初始条件:存在栈
操作结果:将元素e压入S栈
StackEmpty(Stack &S)
初始条件:存在栈S
操作结果:返回栈是否为空
}ADT Stack
ADT CSTree{
数据对象:typedef struct CSNode{
char y[10];
char *d;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;
数据关系:结点关系为父子关系或兄弟关系
基本操作:Insert(CSTree &T,char *w)
初始条件:树T存在或不存在,w为一字符串。
操作结果:将表示域名的w插入树T
Found(CSTree T,char *w)
初始条件:树T存在键洞友,w唯一输入要查找的域名字符串
操作结果:返回w对应的域名或出错信息
}ADT CSTree
2、 本程序包括四稿槐个模块
主程序模块;
二叉树操作模块;
域名操作模块;
之间的调用关系为:

核心算法为void main()
{
char c='Y';
char w[30];
CSTree T;
T=NULL;
while(c=='Y'){
printf("输入域名:\n");
scanf("%s",w);
Insert(T,w);
printf("继续输入域名?(Y/N)\n");
scanf("%c",&c);
scanf("%c",&c);
}//whi8le
c='Y';
while(c=='Y'){
printf("输入要查询的域名:\n");
scanf("%s",w);
Found(T,w);
printf("继续查询域名?(Y/N)\n");
scanf("%c",&c);
scanf("%c",&c);
}//while
}//main
四、详细设计:
1、元素类型、结点类型和指针类型。
typedef struct{
char *elem; //
int top;
}Stack;
typedef struct CSNode{
char y[10]; //域名的一层
char *d; //IP地址
struct CSNode *firstchild,*nextsibling;//指向树节点
}CSNode,*CSTree;
3、 各操作的伪码算法
void InitStack(Stack&S){
S.top=-1;
S.elem=new char[10];
}

void Push(Stack&S,char e)
{
S.elem[++S.top]=e;
}
bool Pop(Stack&S,char &e){
if(S.top==-1)return FALSE;
e=S.elem[S.top--];
return TRUE;
}
bool StackEmpty(Stack &S){
if(S.top==-1)return TRUE;
return FALSE;
}
void Divide(char *w,char *a)
{ //用a返回w的最后一个'.'后的字符串
int n,i=0;
char e;
Stack S;
InitStack(S);
n=strlen(w);
i=n-1;
for(;w[i]!='.'&&i>=0;i--){
Push(S,w[i]);
w[i]='\0';
}//for
if(i>0)
w[i]='\0';//w[i]将最后一个'.'变为'\0'
i=0;
while(!StackEmpty(S)){
Pop(S,e);
a[i]=e;
i++;
}//while
a[i]='\0';
}//Divide

void Insert(CSTree &T,char *w)
{ // insert string w to tree T
CSNode *p;
char a[10];
if(!T){
Divide(w,a);
T=new CSNode;
p=T;
p->firstchild=p->nextsibling=NULL;
p->d=NULL;
strcpy(p->y,a);
while(*w!='\0'){
p->firstchild=new CSNode;
p=p->firstchild;
Divide(w,a);
strcpy(p->y,a);
p->nextsibling=p->firstchild=NULL;
p->d=NULL; ;
}//WHILE
printf("Input the address:\n");
p->d=new char[20];
scanf("%s",p->d);
//for(p=T;p->firstchild!=NULL;p=p->firstchild)
//printf("%s\n",p->y);
}//if
else {
p=T;
Divide(w,a);
if(*w=='\0'){
while(p->nextsibling!=NULL)
p=p->nextsibling;
p->nextsibling=new CSNode;
p=p->nextsibling;
p->firstchild=p->nextsibling=NULL;
p->d=NULL;
strcpy(p->y,a);

printf("Input the address:\n");
p->d=new char[20];
scanf("%s",p->d);
}//if
else{
while((strcmp(p->y,a)!=0)&&(p->nextsibling!=NULL))
p=p->nextsibling;
if(strcmp(p->y,a)==0){
p=p->firstchild;
Insert(p,w);
}//if
else{
p->nextsibling=new CSNode;
p=p->nextsibling;
strcpy(p->y,a);
p->nextsibling=p->firstchild=NULL;
p->d=NULL;
while(*w!='\0'){
p->firstchild=new CSNode;
p=p->firstchild;
Divide(w,a);
strcpy(p->y,a);
p->nextsibling=p->firstchild=NULL;
p->d=NULL;
}//WHILE
printf("Input the address:\n");
p->d=new char[20];
scanf("%s",p->d);
}//else
}//else
//for(p=T;p->firstchild!=NULL;p=p->firstchild)
//printf("%s\n",p->y);

}//else
}//Insert

void Found(CSTree T,char *w)
{ //查找w是否在树中,并输出信息
char a[10];
Divide(w,a);
CSNode *p;
p=T;
while((strcmp(p->y,a)!=0)&&(p->nextsibling!=NULL))
p=p->nextsibling;
if(strcmp(p->y,a)!=0)
printf("找不到服务器或发生DNS错误。\n");
else{
if(*w=='\0')
printf("该域名地址为:%s\n",p->d);
else{
p=p->firstchild;
Found(p,w);
}//else
}//else
}//Found
主函数算法:
void main()
{
char c='Y';
char w[30];
CSTree T;
T=NULL;
while(c=='Y'){
printf("输入域名:\n");
scanf("%s",w);
Insert(T,w);
printf("继续输入域名?(Y/N)\n");
scanf("%c",&c);
scanf("%c",&c);
}//whi8le
c='Y';
while(c=='Y'){
printf("输入要查询的域名:\n");
scanf("%s",w);
Found(T,w);
printf("继续查询域名?(Y/N)\n");
scanf("%c",&c);
scanf("%c",&c);
}//while
}//main
五、调试分析
1、通过这个程序的设计,我更加深了对链表和二叉树的理解
调试程序时,起初我忘了将树的节点的左右指针付初值NULL,所以程序老运行错误,调试好这一错误后,程序才得以顺利运行。
调试的时候我还用了很多printf语句用以调试程序这样确实很有效,调试好之后只需加“//”,或者删除。
2、算法的时空分析
每输入一个域名时,都要查找四次,所以时间复杂度为O(n),空间复杂度为O(n)。
六、使用说明
程序运行后用户根据提示输入域名和IP地址,域名字符数目应不大于30,每一层域名应不大于10,输入的域名数目可以为任意个。程序将自动建立树
查找域名,当输入域名时,程序将自动查找域名。
七、测试结果:
输入域名:
www.ustc.e.cn
Input the address:
23/23.4.234.
继续输入域名?(Y/N)
Y
输入域名:
www.tsinghua.e.cn
Input the address:
23.23.34.4
继续输入域名?(Y/N)
Y
输入域名:
ftp.ustc.e.cn
Input the address:
23.4.65.78
继续输入域名?(Y/N)
Y
输入域名:
34234
Input the address:
alskdfj
继续输入域名?(Y/N)
N
输入要查询的域名:
34234
该域名地址为:alskdfj
继续查询域名?(Y/N)
Y
输入要查询的域名:
www.ustc.e.cn
该域名地址为:23/23.4.234.
继续查询域名?(Y/N)
Y
输入要查询的域名:
www.usct.e.cn
找不到服务器或发生DNS错误。
继续查询域名?(Y/N)
N
Press any key to continue
八、附录:
程序清单:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

const TRUE=1;
const FALSE=0;

typedef struct{
char *elem;
int top;
}Stack;
typedef struct CSNode{
char y[10];
char *d;
struct CSNode *firstchild,*nextsibling;
}CSNode,*CSTree;

void InitStack(Stack&S){
S.top=-1;
S.elem=new char[10];
}

void Push(Stack&S,char e)
{
S.elem[++S.top]=e;
}
bool Pop(Stack&S,char &e){
if(S.top==-1)return FALSE;
e=S.elem[S.top--];
return TRUE;
}
bool StackEmpty(Stack &S){
if(S.top==-1)return TRUE;
return FALSE;
}

void Divide(char *w,char *a)
{ //用a返回w的最后一个'.'后的字符串
int n,i=0;
char e;
Stack S;
InitStack(S);
n=strlen(w);
i=n-1;
for(;w[i]!='.'&&i>=0;i--){
Push(S,w[i]);
w[i]='\0';
}//for
if(i>0)
w[i]='\0';//w[i]将最后一个'.'变为'\0'
i=0;
while(!StackEmpty(S)){
Pop(S,e);
a[i]=e;
i++;
}//while
a[i]='\0';
}//Divide

void Insert(CSTree &T,char *w)
{ // insert string w to tree T
CSNode *p;
char a[10];
if(!T){
Divide(w,a); //printf("w 是 %s,a 是 %s\n",w,a);
T=new CSNode;
p=T;
p->firstchild=p->nextsibling=NULL;
p->d=NULL;
strcpy(p->y,a); //printf("p->y 是 %s,a 是 %s\n",p->y,a);
while(*w!='\0'){
p->firstchild=new CSNode;
p=p->firstchild;
Divide(w,a);
strcpy(p->y,a); //printf("p->y 是 %s,w是 %s\n",p->y,w);
p->nextsibling=p->firstchild=NULL;
p->d=NULL; //printf("p->y 是 %s,a 是 %s\n",p->y,a);
}//WHILE
printf("Input the address:\n");
p->d=new char[20];
scanf("%s",p->d);
//for(p=T;p->firstchild!=NULL;p=p->firstchild)
//printf("%s\n",p->y);
}//if(没有错的一段)
else {
p=T;
Divide(w,a); //printf("w 是 %s,a 是 %s\n",w,a);
if(*w=='\0'){
while(p->nextsibling!=NULL)
p=p->nextsibling;
p->nextsibling=new CSNode;
p=p->nextsibling;
p->firstchild=p->nextsibling=NULL;
p->d=NULL;
strcpy(p->y,a);
//printf("w 是 %s,a 是 %s\n",w,a);
printf("Input the address:\n");
p->d=new char[20];
scanf("%s",p->d); //printf("p->y 是 %s,w是 %s\n",p->y,w);
}//if
else{
while((strcmp(p->y,a)!=0)&&(p->nextsibling!=NULL))
p=p->nextsibling;
if(strcmp(p->y,a)==0){ //printf("p->y 是 %s,w 是 %s\n",p->y,w);
p=p->firstchild;
Insert(p,w);
}//if(以上无错)
else{
p->nextsibling=new CSNode;
p=p->nextsibling;
strcpy(p->y,a);
p->nextsibling=p->firstchild=NULL;
p->d=NULL;
while(*w!='\0'){
p->firstchild=new CSNode;
p=p->firstchild;
Divide(w,a);
strcpy(p->y,a);
p->nextsibling=p->firstchild=NULL;
p->d=NULL;
}//WHILE
printf("Input the address:\n");
p->d=new char[20];
scanf("%s",p->d);
}//else
}//else
//for(p=T;p->firstchild!=NULL;p=p->firstchild)
//printf("%s\n",p->y);

}//else
}//Insert

void Found(CSTree T,char *w)
{ //查找w是否在树中,并输出信息
char a[10];
Divide(w,a); //printf("w 是 %s,a 是 %s\n",w,a);
CSNode *p;
p=T;
while((strcmp(p->y,a)!=0)&&(p->nextsibling!=NULL))
p=p->nextsibling; //printf("p->y 是 %s,w 是 %s\n",p->y,w);
if(strcmp(p->y,a)!=0)
printf("找不到服务器或发生DNS错误。\n");
else{
if(*w=='\0')
printf("该域名地址为:%s\n",p->d);
else{ // printf("p->y:%s\n",p->y);
p=p->firstchild; //printf("p->y:%s\n",p->y);
Found(p,w);
}//else
}//else
}//Found

/******************************************************
******
*****************************/

void main()
{
char c='Y';
char w[30];
CSTree T;
T=NULL;
while(c=='Y'){
printf("输入域名:\n");
scanf("%s",w);
Insert(T,w);
printf("继续输入域名?(Y/N)\n");
scanf("%c",&c);
scanf("%c",&c);
}//whi8le
c='Y';
while(c=='Y'){
printf("输入要查询的域名:\n");
scanf("%s",w);
Found(T,w);
printf("继续查询域名?(Y/N)\n");
scanf("%c",&c);
scanf("%c",&c);
}//while
}//main

㈣ C语言中memcpy函数用法

Visual C++把memcpy和memmove实现的一样,即不用担心覆盖的问题,这个可以看VC安装目录里的crt源码得知。

至于gcc,没有看过glibc的源码。

㈤ C语言~输入5个学生的学号,成绩,按成绩排序(升序),查找90分以上的

代码:

#include&lt;stdio.h&gt;

struct student

{

int num,score[3],age;

char name[20];

float aver;

}stu[1000];

main()

{

int i,j,n;

struct student temp;

/*注意:变量temp的类型与数组stu的元素类型为相同结构体的时候,才可交换两个结构体数组元素,所以此处需要定义temp的类型*/

printf("请输入学生人数: ");

scanf("%d",&n);

printf("请按顺序输入名字、学号、年龄、分数: ");

for(i=0;i&lt;n;i++)

{

scanf("%s",&stu&lt;i&gt;.name);

scanf("%d",&stu&lt;i&棚橘gt;.num);

scanf("%d",&stu&lt;i&差和猜gt;.age);

for(j=0;j&lt;3;j++)

scanf("%d",&stu&lt;i&gt;.score[j]);

}

for(i=0;i&lt;n;i++)

{int sum=0;

for(j=0;j&lt;3;j++)

sum+=stu&lt;i&gt;.score[j];

stu&lt;i&gt;.aver=sum/3.0;

}

for(i=0;i&lt;n-1;i++)/*利用冒泡排序法按平均分高低排序*/

{for(j=0;j&lt;n-i-1;j++)

{

if(stu[j].aver&gt;stu[j+1].aver)

{temp=stu[j];/*此处交换的应当是数组元素,而不是平均分*/

stu[j]=stu[j+1];

stu[j+1]=temp;

}

}

}

printf("学生信息如下(姓名、学号、年龄、成绩、平均分): ");

for(i=0;i&lt;n;i++)

{

printf("%s%d%d",stu&lt;i&gt;.name,stu&lt;i&gt;.num,stu&lt;i&gt;.age);

for(j=0;j&lt;3;j++)

printf("%d",stu&lt;i&gt;.score[j]);

printf("%.2f ",stu&lt;i&gt;.aver);

}

}

(5)c语言returnthis扩展阅读:

头文件#include&lt;stdio.h&gt;中

stdio.h是stand input&output的缩写,意思是标准输入输出头文件。凡是用到标准输入输出函数,就要调用该头文件。

查看stdio.h目录下包含哪些函数:主要有文件访问、二进制输入/输出、格式化和非格式化输入/输出、文件定位、错误处理、文件操作等。

具体打开自己的VS安装目录,找到include文件夹,打开include夹下面的stdio.h文件即可查看

(C:Program Files(x86)Microsoft Visual Studio 14.-1.1.10include)

常用标准输入输出函数:

scanf()从屏幕格式输入

printf()格式输出到屏幕

getchar()从屏幕得到一个字符

putchar()字符输出到屏幕

gets()从屏幕得到一个字符串

puts()字符串输出到屏幕

fscanf()从磁盘格式输入

fprintf()格式输出到磁盘

fgetc()从磁盘得到一个字符

fputc()字符输出到磁虚型盘

fgets()从磁盘得到一个字符串

fputs()字符串输出到磁盘

#号是预处理语句,表明在编译之前预先进行处理。

.h是header file的缩写,表面这是一个头文件。

include是文件包含命令,后面跟着引号""或者尖括号&lt;&gt;,意思是将引号或尖括号内指定的文件包含到本程序中,成为本程序的一部分,而包含的文件通常是由系统提供的。

㈥ C语言 带指针的函数 如何让它return指针

1、C语言属于高级编程语言。在C语言中一个函数不能返回局部地址即指针。
2、例如:
int
*
func(void)

int
a=
10;
int
*p
=
&a;
return
p;

a变量的区域是func()粗宏差函数,在函数内有效,出了函数就释放了,岩皮此时p指向的是一个未知
地址,属于错误用法。
正确用法
int
*p
=
NULL;绝源
int
*
func(void)

p
=
malloc(sizeof(int));
if(p!=NULL)
{
*p
=
10;
}
return
p;

㈦ C语言编程

适盯历梁合计算烂和机的算法凯运:设这个四位数为xy12,
①减9能被9整除,xy12-9=xy03,xy03此数除9的余数=0;
②减8能被8整除,xy12-8=xy04,xy04此数除8的余数=0;
③减7能被7整除,xy12-7=xy05,xy05此数除7的余数=0;
算法的c语言实现:
#include
<stdio.h>
int
main
()
{

inta,b,c,s,x,y;

for(x=1;x<=9;x++)

for(y=0;y<=9;y++)
{
a=(x*1000+y*100+3)%9;

b=(x*1000+y*100+4)%8;

c=(x*1000+y*100+5)%7;

if(a==0&&b==0&&c==0)

{

s=x*1000+y*100+12;

printf("This
number
is:%d",s);

}
}

return
0;
}
程序的运行结果:

㈧ c语言中 怎么关闭线程,怎么return之后就再次就不起作用了

VOID ExitThread(
DWORD dwExitCode // exit code for this thread
);

㈨ C语言 带指针的函数 如何让它return指针

指针可以返回,但是要注意函数内部的数组用指针返回后,到了函数外面,这改旦个数组已经被释放了。所以是个野指针销歼悔,用了就死机!这种情况可以动态申请一段内存,比如malloc函数,用完后再用free函数释放内存。

#include<亏正stdio.h>
#include<stdlib.h>

float * Input(int& len)
{
int length;
int i;
float *a;
printf("Enter a number to sort numbers:\n");
scanf("%d",&length);
len = length;
a=(float *)malloc(length*sizeof(float));
printf("Enter the number %d (Digital separated by whitespace or the end of line):\n",length);
for(i=0;i<length;i++)
{
scanf("%f",&a[i]);
}
return a;
}

void Sort(float * a, int len)
{
int i,j,length;
length = len;
for(i=0;i<length-1;i++)
for(j=0;j<length-1-i;j++)
if(a[j]>a[j+1])
{
a[j]=a[j]+a[j+1];
a[j+1]=a[j]-a[j+1];
a[j]=a[j]-a[j+1];
}
}

void main()
{
float *date = NULL;
int len;
int i;
date = Input(len);
Sort(date, len);
printf("This %d number from small to large order is the order of:\n",len);
for(i=0;i<len;i++)
printf("%-7.2f\n",date[i]);
free(date);
}
我改了一下你的程序,不太好看,只是给你看看怎么返回指针。

热点内容
怎么在windows下交叉编译qt 发布:2024-11-02 18:27:31 浏览:627
编程自动迷宫 发布:2024-11-02 18:09:48 浏览:432
联想数据守护者手机存储 发布:2024-11-02 18:09:43 浏览:201
游戏存储空间必须在同一个盘吗 发布:2024-11-02 18:09:43 浏览:677
云存储权益 发布:2024-11-02 18:08:59 浏览:55
做联机游戏服务器的电脑配置 发布:2024-11-02 17:44:36 浏览:172
华为编译器软件 发布:2024-11-02 17:42:11 浏览:123
电视机出场密码多少 发布:2024-11-02 17:36:23 浏览:577
服务器名称地址该如何填 发布:2024-11-02 17:31:14 浏览:84
群晖搭建视频培训服务器 发布:2024-11-02 17:23:14 浏览:624