方法论

1.编程基本素养和能力:
看到一个编程题,就应将其不断地拆解为一个个可解决的小问题。之后要做的就是将每个小问题写成一个个代码段,以及考虑一下大方向上的代码连接问题。
2.通过书本和视频理解概念和在解决问题中应用理解是完全不同的,不仅要理解,还要通过会写代码编程来解决问题。

实验30 求最大值并指针输出

题目描述

编写相应的程序用指针实现:从键盘输入3个整型数va、vb、vc,通过一个指向整型的指针iptr,输出3个数中的最大值。
输入
1 2 3
输出
3

思路

对于比较大小,C++提供了一个方便的运算符?: ,可以用它来无限嵌套来比较任意个数的的大小;
比较大小的思想:先比较前两个数,再拿大(小)的数和下一个数比较

代码

#include<iostream>
using namespace std;
int main() {int va, vb, vc,x;cin >> va >> vb >> vc;x = va > (vb > vc ? vb : vc) ? va : (vb > vc ? vb : vc);int* iptr = &x;cout << *iptr;return 0;

实验31 求一维、二维数组元素平均值

题目描述

编写一个函数get_average()获取整型数组元素的平均值。要求这个函数既可以用来求一维数组元素的平均值,也可以求二维数组元素的平均值。
在main()函数中通过具体的一维数组Array_1D和二维数组Array_2D测试这个函数。
假定一维数组为a[5],二维数组为b[2][3],一维数组和二维数组的变量值由键盘分别输入,在屏幕上输出一维数组和二维数组的平均值,平均值间用一个空格分开。
输入
1 2 3 4 5
1 2 3 4 5 6
输出
3 3.5

程序化

定义重载函数分别求一维数组和二维数组的平均值;
对二维数组的元素进行操作-双层循环(如从键盘输入二维数组元素);

代码

//数组求和函数
#include <iostream>
using namespace std;
//要求一维数组和二维数组的平均值,可用重载函数(一维数组和二维数组是不同的形参)
float get_average(int a[5]) {//int a[5];//程序化:形参在主函数中已经定义,不能再在此函数中定义//sum定义和初始化应该在循环外,循环内定义的变量只在循环内生存//易错:sum应该是float,而非intfloat sum = 0;for (int i = 0; i < 5; i++) sum += a[i];return sum / 5;
}
float get_average(int b[2][3]) {//int b[2][3];float sum = 0;//程序化:对二维数组的元素进行操作-双层循环for (int i = 0; i < 2; i++)for (int j = 0; j < 3; j++)sum += b[i][j];return sum / 6;
}
int main() {int a[5], b[2][3];//程序化:从键盘输入一维数组元素for (int i = 0; i < 5; i++)cin >> a[i];//程序化:从键盘输入二维数组元素for (int i = 0; i < 2; i++)for (int j = 0; j < 3; j++)cin >> b[i][j];cout << get_average(a) <<" "<< get_average(b) << endl;
}

实验32字符串的变换

题目描述

编制程序,调用指针作为参数的函数,实现下面两字符串变量的交换。 char* ap=“hello”; char* bp=“how are you”; 交换的结果为:ap 指向"how are you",bp 指向"hello"。 (注意:输出语句中的;和.为英文符号)
输入
输出
ap指向how are you;
bp指向hello.

程序化

交换思想代码;

代码

这题比较简单,直接上代码

#include<iostream>
#include<string>
using namespace std;
void swap(char* ap, char* bp)
{char* cp;cp = ap;ap = bp;bp = cp;
}
int main()
{const char* ap = "hello", * bp = "how are you";swap(ap, bp);cout << "ap指向" << ap<<";"<< endl;cout << "bp指向" << bp<<".";return 0;
}

实验33 动态申请内存及元素排序

题目描述

动态申请一个一维整型数组,要求用户从键盘输入元素个数,采用new运算符分配空间,从键盘输入数组变量的值.
写一个函数void Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序(升序)。
将排序后的数组变量的值输出到屏幕上,各数值间用一个空格隔开。
输入
10 1 2 3 4 5 0 7 8 0 10
输出
1 2 3 4 5 7 8 10 0 0

思路

这道题说明一般数组和指针本质是一样的,可通用;
思路1.先给数组排序(之前也说过,这里不再赘述),再把数组中的0移向末尾
思路2.(师兄教的高端做法)思路1的两步可以合成一步,多定义一个bool型函数而已

程序化

1.把数组元素中的0移至最后,其余元素升序排列;

2.从键盘输入动态一维数组元素的两种方法;

3.易错点:一些地方的表达式的值必须是bool值(如条件语句的条件),特别注意=和==的区别;

4.最后一个元素输出时无间隔的问题;

代码

#include<iostream>
using namespace std;
int main() {int n;cin >> n;//1.程序化:申请动态一维数组int* p = new int[n]; int* p1 = p;//2.程序化:从键盘输入动态一维数组·法一/*for (int i = 0; i < n; i++) {int k; cin >> k;*p1 = k; *p1++;}*///程序化:从键盘输入动态一维数组·法二for (int i = 0; i < n; i++)cin >> p[i];//3.排序for (int i = 0; i < n; i++)for (int j = 0; j < n - i - 1; j++) {if (*(p1 + j) > * (p1 + j + 1)) {int hold = *(p1 + j + 1);*(p1 + j + 1) = *(p1 + j);*(p1 + j) = hold;}}//4.移0for (int i = 0; i < n; i++)for (int j = 0; j < n - i - 1; j++) {if (*(p1 + j) == 0) {int hold = *(p1 + j + 1);*(p1 + j + 1) = *(p1 + j);*(p1 + j) = hold;}}//5.分步输出for (int i = 0; i < n - 1; i++)cout << p[i] << " ";cout <<*(p1+n-1);//6.释放delete[]p;return 0;
}

师兄的思路

#include <iostream>
using namespace std;
int n;
bool compare(int a, int b) {if (!a) return 1;if (!b) return 0;return a > b;}int main() {cin >> n;int *p = NULL;p = new int[n];int *pos = p, *pp = p;for (int i = 0; i < n; i++) {int k; cin >> k;*pos = k; pos++;}for (int i = 0; i < n; i++)for (int j = 0; j < n - i - 1; j++) {if (compare(*(pp + j), *(pp + j + 1))) {int t = *(pp + j);*(pp + j) = *(pp + j + 1);*(pp + j + 1) = t;} }for (int i = 0; i < n - 1; i++) cout << *(p + i) << " ";cout << *(p + n - 1);delete [] p;return 0;}

实验34 字符串比较与排序

题目描述

用字符指针数组,将给定的5个字符串(可以是任意5个国家名字)进行排序并输出。
输入
China American France Spain Greece
输出
American
China
France
Greece
Spain

程序化

1.比较字符串大小->用C++提供的函数strcmp(char*s1,char*s2),其返回值为<0、=0、>0;

2.用函数strcmp(char*s1,char*s2)来比较一组字符串(与冒泡算法思想的结合);

3.冒泡算法思想;

4.字符串处理->一定记得包含cstring头文件;

5.根据题目要求(用字符指针数组+数组中得包含各种字符串)+一维字符指针数组只能储存一串字符串->用二维数组储存多串字符串(直接向a[i]中输入字符串);

6.再将a[i]赋给一维指针数组name[i],用*name[i]作为strcmp函数形参;

7.对二维数组的理解->相当于以一维数组为元素(每行)的一维数组;

8.如何将一维数组设为二维数组的元素(每行)->详见代码

代码

#include <iostream>
#include <cstring>
using namespace std;
int main() {//1.首先定义一个一维指针数组和二维数组char* name[5];char a[5][100];//2.键盘输入赋值for (int i = 0; i < 5; i++) {cin >> a[i];name[i] = a[i];}//3.strcmp比较,以此为条件依据进行冒泡排序(条件语句+冒泡排序)//冒泡算法for(int i=0;i<5;i++)for (int j = 0; j < 4 - i; j++) {if (strcmp(name[j], name[j + 1]) > 0) {//以字符指针作为中间存储存字符串char* t = name[j];name[j] = name[j + 1];name[j + 1] = t;}}//4.输出for (int i = 0; i < 5; i++)cout << name[i] << endl;return 0;
}

实验35 结构体与指针并排序输出元素

题目描述

已知有3名学生及五门课程的成绩,要求根据学生的各科平均分排序(降序),并输出学生的所有信息和平均分(用指针数组完成)。
输入
Jane 90 80 75 60 85
Mark 85 78 98 85 86
Lily 56 65 75 68 80
输出
Mark 85 78 98 85 86 86.4
Jane 90 80 75 60 85 78
Lily 56 65 75 68 80 68.8

思路

1.又有字符串又有int又有float真不好办呢。。。
->(1)用结构数组(结构数组的使用:用struct自定义一个数据类型<包含各种成员>,再用这数据类型定义一个变量或一个数组);
(2)本题有三组+每组都有字符串又有int又有float->
定义一个结构数组(其中包含多个结构变量)

2.(1)对结构数组的理解:不同类型数据(每一类可是数组)的集合;
(2)访问结构数组的成员的方法:点操作符.

3、结构指针的成员的访问方法:箭头操作符->

4、如何从键盘往结构数组中输入数据;

5、每个循环结构里可以做很多事情(比如这里就不止有一条输出语句)

代码

文笔不够,代码来凑

#include <iostream>
using namespace std;
int main() {//1.自定义一个结构数据类型,用该类型定义一个结构数组struct student {char name[10];int score[5];float aver;};student stu[3];//2.从键盘往数组中输入数据for (int i = 0; i < 3; i++) {cin >> stu[i].name;float num = 0;for (int j = 0; j < 5; j++) {cin >> stu[i].score[j];num += (float)stu[i].score[j];}stu[i].aver = num / 5;}//3.定义一个结构指针,将结构数组的值赋给它student* p[3];for (int i = 0; i < 3; i++) p[i] = &stu[i];//4.根据aver的大小进行排序for (int i = 0; i < 2; i++)if (p[i]->aver < p[i+ 1]->aver) {student* temp;temp = p[i];p[i] = p[i + 1];p[i + 1] = temp;}//5.输出//程序化:每个循环结构里可以做很多事情(比如这里就不止有一条输出语句)for (int i = 0; i < 3; i++) {cout << p[i]->name<<" ";for (int j = 0; j < 5; j++)cout << p[i]->score[j] << " ";cout << p[i]->aver;}return 0;
}

实验36 数组合并并排序

题目描述

将两个数组a和b合并,合并后的数组按升序输出。 说明:
1)数组a和b的大小和元素的值从键盘输入;先输入数组大小,再输入数组的值;
2)合并后的数组输出时,各数值间以空格分开。
输入
2 1 2
4 1 2 3 4
输出
1 1 2 2 3 4

