实验五 C语言指针应用编程

news/2024/12/2 20:46:18/文章来源:https://www.cnblogs.com/cuo-ren/p/18582680

实验五 C语言指针应用编程

实验任务1——数组求最大最小值

#include <stdio.h>
#define N 5
void input(int x[], int n);
void output(int x[], int n);
void find_min_max(int x[], int n, int* pmin, int* pmax);
int main() {int a[N];int min, max;printf("录入%d个数据:\n", N);input(a, N);printf("数据是: \n");output(a, N);printf("数据处理...\n");find_min_max(a, N, &min, &max);printf("输出结果:\n");printf("min = %d, max = %d\n", min, max);return 0;
}
void input(int x[], int n) {int i;for (i = 0; i < n; ++i)scanf("%d", &x[i]);
}
void output(int x[], int n) {int i;for (i = 0; i < n; ++i)printf("%d ", x[i]);printf("\n");
}
void find_min_max(int x[], int n, int* pmin, int* pmax) {int i;*pmin = *pmax = x[0];for (i = 0; i < n; ++i)if (x[i] < *pmin)*pmin = x[i];else if (x[i] > *pmax)*pmax = x[i];
}
1-1


#include <stdio.h>
#define N 5
void input(int x[], int n);
void output(int x[], int n);
int* find_max(int x[], int n);
int main() {int a[N];int* pmax;printf("录入%d个数据:\n", N);input(a, N);printf("数据是: \n");output(a, N);printf("数据处理...\n");pmax = find_max(a, N);printf("输出结果:\n");printf("max = %d\n", *pmax);return 0;
}
void input(int x[], int n) {int i;for (i = 0; i < n; ++i)scanf("%d", &x[i]);
}
void output(int x[], int n) {int i;for (i = 0; i < n; ++i)printf("%d ", x[i]);printf("\n");
}
int* find_max(int x[], int n) {int max_index = 0;int i;for (i = 0; i < n; ++i)if (x[i] > x[max_index])max_index = i;return &x[max_index];
}
1-2


问题1 函数find_max 的功能是(返回的是什么)?

寻找a数组中的最大值,并返回它的地址。

问题2 把函数find_max 的实现写成以下代码,可以吗?如果不可以,请给出你的理由

int *find_max(int x[], int n) {int *ptr = &x[0];int i;for(i = 0; i < n; ++i)if(x[i] > *ptr)ptr = &x[i];return ptr;}

可以。

实验任务2——字符串处理

#include <stdio.h>
#include <string.h>
#define N 80
int main() {char s1[N] = "Learning makes me happy";char s2[N] = "Learning makes me sleepy";char tmp[N];printf("sizeof(s1) vs. strlen(s1): \n");printf("sizeof(s1) = %d\n", sizeof(s1));printf("strlen(s1) = %d\n", strlen(s1));printf("\nbefore swap: \n");printf("s1: %s\n", s1);printf("s2: %s\n", s2);printf("\nswapping...\n");strcpy(tmp, s1);strcpy(s1, s2);strcpy(s2, tmp);printf("\nafter swap: \n");printf("s1: %s\n", s1);printf("s2: %s\n", s2);return 0;
}
2-1


问题1 数组s1的大小是多少?sizeof(s1)计算的是什么?strlen(s1)统计的是什么?

sizeof(s1)计算的是s1的大小,即s1所占用的字节数。strlen(s1)统计的是s1中字符串的长度,即s1中字符的个数。

问题2 line7代码,能否替换成以下写法?如果不能,写出原因。

char s1[N];
s1 = "Learning makes me happy";

不能。因为s1是一个指针常量,它指向的内存空间是只读的,不能被修改。

