c語言returnthis
㈠ 聽說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<stdio.h>
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<n;i++)
{
scanf("%s",&stu<i>.name);
scanf("%d",&stu<i&棚橘gt;.num);
scanf("%d",&stu<i&差和猜gt;.age);
for(j=0;j<3;j++)
scanf("%d",&stu<i>.score[j]);
}
for(i=0;i<n;i++)
{int sum=0;
for(j=0;j<3;j++)
sum+=stu<i>.score[j];
stu<i>.aver=sum/3.0;
}
for(i=0;i<n-1;i++)/*利用冒泡排序法按平均分高低排序*/
{for(j=0;j<n-i-1;j++)
{
if(stu[j].aver>stu[j+1].aver)
{temp=stu[j];/*此處交換的應當是數組元素,而不是平均分*/
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
printf("學生信息如下(姓名、學號、年齡、成績、平均分): ");
for(i=0;i<n;i++)
{
printf("%s%d%d",stu<i>.name,stu<i>.num,stu<i>.age);
for(j=0;j<3;j++)
printf("%d",stu<i>.score[j]);
printf("%.2f ",stu<i>.aver);
}
}
(5)c語言returnthis擴展閱讀:
頭文件#include<stdio.h>中
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是文件包含命令,後面跟著引號""或者尖括弧<>,意思是將引號或尖括弧內指定的文件包含到本程序中,成為本程序的一部分,而包含的文件通常是由系統提供的。
㈥ 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);
}
我改了一下你的程序,不太好看,只是給你看看怎麼返回指針。