思路

先申请动态内存并赋给指针,再将两数组都存进去。再对指针内容统一排序。
易出bug:注意是先要输入数组大小,在输入数组;
注意指针初值是否改变,常将多个指针指向同一动态内存。

程序化

1.根据题目要求的输入顺序来放cin的位置;

2.对指针相关概念的理解;

3.数组都可以弄成指针;

4.对指针进行多次初值操作;

5.动态申请内存——new和delete成对出现;

代码

#include<iostream>
using namespace std;
int main() {int a, b;//注意题目要求的输入顺序cin >> a;//数组[]中只能是常量表达式,因此只能用指针//先申请整型动态内存int* p= new int[110];//再将申请的内存分配给指针p1,p2int* p1 = p;int* p2 = p;//再往指针里写入从键盘输入的数据,将两个数组都写入p1//因为p1得值在输入数时会改变,因此这里再用一个指针p2指向同一动态内存,以便后面冒泡排序和输出//这里要求对指针相关概念要理解到位for (int i = 0; i < a; i++){int c; cin >> c;//*p1指指针所指向的第一个元素(*间接运算指通过指针间接访问其所指向的内容)//p1指内容的首地址,*p1指内容(非字符指针)//若为字符指针,cout<<p1是输出指向的字符串(唯一特殊)//p1指指针首地址,p1++是指针的运算,含义是当前地址的下一地址*p1 = c; p1++;}cin >> b;for (int i = 0; i < b; i++) {int d; cin >> d;*p1 = d; p1++;}//知识点·冒泡排序程序化:双层循环结构,第一层是遍数(即控制第二层执行次数的),第二层是每一遍排序//程序化:第二层中循环条件为j<a+b-i-1的原因是升序排列中每次排序后的最后一个一定是最大的,j<a+b也行但没必要for (int i = 0; i < a + b; i++) {for (int j=0; j < a + b - i - 1; j++) {if (*(p2 + j) > * (p2 + j + 1)) {int hold = *(p2 + j);*(p2 + j) = *(p2 + j + 1);*(p2 + j + 1) = hold;}}}//程序化(最后一个数无空格):这里最后输出因为最后一个数没有空格,所以单独用一条语句输出(易错)for (int i = 0; i < a + b - 1; i++)cout << *(p2 + i) << " ";cout << *(p2 + a + b - 1) << endl;//最后别忘了释放动态内存(记住申请和释放始终成对出现)delete[]p;return 0;
}