#include <stdio.h>
#include <string.h>
#define N 80
int main() {char* s1 = "Learning makes me happy";char* s2 = "Learning makes me sleepy";char* tmp;printf("sizeof(s1) vs. strlen(s1): \n");printf("sizeof(s1) = %d\n", sizeof(s1));printf("strlen(s1) = %d\n", strlen(s1));printf("\nbefore swap: \n");printf("s1: %s\n", s1);printf("s2: %s\n", s2);printf("\nswapping...\n");tmp = s1;s1 = s2;s2 = tmp;printf("\nafter swap: \n");printf("s1: %s\n", s1);printf("s2: %s\n", s2);return 0;
}
2-2


问题1 指针变量s1中存放的是什么?sizeof(s1)计算的是什么?strlen(s1)统计的是什么?

s1中存放的是字符串的起始地址。sizeof(s1)计算的是s1所占用的字节数。strlen(s1)统计的是s1指向的字符串的长度。

问题2 line6代码能否替换成下面的写法?对比task2_1.c中的line6, 用文字说明二者的语义区别。

char *s1;
s1 = "Learning makes me happy";

可以。原代码声明时直接初始化指针,改动后则是先声明,后将字符串的地址赋值,效果等同。

问题3 :line19-line21,交换的是什么?字符串常量"Learning makes me happy"和字符串常量"Learning makes me sleepy"在内存中有没有交换?

交换的是s1 s2中的地址。没有。

实验任务3——指针数组与行指针

#include <stdio.h>
int main() {int x[2][4] = { {1, 9, 8, 4}, {2, 0, 4, 9} };int i, j;int* ptr1;     // 指针变量,存放int类型数据的地址int(*ptr2)[4]; // 指针变量,指向包含4个int元素的一维数组printf("输出1: 使用数组名、下标直接访问二维数组元素\n");for (i = 0; i < 2; ++i) {for (j = 0; j < 4; ++j)printf("%d ", x[i][j]);printf("\n");}printf("\n输出2: 使用指针变量ptr1(指向元素)间接访问\n");for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 8; ++ptr1, ++i) {printf("%d ", *ptr1);if ((i + 1) % 4 == 0)printf("\n");}printf("\n输出3: 使用指针变量ptr2(指向一维数组)间接访问\n");for (ptr2 = x; ptr2 < x + 2; ++ptr2) {for (j = 0; j < 4; ++j)printf("%d ", *(*ptr2 + j));printf("\n");}return 0;
}
3-1


问题1 int (*ptr)[4];中,标识符ptr表示的语义是什么?

ptr是一个指向包含4个int元素的一维数组的指针变量。

问题2 int *ptr[4];中,标识符ptr表示的语义是什么?

ptr是一个包含4个int类型指针的数组。

实验任务4——字符替换

#include <stdio.h>
#define N 80
void replace(char* str, char old_char, char new_char); // 函数声明
int main() {char text[N] = "Programming is difficult or not, it is a question.";printf("原始文本: \n");printf("%s\n", text);replace(text, 'i', '*'); // 函数调用 注意字符形参写法,单引号不能少printf("处理后文本: \n");printf("%s\n", text);return 0;
}
// 函数定义
void replace(char* str, char old_char, char new_char) {int i;while (*str) {if (*str == old_char)*str = new_char;str++;}
}
4-1


问题1 函数replace的功能是?

把字符串str中出现的字符old_char替换成字符new_char

问题2 line24, 圆括号里循环条件可以写成*str != '\0'吗?

可以。

实验任务5——字符串截断

