首页
社区
课程
招聘
[原创]C++ 代码整理 《Visual C++ 开发实战1200例》数据结构-结构体/指针
2021-4-25 22:12 6126

[原创]C++ 代码整理 《Visual C++ 开发实战1200例》数据结构-结构体/指针

2021-4-25 22:12
6126

C++ 代码整理

前言

    菜鸟一枚,该文章为整理学习C++ 代码,进一步熟悉C++ 语言并且用来日后复习。因为原书当中使用的编译器有点老,所以,原书当中的代码在现在的环境运行可能报错。所以多少进行了修改使其可以正常运行。下图是我使用的环境。

一;数据结构

    1.1;结构体

    结构体变量初始化

#include <iomanip>
#include "string.h"
#include <typeinfo>
#include <conio.h>
#define swap(a,b) {int c;c=a;a=b;b=c;}
using namespace std;

struct student
{
	long int num;
	char name[20];
	char sex[4];
	char addr[20];
}zhang;

int main() {
	zhang.num = 1002;
	strcpy_s(zhang.name, "aaron.xu");
	strcpy_s(zhang.sex, "男");
	strcpy_s(zhang.addr, "北京");

	cout << "学号:" << zhang.num << "\n"
		<< "姓名:" << zhang.name << "\n"
		<< "性别:" << zhang.sex << "\n"
		<< "地址:" << zhang.addr << "\n";
}

    结构体嵌套结构体

#include "stdio.h"
#include "iostream"
#include <iomanip>
#include "string.h"
#include <typeinfo>
#include <conio.h>
#define swap(a,b) {int c;c=a;a=b;b=c;} //宏定义
using namespace std;


struct Date
{
	int month, day, year;
};

struct Student
{
	long int num;
	char name[20];
	char sex[4];
	char addr[20];
	Date birthDate;  //结构体嵌套结构体

};

int main() {
	Student s1 = { 1002 ,"张三","男","北京",{5,16,1992} };
	cout << s1.num << s1.name << s1.sex << s1.addr << s1.birthDate.year;
}

    将结构体作为参数传递并返回

#include "stdio.h"
#include "iostream"
#include <iomanip>
#include "string.h"
#include <typeinfo>
#include <conio.h>

#define swap(a,b) {int c;c=a;a=b;b=c;}
using namespace std;


struct Date
{
	int month, day, year;
};

Date GetDate();
void PrintDate(Date); //结构体作为参数传递并返回


int main() {
	Date dt = GetDate();
	PrintDate(dt);
	return 0;
}

Date GetDate()
{
	Date dt = { 5,19,2021 };
	return dt;
}

void PrintDate(Date dt) {
	cout << "日期:" << dt.year << "-" << dt.month << "-" << dt.day;
}

    共用体数据类型的定义

#include <stdio.h>

//定义一个共用体数据类型
union data1
{
	int i;
	char ch;
	float f;
}a1,b1,c1;

union data2
{
	int i;
	char ch;
	float f;
};

union data2 a2, b2, c2;

int main() {

	return 0;
}

    共用体变量的初始化

#include <stdio.h>
#include <iostream>
using namespace std;

//定义一个结构体
struct Date
{
	int month, day, year;
};

//定义一个共用体
union Horder
{
	Date dt;
	int hint;
	float a;
};

int main() {
	Horder id = { 12,20,2010 }; //初始化共用体
	cout << "日期:" << id.dt.day << "-" << id.dt.month << "-" << id.dt.year << "\n" << endl;
	cout << "hint: " << id.hint << "\n" << endl;
	cout << "a: " << id.a << "\n" << endl;
}

    匿名共用体

#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
	union    //匿名共用体
	{
		int month;
		int day;
		int year;
	};

	month = 6;
	day = 20;
	year = 2010;  //最后的值均为2010

	cout << year << "\n" << month << "\n" << day << "\n";
	return 0;
}

    动态创建结构体

#include <stdio.h>
#include <iostream>
using namespace std;

struct Person
{
	char ID[6];
	char Name[10];
};

