上海海事大学自动化专业C语言课程代码参考(第十四周)

不知道大家最近有没有被ChatGPT刷屏啊,作为一个语言模型,可以调教成你的形状…啊不对,调教成你想让它成为的样子,非常好玩。我有尝试着让它帮忙写咱的C语言作业,效果还是很不错的,可以看来看看。

目录

上机实验

6-11          统计字符出现次数

6-12          字符串逆序

6-13          字符串字母大小写转换

6-14          矩阵各行元素之和

6-15          阵运算

6-16          找鞍点

6-17          期末分数排序

6-18          选择法排序

6-19           找出不是两个数组共有的元素

6-20          打印杨辉三角

结语


上机实验

6-11          统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。

输出格式:

在一行中输出给定字符在给定字符串中出现的次数。

输入样例:

programming is More fun!

m

输出样例:

2

很简单的题目,遍历字符串即可。这种题目丢给ChatGPT做会怎么样呢?我们试试:

 结果非常的有趣,它完美地输出了这一个程序,并且使用了 string.h 内的函数 gets() !既然出现了gets()那我们就说说吧。这个函数输入一个char指针,即字符串头指针。函数会在输入缓冲区读一条字符串,存入这个指针的位置。详细的说明可以看这里。

直接回复没有缩进,看着难受,但是没关系,现在很多功能强大的IDE都能帮我们完成代码格式化。我们测试无误之后就能将这一段代码当作我们的作业了(

#include <stdio.h>
#include <string.h>int main()
{char a[100], b;int i, sum = 0;gets(a);scanf("%c", &b);for (i = 0; i < strlen(a); i++){if (a[i] == b)sum++;}printf("%d\n", sum);return 0;
}

好!很有精神!

6-12          字符串逆序

本题要求编写程序,输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

在一行中输出逆序后的字符串。

输入样例:

Hello World!

输出样例:

!dlroW olleH

也是很简单,只需要找到字符串的结尾就行了。同样的,我们再拿ChatGPT来试试:

#include <stdio.h>
#include <string.h>int main()
{char a[100];int i;gets(a);for (i = strlen(a) - 1; i >= 0; i--)printf("%c", a[i]);return 0;
}

可以看到,在这一段程序中,出现了另一个函数 strlen() 。这个函数是读取字符串长度。为防止混淆,在这里说一下strlen和sizeof的区别。

sizeof返回的是整个堆的长度,也就是已分配内存的长度。在这个例子内,sizeof(a)返回的值为100;而strlen计算的是从开始到字符串结束,也就是到‘\0’的长度。所以它们两个的返回值并不一样。

了解了strlen之后,我们很容易就明白,程序是倒序的单个字符打印。

6-13          字符串字母大小写转换

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入格式:

输入为一个以“#”结束的字符串(不超过50个字符)。

输出格式:

在一行中输出大小写转换后的结果字符串。

输入样例:

Hello World! 123#

输出样例:

hELLO wORLD! 123

这一题也是非常简单。在看到题目之后直接就能注意到,大写字母和小写字母的ASCII码的范围并不一样,并且遵循某种转化关系。只需要判断字符的大小,并计算即可。这部分的代码如下:

#include <stdio.h>
#include <string.h>int main()
{char a[100];int i;gets(a);for (i = 0; i < strlen(a) && a[i] != '#'; i++){if (a[i] >= 'a' && a[i] <= 'z')printf("%c", a[i] - 32);else if (a[i] >= 'A' && a[i] <= 'Z')printf("%c", a[i] + 32);elseprintf("%c", a[i]);}return 0;
}

但是,有没有更简单的方法呢?当然有!ChatGPT给出了这样的方法:

#include <stdio.h>
#include <string.h>
#include <ctype.h>int main()
{char a[100];int i;gets(a);for (i = 0; i < strlen(a) && a[i] != '#'; i++){if (isupper(a[i]))printf("%c", tolower(a[i]));else if (islower(a[i]))printf("%c", toupper(a[i]));elseprintf("%c", a[i]);}return 0;
}

可以注意到,这里多用了一个头文件<ctype.h>。尖括号表示这是C语言标准头文件,也就是正常的编译器都会自带的头文件。

这里有两对、四个新的函数"isupper" "tolower" "islower" "toupper"。

这四个函数的意思就和字面上一样,判断是否为大写字母、将大写字母转换成小写字母、判断是否为小写字母、将小写字母转换为大写字母。可以看到,用了这个函数能稍微简化一点点开始我们所写的代码。

6-14          矩阵各行元素之和

本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

输入格式:

输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。

输出格式:

每行输出对应矩阵行元素之和。

输入样例:

3 2

6 3

1 -8

3 12

输出样例:

9

-7

15

这题也是并不复杂。首先将头两位数字保存,作为后续循环的循环次数;然后开始循环,每次循环只读一位,读完缓冲区为止。

代码如下:

#include <stdio.h>int main()
{int m, n, i, j, a[10][10], sum;scanf("%d%d", &m, &n);for (i = 0; i < m; i++){sum = 0;for (j = 0; j < n; j++){scanf("%d", &a[i][j]);sum = sum + a[i][j];}printf("%d\n", sum);}return 0;
}

6-15          阵运算

本题要求编写程序,给定一个n×n的方阵,计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

4

2 3 4 1

5 6 1 1

7 1 8 1

1 1 1 1

输出样例:

35

这一题也并不复杂,只需要遍历二维数组,再判断当前的数是否符合条件即可。代码如下:

#include <stdio.h>int main()
{int a[11][11], n, i, j, sum = 0;scanf("%d", &n);for (i = 1; i <= n; i++)//录入部分for (j = 1; j <= n; j++)scanf("%d", &a[i][j]);for (i = 1; i <= n; i++)//计算部分for (j = 1; j <= n; j++){if (i != n && j != n && j != n - i + 1)sum += a[i][j];}printf("%d", sum);return 0;
}

6-16          找鞍点

本题要求编写程序,求一个给定的n阶方阵的鞍点。一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

输入格式:

输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

输出在一行中按照“行下标列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4

1 7 4 1

4 8 3 6

1 6 1 2

0 7 8 9

输出样例1:

2 1

输入样例2:

2

1 7

4 1

输出样例2:

NONE

这题的重点在于,如何固定二维数组的某一位而遍历另一位。一种实现方法如下:

#include <stdio.h>int main()
{int a[10][10], n, i, j, max, k, flag = 0;scanf("%d", &n);for (i = 0; i < n; i++)//数据录入for (j = 0; j < n; j++)scanf("%d", &a[i][j]);for (i = 0; i < n; i++){max = a[i][0];k = 0;for (j = 1; j < n; j++)if (a[i][j] > max){max = a[i][j];k = j;}for (j = 0; j < n; j++)if (a[j][k] < max)break;if (j == n){printf("%d %d", i, k);flag = 1;break;}}if (flag == 0)printf("NONE");return 0;
}

6-17          期末分数排序

本题要求编写程序,考试结束了,全班同学的分数都出来了。老师需要对分数做一次排序,看看从高到低,分数的排列是怎样的。

输入格式:

第一行是一个n,表示班级同学的人数,1<=n<=5000。第二行开始有n个分数,0<=分数<=100,分数都是整数,没有零点五分。

输出格式:

输出排序后的分数,按照从大到小排列,相同的分数排在一起,每两个分数之间间隔一个空格。

输入样例:

10

0 60 73 60 82 90 100 18 55 84

输出样例:

100 90 84 82 73 60 60 55 18 0

这题我们可以用冒泡排序。冒泡排序老师上课有讲过,咱便不再赘述了。直接看代码吧:

#include <stdio.h>#define SWAP(a, b)    \{                 \int temp = a; \a = b;        \b = temp;     \}int main()
{int a[5000], n, i, j;scanf("%d", &n);for (i = 1; i <= n; i++)scanf("%d", &a[i]);
//****************************************************冒泡排序本体for (i = 1; i <= n; i++)for (j = 1; j <= n - i; j++)if (a[j] < a[j + 1])SWAP(a[j], a[j + 1]);
//****************************************************for (i = 1; i <= n; i++)printf("%d%c", a[i], i == n ? '\n' : ' ');return 0;
}

可以看到这里有几行我们不曾见过的写法,我们来看看。

首先是第三行的define定义函数。这种写法的好处是,它可以直接完成一种类似函数的效果,但是却能调用外面一级函数内的局部变量。或者说,在C语言中,使用#define定义的宏是不占用内存空间的。在使用#define定义宏时,编译器会把宏展开为该宏定义的内容,但不会为宏开辟内存空间。例如:

#define SWAP(a,b) {int temp=a;a=b;b=temp;}

这个宏定义的作用是实现两个变量的交换,但在程序运行时,并不会为宏开辟内存空间。

那么如何完成多行的宏定义呢?很简单,在行尾加 '\' 即可。于是,就有了我们代码的3~8行。

这种实现过程不用宏定义则需要借助指针。例如:

void swap(int *a, int *b)
{int temp = *a;*a = *b;*b = temp;
}

上面的swap函数也实现了两个变量的交换,在函数被调用时,编译器会为该函数开辟内存空间,在该函数运行时,系统会把函数所需的参数和变量放到这段内存中,运行完后再释放掉。

6-18          选择法排序

本题要求编写程序,将给定的n个整数从大到小排序后输出。

输入格式:

输入第一行给出一个不超过100的正整数n。第二行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

4

5 1 7 6

输出样例:

7 6 5 1

选择排序也是讲过的,我们用同样的办法swap就可以了:

#include <stdio.h>#define SWAP(a, b)    \{                 \int temp = a; \a = b;        \b = temp;     \}int main()
{int a[100], n, i, j, k;scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d", &a[i]);for (i = 0; i < n; i++){k = i;for (j = i; j < n; j++)if (a[j] > a[k])k = j;//找出最大的SWAP(a[i], a[k]);}for (i = 0; i < n; i++)printf("%d%c", a[i], i == n ? '\n' : ' ');return 0;
}

6-19           找出不是两个数组共有的元素

本题要求编写程序,给定两个整型数组,找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100

11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1

这一题很简单,嵌套一次循环即可。示例的代码如下:

#include <stdio.h>int main()
{int a[25], b[25], n, m, i, j, flag;scanf("%d", &n);for (i = 0; i < n; i++)scanf("%d", &a[i]);scanf("%d", &m);for (i = 0; i < m; i++)scanf("%d", &b[i]);for (i = 0; i < n; i++){flag = 1;for (j = 0; j < m; j++)if (a[i] == b[j]){flag = 0;break;}if (flag)printf("%d ", a[i]);}return 0;
}

6-20          打印杨辉三角

本题要求编写程序,按照规定格式打印前n行杨辉三角。

输入格式:

输入在一行中给出n(1≤n≤10)。

输出格式:

以正三角形的格式输出前n行杨辉三角。每个数字占固定4位。

输入样例:

6

输出样例:

          1

        1   1

      1   2   1

    1   3   3   1

  1   4   6   4   1

1   5  10  10   5   1

我们是不是写过这道题……?好像是写过的,不过不太想找了。我们现在用二维数组来写。代码如下:

#include <stdio.h>int main()
{int n, a[10][10];scanf("%d", &n);a[0][0] = 1;for (int i = 1; i < n; i++){a[i][0] = 1;for (int j = 1; j < i; j++){a[i][j] = a[i - 1][j] + a[i - 1][j - 1];}a[i][i] = 1;}for (int i = 0; i < n; i++){for (int k = 0; k < n - i - 1; k++){printf("  ");}for (int j = 0; j <= i; j++){printf("%4d", a[i][j]);}printf("\n");}return 0;
}

结语

不知道你有没有发现,这次的代码风格和以往的有很大不同。这是为什么呢?

因为基本全部代码均由ChatGPT生成,我只做了一点点修改,欸嘿。

不知道你怎么看待这种情况,那么,下周见

(不知道这种算不算原创,如有侵权请联系删除

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

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

相关文章

GitHub Copilot骚操作:“清洗”代码,规避侵权

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国…

关于推动可追溯代码来源的计划

关于推动可追溯代码来源的计划 缘由 在互联网上&#xff0c;很多技术博客和文章引入代码段来帮助读者理解技术思路或记录对某个大型模块的原理分析和理解。然而&#xff0c;由于版本管理和技术变化&#xff0c;很多历史文章在读者读到精髓时&#xff0c;发现引入的代码块没有来…

springboot+vue实现ChatGPT逐字输出打字效果

文章目录 前言一、效果二、Springboot后端1.封装请求OpenAI接口的客户端2.对话处理3.对话请求接口 二.Vue前端 前言 在调用OpenAI GPT接口时&#xff0c;如果不使用流式&#xff08;stream:true&#xff09;参数&#xff0c;接口会等待所有数据生成完成后一次返回。这个等待时…

分享收集的ChatGPT专题学习资料~

Datawhale分享 作者&#xff1a;Coggle数据科学 ChatGPT是未来的技术趋势&#xff0c;也拥有非常多的干货的分享&#xff0c;如解析ChatGPT的原理&#xff0c;或者ChatGPT使用指南。 本文将分享整理的干货学习资料&#xff0c;和最新的学习活动。领取方式见文末。 专题学习资料…

关于GPT4.0和6款AI工具

下面6个非常实用的AI工具强烈推荐给大家 1.ChatGPT: 上线两个月&#xff0c;用户数量达到1亿&#xff0c;ChatGPT不但能够写文案&#xff0c;剧本&#xff0c;企划等多种任务&#xff0c;还具有编写和调试计算机程序的能力等诸多功能&#xff0c;它具有3.5,4.0两个版本供账户使…

记录一次使用 Ubuntu 编译 Wakaama 踩坑过程

1. 背景 公司项目需要使用 LwM2M 协议&#xff0c;由于是个相对冷门的小众协议&#xff0c;客户端模拟器几乎没有&#xff0c;只有 Eclipse Wakaama 相对来说功能齐全、易用&#xff0c;但是这个软件没有编译好的程序包&#xff0c;只能从 Github 拉取源码手动编译运行。 不知道…

【人工智能】科大讯飞API接口调用(第一集)

前言 这学期有一门人工智能教育课程&#xff0c;恰巧又有这么一个实践&#xff0c;要求进行人工智能接口调用 于是首选了科大讯飞&#xff0c;下面是详细过程记录 科大讯飞接口调用 以下是流程以及实现细节描述 调用流程 第一步 来到科大讯飞开放平台 http://www.xfyun.…

14个适用于Eclipse IDE的有用(免费)插件

在线Eclipse市场上有1,667个可用的插件和解决方案&#xff01; 在您阅读本文时&#xff0c;可能还有更多。 如果您在官方市场之外冒险&#xff0c;您会发现数百种其他开发的插件都可以与Eclipse IDE兼容。 听起来像是经典的第一世界问题。 太多的插件可供选择。 您将永远不需要…

问答系统(QA)调研

引言 智能问答系统广泛用于回答人们以自然语言形式提出的问题&#xff0c;经典应用场景包括&#xff1a;智能语音交互、在线客服、知识获取、情感类聊天等。根据QA任务&#xff0c;可以将QA大致分为5大类&#xff0c;分别为&#xff1a; 文本问答&#xff08;text-based QA&am…

ChatGPT与码农的机会

之前博客中已经写了很多有关AI在博客编写方面的优势与对未来博客的编写方面的思考。这篇文档我继续分享我在开发中的一个案例和相关的感想。 事件还原 我发现ChatGPT也可以帮助我编写OData&#xff0c;于是我也利用GPT帮助我编程。 OData如何将filter与apply字段联合使用&am…

ChatGPT:竟然精通ENVI IDL、ArcGIS等软件!

目录 01 使用途径 02 使用 01 使用途径 我试了很多网站&#xff0c;包括注册登录、插件、镜像网站&#xff0c;微信机器人&#xff0c;QQ机器人&#xff0c;但是目前这些或多或少都由于OpenAI的限制无法正常使用。所以总的来说需要科学上网并且需要国外手机号&#xff0c;这有…

matplotlib——1. 常用功能汇总

文章目录 1.IDE里的1.1 显示模式&#xff08;plt.ion()和plt.ioff()&#xff09;1.2 backend说明 2. jupyter里的&#xff08;主要是和iwidgets组件结合交互式&#xff09;3 通用的3.0 根据颜色名称获取对应rgb值&#xff08;0~255&#xff09;3.1 cmap3.1.1 cmap绘制CMYK四个通…

大模型综述来了!一文带你理清全球AI巨头的大模型进化史

夕小瑶科技说 原创 作者 | 小戏&#xff0c;Python 如果自己是一个大模型的小白&#xff0c;第一眼看到 GPT、PaLm、LLaMA 这些单词的怪异组合会作何感想&#xff1f;假如再往深里入门&#xff0c;又看到 BERT、BART、RoBERTa、ELMo 这些奇奇怪怪的词一个接一个蹦出来&#x…

Maven依赖传递失效问题解决

Maven依赖传递失效问题解决 背景介绍问题描述解决方式 记一次非常规问题解决: maven依赖传递关联(传递)失效 背景介绍 首先maven工程结构大致是这样 (注意maven仓库 是本地仓库-公司中央仓库-远程仓库, 可能对理解遇到的问题原因和为何那样解决有些帮助): <groupId>com…

利用chatGPT搭配plantUML生成UML图

是不是感觉自己画uml图繁琐复杂没思路&#xff0c;画出来的uml图太简单&#xff1f;那就快来试试利用chatGPT搭配plantUML生成UML图&#xff0c;一键生成&#xff0c;自己调试解放双手&#xff0c;开拓思维&#xff0c;快来试试吧&#xff01; 在chatGPT中生成plantUML代码 如果…

谷歌发文批评苹果:实在是 “拖大家后腿”

1992 年 12 月 3 日&#xff0c;世界上第一条 SMS 消息成功发送&#xff0c;如今已经过去 30 周年。在这个关键节点&#xff0c;谷歌再度发文赞美 RCS 短信标准&#xff0c;并批评苹果迟迟不采用该标。 RCS 全称 Rich Communication Suite - 富媒体通信标准&#xff0c;属于高…

库克「豪赌」MR:七年磨一剑,不行也得行

苹果MR是一款在重重阻力之下、由库克强行拍板推向市场的产品。 作者&#xff1a;常嘉帅 “你们看懂了吗&#xff08;Are you getting it&#xff09;?”乔布斯这样问&#xff0c;“一台音乐播放器&#xff0c;一部手机&#xff0c;和一部互联网通讯设备。” 乔布斯以他魅力十足…

我问了10个博客专家好友,原来他们都在用这些高效率软件

大家好&#xff0c;我是记得诚。 在CSDN上我认识了很多大佬级别的博客专家&#xff0c;最近询问了我的10个博客专家好友&#xff0c;向他们取经&#xff0c;扒出了他们珍藏的高效率软件&#xff0c;很多软件我用完之后&#xff0c;当场发出了OMG的尖叫&#xff0c;我重度使用了…

何同学采访苹果CEO库克上热搜,网友表示自愧不如

昨日&#xff0c;22岁B站知名UP主“老师好我叫何同学”采访了苹果CEO蒂姆-库克&#xff0c;登上微博热搜榜&#xff0c;引起了网友们的热议。 何同学是北京邮电大学学霸&#xff0c;22岁的大学生&#xff0c;出于兴趣的原因在B站注册账号发布数码产品的测评视频&#xff0c;他做…

“AI教父”李开复筹办新公司,掘金 AI 2.0 三个大方向

图片&#xff1a;由无界AI画图工具生成 3月19日&#xff0c;创新工场董事长兼CEO李开复在朋友圈宣布&#xff0c;正在筹组一个名为“Project Al 2.0”的新公司&#xff0c;一个旨在探索AI2.0的创新项目。 图片&#xff1a;李开复在朋友圈紧急“摇人”PK chatGPT 目前&#xff0…