【杂记】之语法学习第四课手写函数与结构体

函数

如同我们数学中学的 f(x) = ax + b ,函数就是把一个东西丢进去,然后进行类似的操作变化,最终得到的可以是一个数,也可能什么都得不到而只是进行一项操作。

sqrt()max()swap() 这样的其实都是函数,我们写的 int main() 其实也是函数,名为 主函数 。这里主要讲的是手写函数。

题目描述

给出平面坐标上不在一条直线上三个点坐标 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) (x_1,y_1),(x_2,y_2),(x_3,y_3) (x1,y1),(x2,y2),(x3,y3),坐标值是实数,且绝对值不超过 100.00,求围成的三角形周长。保留两位小数。

对于平面上的两个点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2),则这两个点之间的距离 d i s = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 dis=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} dis=(x2x1)2+(y2y1)2

输入格式

输入三行,第 i i i 行表示坐标 ( x i , y i ) (x_i,y_i) (xi,yi),以一个空格隔开。

输出格式

输出一个两位小数,表示由这三个坐标围成的三角形的周长。

样例输入
0 0
0 3
4 0
样例输出
12.00
数据范围

数据保证,坐标均为实数且绝对值不超过 100 100 100,小数点后最多仅有 3 3 3 位。

直接写出来的话就是:

#include<bits/stdc++.h>
using namespace std;
int main()
{double x1 , y1 , x2 , y2 , x3 , y3 , ans = 0 ;scanf("%lf%lf%lf%lf%lf%lf" ,&x1 ,&y1 ,&x2 ,&y2 ,&x3 ,&y3) ;ans += sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) ; ans += sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2)) ;ans += sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1)) ;printf("%.2lf" ,ans) ;return 0 ;
}

看起来非常丑陋,但是我们可以通过手写函数的方法来解决代码操作重复的问题。

#include<bits/stdc++.h>
using namespace std;
double dis(double a1 ,double b1 ,double a2 ,double b2)
{return sqrt((a2 - a1) * (a2 - a1) + (b2 - b1) * (b2 - b1)) ;
}
int main()
{double x1 , y1 , x2 , y2 , x3 , y3 , ans = 0 ;scanf("%lf%lf%lf%lf%lf%lf" ,&x1 ,&y1 ,&x2 ,&y2 ,&x3 ,&y3) ;ans += dis(x2 ,y2 ,x1 ,y1) ;ans += dis(x3 ,y3 ,x2 ,y2) ;ans += dis(x3 ,y3 ,x1 ,y1) ;printf("%.2lf" ,ans) ;return 0 ;
}

这样是不是就简短多了,类比我们的 f(x) = ax + b ,那么此时的 f(1) 是不是就等价于 a + b 了,同理当我们定义 dis

double dis(double a1 ,double b1 ,double a2 ,double b2)
{return sqrt((a2 - a1) * (a2 - a1) + (b2 - b1) * (b2 - b1)) ;
}

时,dis(x2 ,y2 ,x1 ,y1) ; 就等价于 sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) ,相当于把 x2 ,y2 ,x1 ,y1 代入到了这个函数里,得到其中return 的结果,此时我们用 double 声明这个函数,因此返还的结果为 浮点型 ,若使用 int 声明函数,则返回值为 整形

题目描述

输入 n n n 个不大于 1 0 5 10^5 105 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。

输入格式

第一行输入一个正整数 n n n,表示整数个数。

第二行输入 n n n 个正整数 a i a_i ai,以空格隔开。

输出格式

输出一行,依次输出 a i a_i ai 中剩余的质数,以空格隔开。

样例输入
5
3 4 5 6 7
样例输出
3 5 7
数据范围

数据保证, 1 ≤ n ≤ 100 1\le n\le100 1n100 1 ≤ a i ≤ 1 0 5 1 \leq a_i \leq 10^5 1ai105