int main() {
	int len = 3;
	int structionfo[10];
	for (int i = 0; i < len; i++) {
		Person* p = new Person;   
		structionfo[i] = (int)p;  //将结构体Person 的指针指向的内容放入变量structionfo[]当中
		cout << "请求输入第:" << i + 1 << "个人员的编号\n";
		cin >> p->ID;
		cout << "请求输入第:" << i + 1 << "个人员的姓名\n";
		cin >> p->Name;
	}
	for (int i = 0; i < len; i++) {
		Person* p = (Person*)structionfo[i]; //用Person* 指针p 来引用structionfo[]的内容。
		cout << "第" << i + 1 << "个人员的编号\n" << p->ID << "\n";
		cout << "第" << i + 1 << "个人员的姓名\n" << p->Name << "\n"; 
		delete[] p;
	}
	return 0;
}

    使用结构体标识操作员名称,密码和级别

    思路:定义一个包含变量名称,密码,级别的结构体,然后用数组的形式存放。每个数组元素表示一个操作员。

#include <stdio.h>
#include <iostream>
using namespace std;

//操作员
struct Operator
{
	char Name[10];
	char Password[10];
	int Level;
};

int main() {
	Operator Ops[3]; //定义一个结构体Operator类型数组

	for (int i = 0; i < 3; i++) {
		cout << "请输入第:" << i + 1 << "操作员名称;\n";
		cin >> Ops[i].Name;
		cout << "请输入第:" << i + 1 << "操作员密码;\n";
		cin >> Ops[i].Password;
		cout << "请输入第:" << i + 1 << "操作员级别;\n";
		cin >> Ops[i].Level;
	}

	for (int i = 0; i < 3; i++) {
		for (int i = 0; i < 3; i++) {
			cout << "第" << i + 1 << "操作员名称;\n" << Ops[i].Name << "\n";
			cout << "第" << i + 1 << "操作员密码;\n" << Ops[i].Password << "\n";
			cout << "第" << i + 1 << "操作员级别;\n" << Ops[i].Level << "\n";
			cout << endl;
		}
	}
}

    创建包括12个月份的枚举类型

#include <stdio.h>

enum Month
{
	JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUE, JUNLY, AUGUST,
	SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
};

int main() {
	const char* strings[] = {
		"1月","2月","3月","4月","5月","6月",
		"7月","8月","9月","10月","11月","12月"
	};
	printf_s("当前月份是:%s\n", strings[JUNLY]);
	return 0;
}

    带有函数的结构体

#include <iostream>
using namespace std;

struct Place
{
private:
	int x;
	int y;
public:
	void SetPos(int X, int Y);
	void GetPos(int& X, int& Y);
};

void Place::SetPos(int X, int Y) {
	x = X;
	y = Y;
}

void Place::GetPos(int& X, int& Y) {
	X = x;
	Y = y;
}

int main() {
	Place p;
	p.SetPos(100, 200);
	int x;
	int y;
	p.GetPos(x, y);
	cout << "X: " << x << "\n" << "Y: " << y << "\n";
	return 0;
}

    1.2;指针,地址与引用 

    使用指针自增操作输出数组元素?

#include <iostream>
using namespace std;

int main() {
	int(*p)[10]; //定义一个数组指针
	int mm[10];
	int* pp;
	p = &mm; //数组mm 的地址放入指针p 当中
	pp = (int*)*p;
	for (int i = 0; i < 10; i++) {
		*pp++ = i;
	}
	pp = (int*)*p;
	for (int i = 0; i < 10; i++) {
		cout << *pp++ << "-";
	}
	return 0;
}

    利用指针表达式操作遍历数组

    利用指针遍历数组可以使用指针表达式对指针进行整数的加减,对于一个指针加1或减1,实际是加上 或减去指针指向的数据长度。

#include <iostream>
using namespace std;