#include <stdio.h>
#define N 80
char* str_trunc(char* str, char x);
int main() {char str[N];char ch;while (printf("输入字符串: "), gets(str) != NULL) {printf("输入一个字符: ");ch = getchar();printf("截断处理...\n");str_trunc(str, ch);         // 函数调用printf("截断处理后的字符串: %s\n\n", str);getchar();}return 0;
}
// 函数str_trunc定义
// 功能: 对字符串作截断处理,把指定字符自第一次出现及其后的字符全部删除, 并返回字符串地址
// 待补足...// xxx
char* str_trunc(char* str, char x) {while (*str) {if (*str == x) {*str = 0;break;}str++;}return str;
}
5-1


问题1 去掉main函数line18getchar();,重新编译、运行,此时多组输入时,结果有什么不同?line18在这里起到的作用是什么?

会导致字符串变为换行符。吸收缓冲区残留的换行符。

实验任务6——身份证号码校验

#include <stdio.h>
#include <string.h>
#define N 5
int check_id(char* str); // 函数声明
int main()
{char* pid[N] = {"31010120000721656X","3301061996X0203301","53010220051126571","510104199211197977","53010220051126133Y"};int i;for (i = 0; i < N; ++i)if (check_id(pid[i])) // 函数调用printf("%s\tTrue\n", pid[i]);elseprintf("%s\tFalse\n", pid[i]);return 0;
}
// 函数定义
// 功能: 检查指针str指向的身份证号码串形式上是否合法
// 形式合法,返回1,否则,返回0
int check_id(char* str) {// 补足函数实现// ...int count = 0;while (*str) {count++;if (*str < 48 || *str > 57) {if (*str != 'X' || count != 18) {return 0;}}str++;}if (count != 18) {return 0;}return 1;
}
6-1


实验任务7——字符串编码与解码

#include <stdio.h>
#define N 80
void encoder(char* str, int n); // 函数声明
void decoder(char* str, int n); // 函数声明int main() {char words[N];int n;printf("输入英文文本: ");gets(words);printf("输入n: ");scanf("%d", &n);printf("编码后的英文文本: ");encoder(words, n);      // 函数调用printf("%s\n", words);printf("对编码后的英文文本解码: ");decoder(words, n); // 函数调用printf("%s\n", words);return 0;
}/*函数定义
功能:对s指向的字符串进行编码处理
编码规则:
对于a~z或A~Z之间的字母字符,用其后第n个字符替换; 其它非字母字符,保持不变
*/
void encoder(char* str, int n) {// 补足函数实现// ×××while (*str) {if (*str >= 'A' && *str <= 'Z') {*str = (*str - 'A' + n % 26 + 26) % 26 + 'A';}else if (*str >= 'a' && *str <= 'z') {*str = (*str - 'a' + n % 26 + 26) % 26 + 'a';}str++;}
}/*函数定义
功能:对s指向的字符串进行解码处理
解码规则:
对于a~z或A~Z之间的字母字符,用其前面第n个字符替换; 其它非字母字符,保持不变
*/
void decoder(char* str, int n) {// 补足函数实现// ×××while (*str) {if (*str >= 'A' && *str <= 'Z') {*str = (*str - 'A' + 26 - n % 26) % 26 + 'A';}else if (*str >= 'a' && *str <= 'z') {*str = (*str - 'a' + 26 - n % 26) % 26 + 'a';}str++;}
}
7-1


实验任务8——命令行参数

#include <stdio.h>int main(int argc, char* argv[]) {int i;for (i = 1; i < argc; ++i)printf("hello, %s\n", argv[i]);return 0;
}
8-1


#include <stdio.h>int main(int argc, char* argv[]) {int flag;char* temp;for (int i = 0; i < argc - 1; i++) {flag = 1;for (int j = 0; j < argc - i - 1; j++) {if (strcmp(argv[j], argv[j + 1]) > 0) {temp = argv[j]; argv[j] = argv[j + 1]; argv[j + 1] = temp;}flag = 0;}if (flag) {break;}}for (int i = 1; i < argc; ++i)printf("hello, %s\n", argv[i]);return 0;
}
8-2


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/845620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备系统依赖项Microsoft C++ 构建工具WebView2 (Windows10 v1803 以上版本不用下载,已经默认安装了)下载安装 Rust 下载安装 Rust 需要重启终端或者系统重新打开cmd,键入rustc --version,出现 rust 版本号,说明安装成功 2.开始 #npm npm create…

【windows工作合集】 远程连接出现问题记录