#include<bits/stdc++.h>
using namespace std;
bool panduan(int x)
{if(x == 1) return 0 ;//对1进行特判 for(int i = 2 ; i <= sqrt(x) ; i ++)if(x % i == 0) return 0 ;//判断从2到根号x有无x的因子 return 1 ;
}
int main()
{int n , a ;scanf("%d" ,&n) ;for(int i = 1 ; i <= n ; i ++){scanf("%d" ,&a) ;if(panduan(a)) printf("%d " ,a) ;}return 0 ;
}

这里使用了 bool 型的函数, bool 在这里可以改为用 intbool 声明的变量只能存 0 0 0 1 1 1 ,可以理解为存储范围为 0 0 0 1 1 1 的一个整型,在 bool 声明的函数中 return 0 并不像主函数里那样意味着程序的结束运行,而是表示返还 0 0 0 ,这里的 0 0 0 1 1 1 改成 f a l s e false false t r u e true true 也是可以的,就像:

bool panduan(int x)
{if(x == 1) return false ;//对1进行特判 for(int i = 2 ; i <= sqrt(x) ; i ++)if(x % i == 0) return false ;//判断从2到根号x有无x的因子 return true ;
}

这里我没有搞一个数组先把 a [ i ] a[i] a[i] 存下来,而是每次读入一个 a a a 就判断是否为质数,要理解评测机的运行规则,可以把输入和输出当成两个文件,对于一组测试数据,所有的输入都放在一起,所有的输出也都放在一起,输入输出是分开的,所以一遍输入一边输出是非常可行的,最后将你的输出结果和标准答案进行对比,如果一样则结果正确。

另外一点很重要的是这里判断是否为素数时,利用 试除法 ,即对一个数 i i i 进行取余运算,若没有余数,则说明 i i i 是这个数的因数,既然有因数了,就说明不是素数。

理解为什么 试除法 是从 2 2 2 判断到 n \sqrt n n ,举例对于 16 16 16 16 = 4 \sqrt{16} = 4 16 =4 16 16 16 的因子有 1 , 2 , 4 , 8 , 16 1,2,4,8,16 1,2,4,8,16 ,既然是因子,就一定是至少需要两个数相乘(本身除外),比如你知道了 1 1 1 16 16 16 的因子,那么就可以想到另一个因子是 16 / 1 = 16 16 / 1 = 16 16/1=16 ;知道 2 2 2 16 16 16 的一个因子,就可以知道 16 / 2 = 8 16/2=8 16/2=8 16 16 16 的一个因子,不难看出,对于一个数 n n n ,它的因子总在 n \sqrt n n 成一个一个对应,还以 16 16 16 为例子就是 1 1 1 对应 16 16 16 2 2 2 对应 8 8 8 4 4 4 对应 4 4 4

这样我们在判断是否有因子的时候就可以将时间复杂度从 O ( n ) O(n) O(n) 降低到 O ( n ) O(\sqrt n) O(n ) ,大大缩短运行时间,减少 T L E TLE TLE 的出现。

bool 函数的其他用法

#include<bits/stdc++.h>
using namespace std;
int main()
{int a[10] ;for(int i = 1 ; i <= 5 ; i ++)scanf("%d" ,&a[i]) ;sort(a + 1 , a + 1 + 5) ;for(int i = 1 ; i <= 5 ; i ++)printf("%d " ,a[i]) ;return 0 ;
}

c++ 中有一个内置函数 sort ,其作用是将数组按照从小到大排序,如上格式,将数组从 a [ 1 ] a[1] a[1] a [ 5 ] a[5] a[5] 进行排序,可以写成 sort(a + 1 , a + 1 + 5) ; ,理解的话就理解为对于数组 a a a ,使用时候下标是从 0 0 0 开始的,因此想排序从 1 1 1 N N N 要写成 sort(a + 1 , a + 1 + N) ; 这样的形式。

如果希望从小到大排序,可以声明一个 b o o l bool bool 型变量:

bool mycmp(int x , int y)
{return x > y ;
}

使用时写成:

#include<bits/stdc++.h>
using namespace std;
bool mycmp(int x , int y)
{return x > y ;
}
int main()
{int a[10] ;for(int i = 1 ; i <= 5 ; i ++)scanf("%d" ,&a[i]) ;sort(a + 1 , a + 1 + 5 , mycmp) ;for(int i = 1 ; i <= 5 ; i ++)printf("%d " ,a[i]) ;return 0 ;
}