int main() {
	int mm[] = { 98,56,42,35,658,98 };
	int* p = &mm[0];
	for (int i = 0; i < 6; i++) {
		cout << *(p + i) << "\n";
	}
	return 0;

    利用指针表达式操作遍历数组

#include <iostream>
using namespace std;

int main() {
    int mm[] = { 98,56,42,34,23,123 };
    int* p = &mm[0];
    for (int i = 0; i < 6; i++) {
        cout << *(p + i) << "\n";
    }
    return 0;
}

    数组地址的表示方法

#include <iostream>
using namespace std;

int main() {
    int array[3][5]{
        {23,45,56,567,56},
        {44,67,88,54,34},
        {67,45,34,23,567}
    };
    int* p1 = &array[2][3]; //第三行第三列元素地址
    cout << *p1 << "\n";

    int* p2 = array[1] + 2; //第二行第三列元素地址
    cout << *p2 << "\n";

    int* p3 = array[0]; //数组首地址
    cout << *p3 << "\n";

    int* p4 = array[2]; //数组第三行的首地址
    cout << *p4 << "\n";
}

    指针和数组常用的方法

#include <iostream>
using namespace std;

int main() {
    char msg[] = "大家好,见到各位很高兴。";
    char* cp;
    int i;
    //指针访问,指针表示
    for (cp = msg; *cp; cp++) {
        cout << *cp;
        cout << "\n";
    }
    //下标访问,下标表示
    for (int i = 0; msg[i]; i++) {
        cout << msg[i];
        cout << "\n";
    }
    //指针访问,下标表示
    for (cp = msg; cp[0]; cp++) {
        cout << cp[0];
        cout << "\n";
    }
    //下标访问,指针表示
    for (int i = 0; *(msg + i); cp++) {
        cout << *(msg+i);
        cout << "\n";
    }

    return 0;
}

    结构指针遍历结构数组

#include <iostream>
using namespace std;

int main() {
    struct PERSON
    {
        char name[10];
        int age;
    };
    PERSON per[] = {
        {"张三",21},
        {"李斯",22},
        {"王五",23}
    };
    PERSON* p = per;
    for (int i = 0; i < 3; i++) {
        cout << "姓名:" << p->name << "\n";
        cout << "年龄:" << p->age << "\n";
        p++;
    }
    return 0;
}

    指针作为函数的参数

#include <iostream>
using namespace std;
void ShowMessage(char* msg)
{
	cout << msg << '\n';
};

int main() {


	char* cp = (char*)"大家好,这里是指针作为函数参数的实例。";
	ShowMessage(cp);

	char msg[] = "大家好,我的名字是张三。";
	ShowMessage(msg);

	ShowMessage((char*)"直接使用字符串作为参数");
	return 0;
}

    多维数组的指针参数

    多维数组可以作为函数的参数,但是需要以指针的形式进行传递,并且在指针中要给出数组维数的说明。

#include <iostream>
using namespace std;

void DisplayDate(int* date);

static int Dates[][7] = {
	{0,0,0,0,1,2,3},
	{4,5,6,7,8,9,10},
	{11,12,13,14,15,16,17},
	{18,19,20,21,22,23,24},
	{25,26,27,28,29,30,31},
};

int main() {
	DisplayDate((int*)Dates);
	return 0;
}

void DisplayDate(int* date) {
	for (int week = 0; week < 5; week++) {
		for (int day = 0; day < 7; day++) {
			if (*(date + day) != 0) {
				cout << "第" << week + 1 << "周" << "星期" << "day" << "日期:" << *(date + day) << "号" << "\n";
			}
		}
		date += 7;
	}
}

    指针作为函数的返回值

#include <iostream>
using namespace std;

int* GetDateFromInder(int index); //函数申明

int main() {
	for (int i = 0; i < 7; i++) {
		cout << *GetDateFromInder(i) << "\n";
	}
	return 0;
}

int* GetDateFromInder(int index) {
	static int Data[] = { 98,33,45,67,78,45,23 };
	return &Data[index];
}

    使用函数指针制作菜单管理器

    注释:使用函数指针制作菜单管理器是指利用函数指针指向菜单所执行的函数。即函数指针,另外值得注意的事情是函数指针的定义必须与其指向的函数的定义形式相同。

#include <iostream>

//菜单结构
struct MENU
{
	char* name;
	void (*func)(); //函数指针
};
//菜单执行的函数
void FileFunc();
void EditFunc();
void ViewFunc();
void ExitFunc();

//菜单数组
MENU menu[] = {
	{(char*)"文件菜单",FileFunc},
	{(char*)"编辑菜单",EditFunc},
	{(char*)"视图菜单",ViewFunc},
	{(char*)"推出菜单",ExitFunc}
};

int main() {
	int sel = 0;
	while (sel > 0 || sel < 5)
	{
		for (int i = 0; i < 4; i++) {
			std::cout << "(" << i + 1 << ")" << menu[i].name << "\n";
		}
		std::cout << "选择编号执行菜单操作\n";
		std::cin >> sel;
		(*menu[sel - 1].func)();
	}
	return 0;
}

void FileFunc() {
	std::cout << "执行文件菜单\n";
}

void EditFunc() {
	std::cout << "执行编辑菜单\n";
}

void ViewFunc() {
	std::cout << "执行视图菜单\n";
}

void ExitFunc() {
	std::cout << "执行退出菜单\n";
}

    使用指针实现数据交换

#include <stdio.h>

void swap(int* p1, int* p2) {
	int temp;
	//交换两个指针指向的值
	temp = *p1; 
	*p1 = *p2;
	*p2 = temp;
}

int main() {
	int a, b;
	int* pointer1, * pointer2;
	scanf_s("%d,%d", &a, &b);
	pointer1 = &a;
	pointer2 = &b;
	swap(pointer1, pointer2);
	printf_s("\n交换之后的结果是:%d,%d\n", a, b);
	return 0;
}

    使用指针实现整数排序

    注释:指针变量指向一个结构体变量时候,此时该指针变量的值是结构体变量的起始地址

#include <iostream>

struct student
{
	int num;
	char name[10];
	char sex;
	int age;
	float score;
};

int main() {
	struct student student1 = { 1001,"小王",'M',20,90.4 };
	struct student* p;
	p = &student1;
	printf_s("学号:%d\n", p->num);
	printf_s("姓名:%s\n", p->name);
	printf_s("性别:%c\n", p->sex);
	printf_s("年龄:%d\n", p->age);
	printf_s("成绩:%f\n", p->score);
	return 0;
}

     使用指针实现逆序存放数组元素值

    注释:该代码核心是invert自定义函数。首先它是有两个形参,指针x以及表示长度的n。在函数内部,j表示数组的最后一个元素,p表示数组的中间的元素。接着使用for循环来替换。

#include <stdio.h>

void invert(int* x, int n) {
	int* p, temp, * i, * j, m = (n - 1) / 2;
	i = x;
	j = x + n - 1;
	p = x + m;
	for (; i <= p; i++, j--) {
		temp = *i;
		*i = *j;
		*j = temp;
	}
}

int main() {
	int i, a[10] = {
		1,2,3,4,5,6,7,8,9,0
	};
	printf_s("输入数组元素:\n");
	for (i = 0; i < 10; i++) {
		printf_s("%d\n", a[i]);
	};
	invert(a, 10);
	printf_s("输入逆向数组元素:\n");
	for (i = 0; i < 10; i++) {
		printf_s("%d\n", a[i]);
	};
	return 0;
}

    导出二维数组的有关值

#include <stdio.h>

int main() {
	int a[3][4] = {
		1,2,3,4,5,6,7,8,9,10,11,12
	};
	printf_s("%d,%d\n",a,*a);
	printf_s("%d,%d\n",a[0],*(a+0));
	printf_s("%d,%d\n",a[1], *(a + 1));  //第二行首地址 + 第二行首地址
	printf_s("%d,%d\n", a[0][0], *(a + 0)); //第一行第一个值 + 第一行第一个值的地址
	return 0;
}

   输出二维数组任一行任一列值

#include <stdio.h>
#include <conio.h>

int main() {
	int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int* p, (*pt)[4], i, j;
	printf_s("显示数组:");
	for (p = a[0]; p < a[0] + 12; p++) {
		if ((p - a[0]) % 4 == 0) printf_s("\n");
		printf_s("%4d", *p);
	}
	printf_s("\n");
	printf_s("请输入要输出的位置:i= j= \n");
	pt = a;
	scanf_s("i=%d,j=%d", &i, &j);
	printf_s("a[%d][%d]=%d\n", i, j, *(*(pt + i) + j));
	//printf_s("a[%d,%d]=%d\n", i, j, *(*(pt + i) + j));
	return 0;
}

    使用指针查找数列中的最大值和最小值

#include <stdio.h>
#include <conio.h>

void max_min(int a[], int n, int* max, int* min) {
	int* p;
	*max = *min = *a;
	for (p = a + 1; p < a + n; p++) {
		if (*p > *min)
			*max = *p;
		else if (*p < *min)
			*min = *p;
	}
}

int main() {
	int i, a[10];
	int max, min;
	printf_s("向数组中输入10个数:\n");
	for (i = 0; i < 10; i++) {
		scanf_s("%d", &a[i]);
	}
	max_min(a, 10, &max, &min);
	printf_s("\n请输出最大值:%d\n", max);
	printf_s("\n请输出最小值:%d\n", min);
	return 0;
}

    用指针数组构造字符串数组

#include <stdio.h>
#include <conio.h>

int main() {
	//构造指针数组
	const char* Week[] = {
		"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"
	};
	int i;
	printf_s("请输入要查找星期几:\n");
	scanf_s("%d", &i);
	printf_s("对应的星期几:\n");
	printf_s("%s\n",Week[i-1]);
	return 0;
}

    将若干字符串按照字母顺序输出

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

void sort(const char* strings[], int n) {
	const char* temp;
	int i, j;
	for (i = 0; i < n; i++) {
		for (j = i + 1; j < n; j++) { //比较字符串大小,交换位置
 			temp = strings[i];
			strings[i] = strings[j];
			strings[j] = temp;
		}
	}
}

int main() {
	int n = 5;
	int i;
	const char* strings[] = {
		"C language","Basic","World wide","Hello world","One world,one dream!"
	};
	sort(strings, n);
	for (i = 0; i < n; i++) {
		printf_s("%s\n", strings[i]);
	}
	return 0;
}

    用指向函数的指针比较大小

#include <stdio.h>
#include <conio.h>

int min(int a, int b) {
	if (a < b) return a;
	else return b;
}

int main() {
	int (*pmin)(int, int); //定义一个函数指针
	int a, b, m;
	pmin = min;
	printf_s("请输入两个整数:\n");
	scanf_s("%d%d", &a, &b);
	m = (*pmin)(a, b);
	printf_s("min=%d", m);
	return 0;
}

    用指针函数实现求学生成绩

#include <stdio.h>
#include <conio.h>

float* search(float(*p)[4], int n) {
	float* pt;
	pt = *(p + n);
	return (pt);
}

int main() {
	float score[][4] = { {60,7.5,32,4},{60,75,32,4}, {60,75,32,4}, {60,75,32,4} }; //声明数组
	float* p;
	int i, j;
	printf_s("输入要查找成绩的学生学号:");
	scanf_s("%d", &j);
	printf_s("学生成绩如下:");
	p = search(score, j);
	for (i = 0; i < 4; i++) {
		printf_s("%5.1f\t:",*(p+i));
	}
	return 0;
}

    分解字符串中的单词

#include <iostream>
using namespace std;

void ListString(const char szString[]) {
	const char* pItem = szString;
	while (*pItem != '\0') //遍历字符串中的每个字符
	{
		if (*pItem == ' ') //如果是空格则跳过
		{
			cout << endl;
		}
		cout << *pItem;
		pItem++;
	}
	cout << endl;
}

int main() {
	ListString("Beauty will not buy beef");
	return 0;
}

 N;参考书籍

1;Visual C++ 开发实战1200例(第一卷)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2021-5-17 16:30 被天象独行编辑 ,原因:
收藏
点赞3
打赏
分享
最新回复 (3)
雪    币: 4
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SM的缠绵 2022-1-24 16:24
2
0
感谢分享
雪    币: 345
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
AlphaYang 2022-1-24 17:11
3
0
非常支持,现在都不常用这么多了,基本涉及到结构体,类和命名空间,感谢带我复习
雪    币: 2129
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
goldli 2022-1-26 09:23
4
0
新手,这个对我来讲很有用。
游客
登录 | 注册 方可回帖
返回