1.指向符号常量的指针
int a = 256;
const int *p = &a;
*p = 257//error
常用于保护数组,一般用来限制指针修改数组的功能》。
2.
3.静态变量static
编程题#1:分配病房(花了很长时间,有一定难度)
某个科室的病房分为重症和普通,只有当病人的疾病严重程度超过了入住重症病房的最低严重值,才可以安排入住重症病房。
现在要求设计一个程序,给病人安排好病房。疾病的严重程度用0到10来表示,0表示小毛病,10表示非常严重。
输入
第一行输入病人的个数m(m < 50),以及安排住入重症病房的最低严重值a
紧接着m行,每行表示病人编号(三个位,用0补齐)及其疾病的严重程度(浮点数,1位小数)。
每个病人的疾病严重程度都不一样。
输出
要求按照病人的严重程度输出住在重症病房里的病人的编号
注意:
如果当前所有病人的严重程度并不满足住在重症病房里,则输出“None.”(不包括引号)
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
void output(float (*p)[2],float a) {
float c[50][2];//存>a的(编号,严重程度)对
int flag = 0;//flag计>a的项的数目
for (int i = 0; i<50; p++,i++) {
if ((*p)[1] > a) {
c[flag][0] = (*p)[0];
c[flag][1] = (*p)[1];
flag += 1;
}
}
if (flag == 0)
cout << "None." << endl;
else {
float max = 0;
int maxNum=0;
for(int j = 0; j < flag; j++) {
for (int i = 0; i < flag; i++) {
if (c[i][1] > max) {
max = c[i][1];
maxNum = i;
}
}
cout << setw(3) << setfill('0') << (int)c[maxNum][0] << ' '<< setiosflags(ios::fixed) << setprecision(1) << max << endl;
//这一句要注意的很多,cout<<setw(3)<<setfill('0')是设占位3个补0
//setiosflags(ios::fixed) << setprecision(1)是保留1位小数,查baidu的
//尤其要注意那个强制类型转换,提交4次wrong answer就是这个没改--很难查出错来
c[maxNum][1] = 0;
max = 0;
}
}
}
int main() {
int m = 0;
float a = 0;
cin >> m >> a;
float b[50][2];//读输入的(编号,严重程度)对
for (int i = 0; i < m; i++)
cin >> b[i][0] >> b[i][1];
output(b,a);
return 0;
}
感觉写的不太好看,耦合过多,没分好函数..
编程题#2: 配对碱基链(自己写了但没通过OJ)
脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,腺瞟呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对。你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。
输入
第一行是一个正整数n,表明共有n条要求解的碱基链。
以下共有n行,每行用一个字符串表示一条碱基链。这个字符串只含有大写字母A、T、G、C,分别表示腺瞟呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。每条碱基链的长度都不超过255。
输出
共有n行,每行为一个只含有大写字母A、T、G、C的字符串。分别为与输入的各碱基链互补的碱基链。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int n=0;
cin >> n;
cin.get();//吃掉回车,之前测试的时候少了这句的话会少打一行
for (int i = 0; i < n; i++) {
char a[256];
cin.getline(a, 256);
char b[256];
for (int j = 0; j < 256; j++) {
switch (a[j]) {
case 'A':b[j] = 'T'; break;
case 'T':b[j] = 'A'; break;
case 'G':b[j] = 'C'; break;
case 'C':b[j] = 'G'; break;
default:b[j] = '\0'; break;
}
}
for (int j = 0; i < 256; j++) {
if (b[j] != '\0')
cout << b[j];
else {
cout << endl;
break;
}
}
}
return 0;
}
参考http://www.lai18.com/content/8577710.html
这题,自己原来用的二维数组,本地测试没发现问题,但OJ没通过,后面自己也没找到问题
–所以,这种题可用一维数组一行一行地输出,不必强行二维数组。
编程题#3:寻找山顶(简单题,但耗了不少时间)
在一个m×n的山地上,已知每个地块的平均高程,请求出所有山顶所在的地块(所谓山顶,就是其地块平均高程不比其上下左右相邻的四个地块每个地块的平均高程小的地方)。
输入
第一行是两个整数,表示山地的长m(5≤m≤20)和宽n(5≤n≤20)。
其后m行为一个m×n的整数矩阵,表示每个地块的平均高程。每行的整数间用一个空格分隔。
输出
输出所有上顶所在地块的位置。每行一个。按先m值从小到大,再n值从小到大的顺序输出。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int m=0, n=0;
cin >> m >> n;
int a[20][20];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
int s1 = 1,s2=1,s3=1,s4=1;//分别是上下左右是否<=a[i][j]
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++) {
if (i - 1 >= 0 && i - 1 < m) {
if (a[i][j] < a[i - 1][j])
s1 = 0;
}
if (i + 1 >= 0 && i + 1 < m) {
if (a[i][j] < a[i + 1][j])
s2 = 0;
}
if (j - 1 >= 0 && j - 1 < n) {
if (a[i][j] < a[i][j - 1])
s3 = 0;
}
if (j + 1 >= 0 && j + 1 < n) {
if (a[i][j] < a[i][j + 1])
s4 = 0;
}
if(s1==1&&s2==1&&s3==1&&s4==1)
cout << i << ' ' << j << endl;
s1=1,s2=1,s3=1,s4=1;
}
return 0;
}
这题,在上下左右那个分支语句处耗时很久,开始是用的一个flag,调试发现打印出来很多组,才改成4个标志数
并且,这一次的题出现好几次cin>>a[m][n](应该写a[i][j]的)的情况..注意点
主要是,开始写代码之前,把伪代码写得完善一点。