void 声明的函数

v o i d void void 声明的函数没有返回值,但还是要写 return ;

题目描述

因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 151 是回文质数。

写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000) [a,b](5a<b100,000,000)(一亿)间的所有回文质数。

输入格式

第一行输入两个正整数 a a a b b b

输出格式

输出一个回文质数的列表,一行一个。

样例输入
5 500
样例输出
5
7
11
101
131
151
181
191
313
353
373
383
提示

Hint 1: Generate the palindromes and see if they are prime.

提示 1: 找出所有的回文数再判断它们是不是质数(素数).

Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.

提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

题目翻译来自NOCOW。

USACO Training Section 1.5

产生长度为 5 5 5 的回文数:

for (d1 = 1; d1 <= 9; d1+=2) {    // 只有奇数才会是素数for (d2 = 0; d2 <= 9; d2++) {for (d3 = 0; d3 <= 9; d3++) {palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)}}}

这里分享一个洛谷 88 88 88 分的做法:

#include<bits/stdc++.h>
using namespace std;
int v[10000010] , pri[10000010] , a[20] , tot , n , m ;
void primes(int x)
{memset(v , 0 , sizeof(v)) ;//v[i]所存的数表示i的最小质因子 tot = 0 ; //记录质数的数量,对于数组来说相当于一个箭头 for(int i = 2 ; i <= x ; i ++){if(v[i] == 0)//v[i]为0说明在这之前i没有因子,即i为质数 {v[i] = i ;pri[++ tot] = i ;}for(int j = 1 ; j <= tot ; j ++){if(pri[j] > v[i] || pri[j] > x / i) break ;//如果i有比pri[j]更小的质因子或超出n的范围,则停止循环 v[i * pri[j]] = pri[j] ;//pri[j]是i * pri[j] 的最小质因子 }}return ;
}
bool huiwen(int x)
{int len = 0 ;while(x){a[++ len] = x % 10 ;x /= 10 ;}for(int i = 1 , j = len ; i < j ; i ++ , j --)if(a[i] != a[j]) return false ;return true ;
}
int main()
{scanf("%d%d" ,&n ,&m) ;primes(m) ;for(int i = 1 ; i <= tot ; i ++){if(pri[i] > m) break ;if(pri[i] >= n && huiwen(pri[i])) printf("%d\n" ,pri[i]) ;}return 0 ;
}

由于题中数据范围到 1 0 8 10^{8} 108 ,数组 v v v 也至少声明这么大,但是会导致爆空间 M L E MLE MLE ,但不开这么大则会造成运行时错误 R E RE RE

结构体

题目描述

n n n 名同学,每名同学有语文、数学、英语三科成绩,你需要按照如下规则对所有同学的成绩从高到低排序:

  1. 比较总分,高者靠前;
  2. 如果总分相同,则比较语文和数学两科的总分,高者靠前;
  3. 如果仍相同,则比较语文和数学两科的最高分,高者靠前;
  4. 如果仍相同,则二人并列。

你需要输出每位同学的排名,如遇 x x x 人并列,则他们排名相同,并留空后面的 x − 1 x - 1 x1 个名次。例如,有 3 3 3 名同学并列第 1 1 1,则后一名同学自动成为第 4 4 4 名。

输入格式

第一行一个整数 N N N,表示同学的人数。
接下来 N N N 行,每行三个非负整数 c i , m i , e i c_i, m_i, e_i ci,mi,ei 分别表示该名同学的语文、数学、英语成绩。

输出格式

输出 N N N 行,按输入同学的顺序,输出他们的排名。
注意:请不要按排名输出同学的序号,而是按同学的顺序输出他们各自的排名。

样例输入
6
140 140 150
140 149 140
148 141 140
141 148 140
145 145 139
0 0 0
样例输出
1
3
4
4
2
6
数据范围
  • 30 % 30\% 30% 的数据, N ≤ 100 N \leq 100 N100,且所有同学总分各不相同。
  • 对全部的测试数据,保证 2 ≤ N ≤ 1 0 4 2 \leq N \leq 10^4 2N104 0 ≤ c i , m i , e i ≤ 150 0 \leq c_i, m_i, e_i \leq 150 0ci,mi,ei150
#include<bits/stdc++.h>
using namespace std;
int n ;
struct stu
{int c , z , e , m , zg , cm , id , rank ;
}t[100010];
bool mycmp1(stu x , stu y)
{if(x.z != y.z) return x.z > y.z ;else if(x.cm != y.cm) return x.cm > y.cm ;else if(x.zg != y.zg) return x.zg > y.zg ;else return x.id < y.id ;
}
bool mycmp2(stu x , stu y)
{return x.id < y.id ;
}
int main()
{scanf("%d" ,&n) ;for(int i = 1 ; i <= n ; i ++){scanf("%d%d%d" ,&t[i].c ,&t[i].m ,&t[i].e) ;t[i].z = t[i].c + t[i].m + t[i].e ;t[i].cm = t[i].c + t[i].m ;t[i].zg = max(t[i].c , t[i].m) ;t[i].id = i ;}sort(t + 1 , t + 1 + n , mycmp1) ;t[1].rank = 1 ;for(int i = 2 ; i <= n ; i ++){if(t[i].z == t[i - 1].z && t[i].cm == t[i - 1].cm && t[i].zg == t[i - 1].zg)t[i].rank = t[i - 1].rank ;else t[i].rank = i ;}sort(t + 1 , t + 1 + n , mycmp2) ;for(int i = 1 ; i <= n ; i ++)printf("%d\n" ,t[i].rank) ;return 0 ;
}

类比我们用 intdouble 等声明不同类型的变量,结构体 也可理解为我们新定义了一种新的数据类型,可以用 stu 声明这个变量,其中包含了 c , z ,m ... 这样的元素,因此 结构体 的声明也可以写成:

struct stu
{int c , z , e , m , zg , cm , id , rank ;
};stu t[100010] ;

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

OA项目 python + vue3

准备工作 创建django项目 在setting.py进行数据库的配置&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: , #数据库名字USER: , #连接的数据库的用户名PASSWORD: ,HOST: 127.0.0.1,PORT: 3306,} }安装app&#xff1a; rest_framwork: 关闭csrf…

婚礼纪 9.5.57 | 解锁plus权益的全能结婚助手,一键生成结婚请柬

婚礼纪是一款结婚服务全能助手&#xff0c;深受9000万新人信赖的一站式结婚服务平台。解锁plus权益后&#xff0c;用户可以享受部分VIP会员功能。应用提供了丰富的结婚筹备工具和服务&#xff0c;包括一键生成结婚请柬、婚礼策划、婚纱摄影、婚宴预订等。婚礼纪旨在为新人提供全…

树形结构数据

树形结构数据 树形结构数据是一种基础且强大的数据结构&#xff0c;广泛应用于计算机科学和软件开发的各个领域。它模拟了自然界中树的层级关系&#xff0c;通过节点和它们之间的连接来组织数据。在本文中&#xff0c;我们将深入探讨树形结构数据的概念、特点、类型以及它们在…

洛古---越狱问题【快速幂】

今天和大家讲一个洛古的算法题&#xff0c;我觉得还是比较有含金量的&#xff0c;今天给大家分享一下 题目描述 监狱有 &#x1d45b;n个房间&#xff0c;每个房间关押一个犯人&#xff0c;有 &#x1d45a; 种宗教&#xff0c;每个犯人会信仰其中一种。如果相邻房间的犯人的宗…

【论文笔记】Parameter-Efficient Transfer Learning for NLP

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Parameter-Efficient Tran…

《PyTorch深度学习快速入门教程》学习笔记(第20周)

目录 摘要 Abstract 1. 池化层原理 2. 二维池化层 3. 二维最大池化 4. 填充、步幅与多个通道 5. 平均池化层 6. 理论总结 7. 池化层处理数据 8. 池化层处理图片 摘要 本周报的目的在于汇报《PyTorch深度学习快速入门教程》课程第六周的学习成果&#xff0c;主要聚焦于…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…

题目讲解15 合并两个排序的链表

原题链接&#xff1a; 合并两个排序的链表_牛客题霸_牛客网 思路分析&#xff1a; 第一步&#xff1a;写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

【freertos】FreeRTOS任务管理

FreeRTOS任务管理 一、任务的创建和删除1、函数xTaskCreate2、函数xTaskCreateStatic3、函数xTaskCreateRestricted4、函数vTaskDelete 二、任务的挂起和恢复1、函数vTaskSuspend2、函数vTaskResume3、函数vTaskResumeFromISR4、函数vTaskSuspendAll5、函数xTaskResumeAll 三、…

FreeRTOS 20:互斥量(互斥信号量)操作

互斥信号量其实就是一个拥有优先级继承的二值信号量&#xff0c;在同步的应用中&#xff08;任务与任务或中断与任务之间的同步&#xff09;二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一把钥匙&#xff0c; 当任务想要访问共…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree&#xff1f;1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

肿瘤治疗评价指标太多?一文帮你梳理清楚!|个人观点·24-11-09

小罗碎碎念 如何延长癌症患者存活时间、提高生存质量、减轻肿瘤带来的痛苦&#xff0c;是评价抗癌药物的重要标准&#xff0c;而把这些标准落在数据上就诞生了各项“评价指标”。 在肿瘤治疗领域&#xff0c;有OS、PFS、RFS、TTP、TTF、ORR、DCR、DDC等各项评价指标。对于大部…

保研考研机试攻略:python笔记(3)

&#x1f428;&#x1f428;&#x1f428;11sort 与 sorted 区别 sort 是应用在 list 上的方法&#xff0c;sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作&#xff0c; 无返回值&#xff0c;而内建函数 sorted 方法返回的…

Linux之自定义shell和C标准库函数

自定义shell和C标准库函数 一.自定义xshell1.1main函数主体1.2获取用户信息以及命令串1.3判断命令串是否为空串1.4判断是否为重定向1.5分割命令串1.6判断是否为内建命令1.7执行命令 二.自定义C标准库函数2.1mystdio.h2.2mystdio.c2.3main.c 一.自定义xshell 1.1main函数主体 1…

TeamTalk知识点梳理一(单聊)

文章目录 db_proxy_serverdb_proxy_server reactor响应处理流程连接池redis连接池MySQL连接池 单聊消息消息如何封装&#xff1f;如何保证对端完整解析一帧消息&#xff1f;协议格式&#xff1f;单聊消息流转流程消息序号&#xff08;msg_id &#xff09;为什么使用redis生成&a…

带跳转功能的电子产品目录如何制作?

​在数字化时代&#xff0c;电子产品已成为我们生活和工作中不可或缺的伙伴。为了方便用户快速查找所需产品&#xff0c;带跳转功能的电子产品目录应运而生。本文将详细介绍如何制作一个高效便捷的带跳转功能电子产品目录&#xff0c;让用户轻松实现产品查找、筛选和购买。 1.要…

从0开始linux(26)——动静态库

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 如何写一个静态库动态库动静态链接 c/c程序形成可执行程序&#xff0c;需要经过三个步骤&#xff0c;编译、汇编、链接三个步骤&#xff0c;我们之前做链接时&#xff0c;使用的方法是将头文件…

hexo 搭建个人博客网站

hexo搭建个人博客 文章目录 hexo搭建个人博客摘要搭建网站的前置工具WebStormHexo Hexo配置初始化本地运行 主题更改安装butterfly主题 正式上线GitHub Pages配置新建仓库SSH密钥配置 将hexo部署到GitHub 个性化设置后续网站更新内容分类和标签设置分类&#xff08;categories&…

BLDC基础知识复习【二】

如果采用20毫欧的电流采样电阻&#xff0c;10A的电流计算出来时0.2V&#xff0c;这个显然还是太小了&#xff0c;需要运放放大并且加上偏置&#xff1a; 6组换向程序&#xff1a; 最核心的控制逻辑在这里&#xff1a;在main.c里面对PWM占空比进行设置&#xff0c;通过一个指针在…