程序设计与算法(一) 第十周

2016-10-14  本文已影响0人  我是阿喵酱

结构(struct)

现实需求

struct 结构名
{
类型名 成员变量名;
类型名 成员变量名;
类型名 成员变量名;
……
};

struct Student {
unsigned ID;
char szName[20];
float fGPA;
};

Student 即成为自定义类型的名字,可以用来定义变量

Stuent s1,s2; 
struct Date {
int year;
int month;
int day;
};
struct StudentEx {
unsigned 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 MyClass [50];

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;
StudentEx Stu2 = * pStudent; 

指向结构变量的指针

StudentEx Stu;
StudentEx * pStu;
pStu = & Stu;
pStu->ID = 12345;
(*pStu).fGPA = 3.48;
cout << Stu.ID << endl; //输出 12345
cout << Stu.fGPA << endl; //输出 3.48

C++程序结构

全局变量和局部变量

#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

静态变量应用:strtok的实现

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
  char str[] ="- This, a sample string, OK.";
  //下面要从str逐个抽取出被" ,.-"这几个字符分隔的字串
  char * p = strtok (str," ,.-");
  while ( p != NULL) //只要p不为NULL,就说明找到了一个子串
{
    cout << p << endl;
    p = strtok(NULL, " ,.-");
    //后续调用,第一个参数必须是NULL
}
  return 0;
}
char * p = strtok (str," ,.-");
while ( p != NULL) //只要p不为NULL,就说明找到了一个子串
{
  cout << p << endl;
  p = strtok(NULL, " ,.-");
//后续调用,第一个参数必须是NULL
}
输出结果:
This
a
sample
string
OK

-This,asamplestring,OK\0
char * Strtok(char * p,char * sep)
{
  static char * start ; //本次查找子串的起点
  if(p)
  start = p;
  for(; *start && strchr(sep,*start); ++ start); //跳过分隔符号
  if( * start == 0)
  return NULL;
  char * q = start;
  for(; *start && !strchr(sep,*start); ++ start); //跳过非分隔符号
  if( * start) {
  * start = 0;
  ++ start;
}
  return q;
}

标识符的作用域

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无定义
}

变量的生存期

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个元素中找到最小的那个(称为第0
小的)放在第0个位子上(和原来的第0个位子上的元素交换位置),然后再从剩
下的N-1个元素中找到最小的放在第1个位子上,然后再从剩下的N-2个元素中
找到最小的放在第2个位子上……直到所有的元素都就位。

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;
      }
//下面将第i小的元素放在第i个位子上,并将原来占着第i个位子的元素挪到后面
    int tmp = a[i];
    a[i] = a[tmpMin];
    a[tmpMin] = tmp;
    }
}

插入排序

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]) {
//要把a[i]放到位置j,原下标j到 i-1的元素都往后移一个位子
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;
}
}
}

简单排序的效率

上一篇 下一篇

猜你喜欢

热点阅读