实验37 元素插入与排序

题目描述

请编写函数实现将一个数值插入到数组中适当的位置,使新数组按降序排列,并将插入的位置输出到屏幕上。
说明:1)原数组大小和数值由键盘输入,动态创建数组;
2)插入的数值由键盘输入。
3)如果插入数据与原数组中某数据相同,则插在该数据之前。
输入
10 1 4 5 2 3 6 7 8 10 9
11
输出
1

思路:

先排序,再确定插入的位置,最后根据位置调整插入

代码

#include <iostream>
using namespace std;
int flag = 0;
int main() {//准备程序化:申请动态内存并赋给指针,输入数组int n, in;cin >> n;int* p = new int[1000];//注意指针的初值是否改变,因为很多时候后面还会从指针的初值开始操作,这时候就会出现bugint* p1 = p;int* p2 = p;for (int i = 0; i < n; i++) {int k; cin >> k;*p1 = k; p1++;}cin >> in;//冒泡排序for(int i=0;i<n;i++)for (int j = 0; j < n - i - 1; j++) {if (*(p1 + j) < *(p1 + j + 1)) {int hold = *(p1 + j);*(p1 + j) = *(p1 + j + 1);*(p1 + j + 1) = hold;}}int pos = 0;for (int i = 0; i < n; i++)//若该位置的数不大于in,if (*(p + i) <= in) {pos = i;flag = 1;}//这里引入flag是因为考虑到当in最小时这种特殊情况,所以将其单独考虑//如何写这种特殊情况的代码呢?——若in最小,即flag=0,此时pos=nif (!flag)pos = n;//根据应插入的位置进行调整和插入:将后面的数都往后退一格,in插入for (int i = n; i > pos; i--) {*(p + i) = *(p + i - 1);*(p + pos) = in;}//因为p本身代表1,因此in位置为pos+1cout << pos + 1 << endl;delete[]p;return 0;
}