问题记录:由于需求要登录本地windows的虚拟机 但是在输入用户信息/密码都正确的情况下出现上面截图的问题 于是就百度进行查阅解决--主要就是说我这边机器可能是因为系统更新或者一些注册表的问题导致信息对不上,所以被认为无法登录 (系统更新。微软系统补丁的更新将 CredSSP…

AGC032 VP记录

A 17:35 +0 B 39:51 +0 C 80:28 +4 A.Limited Insertion 简要题面: 最初有一个空序列,每次操作选定一个 \(i\) 并把 \(i\) 插入到位置 \(i\) ,给定最终序列,构造一种合法方案或者输出 -1 。 \(n \leq 100\) 做法: 简单思考发现每次操作出来的数一定从后往前对应了最终序列…

高级语言程序设计第十次作业

代码写的最长的一题,写了十五分钟,数据类型还写错了使用ftell与fseek的组合来计算字节数,跟上面的一题类似这题因为我没创建相关的文件所以输出是这样,但是创建了之后是可以成功写入的可以将输入内容复制通过c语言程序这个也是复制的一个用法同样通过ftell与fseek来计算字节…

H5-15 H5里面的CSS

1、CSS 简介使用CSS的目的就是让网页具有美观一致的页面 2、CSS概念CSS (Cascading Style Sheets)层叠样式表,又叫级联样式表,简称样式表CSS文件后缀名为 .cssCSS用于HTML文档中元素样式的定义 3、为什么需要CSS使用css的目的就是让网页具有美观一致的页面 4、语法CSS规则由…

实验5 继承和多态

实验任务三 源码1 #pragma once2 #include<iostream>3 #include<string>4 5 using std::string;6 using std::cout;7 using std::endl;8 9 //电子宠物类 10 class MachinePets { 11 private: 12 string nickname; 13 public: 14 MachinePets(const string&…

idea创建web项目并连接数据库

1.在idea中连接数据库在连接的数据库中,可以写SQL语句,创建数据库、表等。 2.我的项目结构---学生请假系统Dao层:写一个学生实体类 Servlet层:业务层具体的怎么实现相关操作 1)最开始加上这个之后就不用配置映射文件了 2)然后是这个就不用另外的建立连接了 3)在resouces…

chrome 替换network中的返回内容,用以跨步调试

在开发调试中,有时候,某个接口,或者文件返回内容有问题,但线上的文件没问题。这时候就可以通过更改network中返回内容来实现跨步调试了。 test.html<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta n…

天梯赛 L2-004 这是二叉搜索树吗? 数据结构

反思:使用指针前先分配内存。#include<bits/stdc++.h> using namespace std; typedef struct node {int data;struct node* left;struct node* right; }*T; queue<int>q1; queue<int>q2; queue<int>q3; T result; void built1(T &t,int x) {if(t=…

Qt nativeEvent 不触发/不执行/无效

在做触摸屏项目的时候,各种控件都需要实现监听/触发点击事件,通常是通过信号/槽、事件过滤器(eventFilter)、重写mousePressEvent。 发现在QSpinBox中点击编辑框时不会触发任何鼠标相关点击事件。查资料发现通过重写nativeEvent函数可以拿到鼠标相关事件,不过有一个坑需要注…

testnet 资产管理系统 侦察|扫描|信息收集|网络空间搜索

TestNet简介 TestNet资产管理系统旨在提供全面、高效的互联网资产管理与监控服务,构建详细的资产信息库。 该系统能够帮助企业安全团队或渗透测试人员对目标资产进行深入侦察和分析,提供攻击者视角的持续风险监测,协助用户实时掌握资产动态,识别并修复安全漏洞,从而有效收…

记录---前端实现画中画超简单,让网页飞出浏览器

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣Document Picture-in-Picture 介绍今天,我来介绍一个非常酷的前端功能:文档画中画 (Document Picture-in-Picture, 本文简称 PiP)。你有没有想过,网页上的任何内容能悬浮在桌面上?😏 🎬 视频流媒体的画中画功能你…