赞
踩
本专栏主要基于北大郭炜老师的程序设计与算法系列课程进行整理,包括课程笔记和OJ作业。该系列课程有三部分: (一) C语言程序设计;(二) 算法基础;(三) C++面向对象程序设计
struct 结构名
{
类型名 成员变量名;
类型名 成员变量名;
类型名 成员变量名;
......
};
struct Student {
unsigned int ID;
char szName[20];
float fGPA;
};
Student s1,s2;
struct Date {
int year;
int month;
int day;
};
struct StudentEx {
unsigned int ID;
char szName[20];
float fGPA;
Date birthday;
};
struct Employee {
string name; //字符串对象
int age;
int salary;
Employee * next; //链表和二叉树中会用到
};
struct Date { int year; int month; int day; }; struct StudentEx { unsigned ID; char szName[20]; float fGPA; Date birthday; }; StudentEx stu; cin >> stu.fGPA; stu.ID = 12345; strcpy(stu.szName, "Tom"); cout << stu.fGPA; stu.birthday.year = 1984; unsigned int * p = & stu.ID; //p指向stu中的ID成员变量
StudentEx stu = { 1234,"Tom",3.78,{ 1984,12,28 }}; //一一对应
StudentEx MyClass [50]; //结构数组 里面的每一个元素都是一个StudentEx结构类型
StudentEx MyClass2[50] = {
{ 1234,"Tom",3.78,{ 1984,12,28 }},
{ 1235,"Jack",3.25,{ 1985,12,23 }},
{ 1236,"Mary",4.00,{ 1984,12,21 }},
{ 1237,"Jone",2.78,{ 1985,2,28 }}
};
MyClass[1].ID = 1267;
MyClass[2].birthday.year = 1986;
int n = MyClass[2].birthday.month;
cin >> MyClass[0].szName;
StudentEx * pStudent;
StudentEx Stu1;
pStudent = & Stu1; //pStudent是指向结构变量Stu1的指针,*pStudent就是结构变量Stu1
StudentEx Stu2 = * pStudent;
(严格来说,pStudent储存的是结构变量Stu1的首地址,即pStudent指向结构变量Stu1的首地址,*pStudent是从这个首地址开始sizeof(StudentEx)个字节的内存区域内存储的内容。方便起见,可以像上面那样表述)
StudentEx Stu;
StudentEx * pStu;
pStu = & Stu;
pStu->ID = 12345;
(*pStu).fGPA = 3.48;
cout << Stu.ID << endl; //输出12345
cout << Stu.fGPA << endl; //输出 3.48
#include <iostream>
using namespace std;
int n1=5,n2=10; //全局变量
void Function1()
{
int n3 =4; //局部变量
n2 = 3;
}
void Function2()
{
int n4; //局部变量
n1 = 4;
n3 = 5; //编译出错,n3无定义
}
#include <iostream>
using namespace std;
void Func()
{
static int n = 4; //静态变量只初始化一次 只有第一次被执行时初始化,之后每次不会再初始化
cout << n << endl;
++ n;
}
int main()
{
Func();
Func();
Func();
}
上述结果是:4 5 6;如果去掉static 输出结果将会是:4 4 4。
#include <iostream> #include <cstring> using namespace std; int main() { char str[] ="- This, a sample string, OK."; //下面要从str逐个抽取出被" ,.-"这几个字符分隔的子串 char * p = strtok (str," ,.-"); //p是指向子串开始位置的指针 while ( p != NULL) //只要p不为NULL,就说明找到了一个子串 { cout<<p<<endl; //打印找到的子串 p = strtok(NULL," ,.-"); //后续调用,第一个参数必须是NULL } return 0; }
输出结果:
手写实现一个Strtok:
char * Strtok(char * p,char * sep) { static char * start ; //本次查找子串的起点 if(p) //第一次调用函数时 传入的是整个字符串 p指向整个字符串的起始位置 非空指针;之后每次调用函数,传入的是NULL,此时p为空指针 start = p; //第一次查找子串的起始位置 就是整个字符串的起始位置 //跳过分隔符 for(;*start&&strchr(sep,*start);start++); //如果*start不是结束符且*start是分隔字符串中的字符,start就一直往下移动,跳过这些分隔符 if(*start==0) //上述循环跳出有两种情况 第一种是字符串结束了,start指向了结束符 return NULL; //没有找到子串 //第二种情况就是遇到了 非分隔字符 char *q = start; //q指向第一个非分隔字符 即所找到子串的开始位置 //跳过非分隔字符 for(;*start&&!strchr(sep,*start);start++); //如果*start不是结束符且*start不是分隔字符串中的字符,start就一直往下移动,跳过这些非分隔符 if(*start) //上述循环跳出有两种情况 当start指向一个分隔字符时 { *start = 0; //把这个分隔字符 赋值为0 也就是变成结束符 ++start; //start移动到下一个位置 } return q; // q指向第一个非分隔字符,即所找到子串的开始位置。可以输出q,直到我们设置的结束符为止,那么一个子串就找到了/输出完毕。 }
我们之所以把start指针变量声明为static,是因为下次再调用该函数时,可以接着上次start位置继续往下找新的子串。第一调用函数时,可以给static赋一个初值(起始位置),之后每次第一个参数传入NULL即可,接着上次start指向的位置继续往下走。
void Func(int m)
{
for( int i = 0; i < 4;++i ) {
if( m <= 0 ) {
int k = 3;
m = m *( k ++ );
}
else {
k = 0; //编译出错,k无定义
int m = 4;
cout<<m;
}
}
i = 2;//编译出错,i无定义
}
例题: 编程接收键盘输入的若干个整数,排序后从小到大输出。先输入一个 整数n,表明有n个整数需要排序,接下来再输入待排序的n个整数。
解题思路:先将n个整数输入到一个数组中,然后对该数组进行排序,最后遍历整个数组,逐个输出其元素。
对数组排序有很多种简单方法,如“冒泡排序”、 “选择排序”、 “插入排 序”等
如果有N个元素需要排序,那么首先从N个元素中找到最小的那个(称为第0 小的)放在第0个位子上(和原来的第0个位子上的元素交换位置),然后再从剩 下的N-1个元素中找到最小的放在第1个位子上,然后再从剩下的N-2个元素 中找到最小的放在第2个位子上…直到所有的元素都就位。
4,3,2,1
1,3,2,4
1,2,3,4
void SelectionSort(int a[] ,int size) {
for( int i = 0; i < size - 1; ++i ){//每次循环后将第i小的元素放好
int tmpMin = i;
//用来记录从第i个到第size-1个元素中,最小的那个元素的下标
for(int j=i+1;j<size;j++)
if(a[j]<a[tmpMin])
tmpMin=j;
int tmp = a[i];
a[i] = a[tmpMin];
a[tmpMin] = tmp;
}
}
时间复杂度:程序中执行最多的操作被执行了多少次。
上面程序中a[j]<a[tmpMin] 比较语句被执行的次数最多:size-1+size-2+…+1 = (size-1)size/2
O
(
s
i
z
e
2
)
O(size^2)
O(size2),size是数组大小,即数组包含的元素个数。
4,3,2,1
3,4,2,1
2,3,4,1
1,2,3,4
void InsertionSort(int a[] ,int size)
{
for(int i = 1;i < size; ++i ) { //无序部分
//a[i]是最左的无序元素,每次循环将a[i]放到合适位置
for(int j=0;j<i;j++) //有序部分
if(a[j]>a[i])
{
int tmp = a[i];
for(int k=i;k>j;k--)
a[k] = a[k-1];
a[j] = tmp;
break;
}
}
}
void BubbleSort(int a[] ,int size)
{
for(int i = size-1;i > 0; --i ) {
//每次要将未排序部分的最大值移动到下标i的位置
for(int j=0;j<i;++j)
{
if(a[j]>a[j+1])//依次比较相邻的两个元素
{
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。