bupt信通院上机第一学期实验四(30-37) 指针相关推荐

  1. 2020年-数据库实验详述-BUPT 信通院-- 十安辰

    一.实验目的: 掌握关系数据库的基本知识和概念. 理解和掌握关系数据库标准SQL语言,能够熟练使用SQL语言完成基本的数据库操作 和管理任务. 掌握SSMS数据库管理工具的使用,能够认识并理解基本SQ ...

  2. 北京邮电大学_信通院_C++上机题汇总

    此处只有题目汇总,源码请点击Github链接博主的Github 特别说明:学校的OJ系统对输出格式的要求很严格(我自己都不知道死在末尾空格多少次了),本文代码仅供参考,可不要直接复制粘贴哦 北京邮电大 ...

  3. 总分第一!阿里云数据库应用迁移解决方案通过信通院首批最高级评测

    简介:6月25日,记者采访获悉,经中国信息通信研究院(以下简称"信通院")的严格测试评定,阿里云数据库应用迁移服务顺利通过了"数据库应用迁移服务能力"评测,总得 ...

  4. 信通院AI白皮书:硬核干货一文打尽,从技术流派到应用趋势【附下载】

    来源:智东西 摘要:从产业发展的角度,分析AI技术现状.问题以及趋势,盘点智能语音.语义理解.计算机视觉等相关应用. 自2016年AlphaGo击败李世石之后,人工智能(AI)这个再度翻红的科技热词已 ...

  5. 阿里云飞天系统质效管理体系入选信通院“软件质效领航者”优秀案例

    近日,由中国信息通信研究院(以下简称信通院)主办的"精益软件工程大会"成功举办.会上,信通院公布了"2022年软件质效领航者"优秀案例评选结果,阿里云飞天系统质 ...

  6. 百度人脸活体检测系统通过信通院“护脸计划”首批优秀级安全防护能力评估

    11月2日,百度人脸活体检测系统(V2.0)以全项通过的优异成绩,顺利通过信通院"可信人脸应用守护计划"(以下简称"护脸计划")测试,获评为优秀级(四级)安全防 ...

  7. Bonree ONE荣获信通院“2022IT新治理年度明星产品”

    今日,由信通院主办的"GOLF+IT新治理领导力论坛"正式召开,论坛上公布了2022IT新治理年度评选活动的结果,博睿数据一体化智能可观测平台Bonree ONE凭借卓越的产品力以 ...

  8. 北邮信通复试题c语言,『转贴』北邮信通院跑调剂的经历

    发信人: yn295636 (yn), 信区: AimGraduate 标  题: 昨天信通院跑调剂的经历 发信站: 北邮人论坛 (Thu Mar 26 12:01:33 2009), 站内 昨天在教 ...

  9. 蚂蚁集团SOFAStack、Tugraph等产品入选信通院软件供应链安全名录

    近日,由中国信息通信研究院(下简称"信通院")主办的2022"3SCON软件供应链安全会议"召开.为应对软件供应链安全治理难题,并为用户选择合适厂商及产品提供选 ...

