目录
选择排序法
选择排序法排列十个数字
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;
while (cin >> a0>>a1>>a2>>a3>>a4>>a5>>a6>>a7>>a8>>a9)
{
int mid = 0;
int a[10] = { a0,a1,a2,a3,a4,a5,a6,a7,a8,a9 };
int min = 0, t = 0;
for (int i = 0; i < 9; i++)
{
t = i;
for (int j = i + 1; j < 10; j++)//无序区找最小值
{
if (a[j] < a[t]) t = j; //用t记录无序区的最小值的下标
} //数组的下标是固定的,只能交换数值
if (t != i) //交换数组元素,如果出现了t=i的情况,那就是无序区中找不到比i小的,无需进行交换
{
min = a[i]; //min作中间变量
a[i] = a[t];
a[t] = min;
}
}
for (int i = 0; i <= 9; i++)
{
cout << a[i] << endl;
}
}
return 0;
}
将数据分为有序区和无序区 从有序区中锁定一个数,在无序区中寻找比它小/大的数字,如果比它小,则交换。
n个数字进行n-1轮的排序
冒泡排序
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[10] = { 23,49,80,100,54,32,21,11,25,23 };
int t = 0;
for (int i = 1; i <= 9; i++)//i是比较的轮数,每一轮找出一个最大值并排除 轮数=元素个数-1
{
int work = 1;
for (int j = 0; j < 10 - i; j++) //j是每轮比较的次数,次数=所剩元素个数-1=总元素个数-轮数 注意不能加等号
{ //同时还可以表示元素的下标
if (a[j]>a[j+1] ) //如果前一个数比后一个大,则交换
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
work = 0;
}
}
if (work) break;//如果一轮下来没有元素交换,则已经排好顺序,就终止,要注意是work=1时执行break
}
for (int i = 0; i <= 9; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
PS:当数组与for循环结合时,我们要密切关注数组下标与for循环里i变量的值的问题!!!!!可以举例子验证一下看看有没有错!!!
i代表循环终止条件、循环次数等等
对n个数排序,排序n-1次;外层循环改为n-1.内层循环改为n-1-i
for(int i=0;i<4;i++)//轮数
{
for(int j=0;j<4-i;j++)
{
if(a[j]>a[j+1]) 则交换
}
}
数组插入
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[10];//搞清楚数组下标和数组元素个数的关系!!!
int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,a10;
while (cin >> a0 >> a1 >> a2 >> a3 >> a4 >> a5 >> a6 >> a7 >> a8 >> a9)
{ a[0] = a0;
a[1] = a1;
a[2] = a2;
a[3] = a3;
a[4] = a4;
a[5] = a5;
a[6] = a6;
a[7] = a7;
a[8] = a8;
a[9] = a9;
int t = 0;
for (int i = 8; i >= 0; i--)//从最后一个开始比较
{
if (a[i + 1] < a[i]) //交换顺序
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
else break;
}
for (int i = 0; i <= 9; i++)
{
cout << a[i] << endl;
}
}
return 0;
}
string用法字符类型统计
#include <iostream>
#include<iomanip>
#include<string>
using namespace std;
void sum(string);
int main()
{
string str;
while (getline(cin,str)) //getline支持输入空格
{
sum(str);
}
return 0;
}
void sum(string str)
{
char s = ' '; //用来表示str里的每个字符元素
int a[4]={0,0,0,0}; //用来计算每个字符类别的个数
for (int i = 0; i <str.size(); i++) //注意是小于
{
s = str[i];
if ((s >= 'a' && s <= 'z') || (s >= 'A' && s <= 'Z'))
a[0]++;
else if (s >= '0' && s <= '9')
a[1]++;
else if (s == ' ')
a[2]++;
else
a[3]++;
}
for (int i = 0; i <= 3; i++)
{
cout << a[i] << " ";
}
}
数组反序输出 并显示下标
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9;
int a[10],num[10]={0,1,2,3,4,5,6,7,8,9};//另需要一个数组存放下标。
while (cin >> a0>>a1>> a2>> a3>> a4>> a5>> a6>> a7>> a8>> a9)
{
int t=0;//中间变量
//存放元素
a[0] = a0;
a[1] = a1;
a[2] = a2;
a[3] = a3;
a[4] = a4;
a[5] = a5;
a[6] = a6;
a[7] = a7;
a[8] = a8;
a[9] = a9;
//开始排序,采用冒泡排序
for (int j = 1; j <= 9; j++)
{
int work = 1;
for (int i = 0; i < 10-j; i++)
{
if (a[i] > a[i + 1])//交换元素以及下标
{
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
work = 0;
t = num[i];
num[i] = num[i + 1];
num[i + 1] = t;
}
}
if (work)break;
}
for (int i = 9; i >=0; i--)
{
cout << a[i] << " " << num[i] << endl;
}
}
return 0;
}
矩阵求和、输出
矩阵的核心:光标!!!!
字符串训练操作
#include <iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
string start;
getline(cin, start);
string name;//指令名字,和要操作的字符串内容
while (cin>>name)
{
if (name == "ADD")
{
int n;
string str1;
cin>>str1;
cin >> n;
start.insert(n + 1, str1);//在下标为n+1前插入str1
cout << start << endl;
}
if (name == "DEL")
{
int n, x;
cin >> x >> n;
start.erase(x, n);
cout << start << endl;
}
if (name == "SER")
{
string str3;
cin>>str3;
for (int i = 0; i < str3.size(); i++) //从str3的第一个元素开始,与start一个个对比,有一个相同就结束程序。
{
int work = 0;
for (int j = 0; j < start.size(); j++)
{
if (start[j] == str3[i])
{
cout << j << endl;
work = 1;//注意work和break的位置
break;
}
}
if (work) break;
}
}
if (name == "CHA")
{
string str4;
cin >> str4;
int x;
cin >> x;
start.replace(x, str4.size(), str4);
cout << start << endl;
}
}
return 0;
}
PS一些小技巧:对比相同字符那里,可以体会一下
还有通过work来实现对两个for的break等等
结构体:计算天数
#include <iostream>
#include<iomanip>
#include<string>
using namespace std;
struct num
{
int year;
int month;
int day;
};
int main()
{
int a,b,c;//年、月、日
while (cin >> a>>b>>c )
{
int result = 0;//记录天数
num s1= { a,b,c };
//数组记录每个月的天数,清晰明了
int arr[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
//闰年
if (a % 4 == 0&&a%100!=0)
{
result += 1;
}
else if (a%4==0&&a % 100 == 0 && a % 400 == 0)
{
result += 1;
}
//最后一个月有可能还没有满月
for (int i = 0; i < b-1; i++)
{
result += arr[i];
}
result += c;
cout << result << endl;
}
return 0;
}
单向链表
#include<iostream>
using namespace std;
struct Node //创建节点
{
int data;//数据域
Node* next;//指针域
};
void creat(Node*& head);
void show(Node* head);
int main()
{
Node* head = NULL;//找到头指针即可找到全部链表
creat(head);
show(head);
return 0;
}
void creat(Node*& head)
{
Node* p = new Node;//下一个节点
Node* pre = head;//上一个节点
cin >> p->data;
while (p->data != 0)
{
if (head == NULL)//第一个节点开始
head = p;
else
pre->next = p;//链接节点
pre = p;//递增
p = new Node; //创建新的节点
cin >> p->data; //输入新的数据
}
delete p;//删除结尾
pre->next = NULL;
return;
}
void show(Node* head)//遍历链表
{
while (head)
{
cout << head->data << endl;
head = head->next;
}
}