最新文章

  1. OpenGL延迟着色之三
  2. 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means
  3. CTF常用python库PwnTools的使用学习
  4. 爬虫——————爬取中金所,深交所,上交所期权数据
  5. java 链接重排序_JAVA中JVM的重排序详细介绍
  6. 曾经的独角兽 Docker,如今资金紧张
  7. Python稳基修炼之计算机等级考试易错概念题1(含答案与解析)
  8. bzoj 2440: [中山市选2011]完全平方数【莫比乌斯函数+二分】
  9. 思科网络设备模拟器GNS3与SecureCRT关联
  10. Linux 探索之旅 | 第五部分第七课:Shell 实现图片展示网页
  11. 20191119每日一句
  12. Qt 多语言切换——Qt语言家
  13. AECC2019免费下载After Effects CC 2019中文完整破解版免费下载与安装教程...
  14. 乐嘉老师色彩性格测试完全版
  15. 如何做人群画像 如何做用户画像
  16. php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言
  17. 详解 HTTP 协议报文格式 构造 HTTP 请求
  18. JVM-调优《常见可视化工具与命令行的使用》
  19. 油猴脚本、常用拓展的教程
  20. CDN新品发布:阿里云SCDN安全加速开放公测

热门文章

  1. 10年老师傅总结的CAD绘图命令,让你的工资从3000到1W!
  2. 计算机平面设计专业文化建设,凝心聚力打造“犇”文化 砥砺前行培育职业人...
  3. 2021-02-17
  4. python实现真值表
  5. 我与CSDN的2020
  6. anemometer mysql5.6_slowlog分析anemometer平台搭建
  7. 【性能测试】一份完整的性能测试报告模板
  8. 服务器迁移到阿里云的解决方案
  9. UI设计规范有哪些?| 萧蕊冰
  10. 上午还在改bug,下午就被离职!年底大裁员寒潮来袭……