小学生都看得懂的C语言入门(4): 数组与函数
// 之前判断素数, 只需要到sqrt(x)即可,
//更加简单的, 判断能够比已知的小于x的素数整除, 运行更快
#include <stdio.h>
// 之前判断素数, 只需要到sqrt(x)即可,
//更加简单的, 判断能够比已知的小于x的素数整除, int isprime(int x,int knownprimes[],int n)
{
int ret=;
int i;
for (i=;i<n;i++){
if (x%knownprimes[i]==){
ret=;
break; //不是素数
}
}
return ret;
} int main(void)
{
const int num=;// 想要输出几个素数
int prime[num]={}; //存放素数
int i=;
int cnt=; // 增加一个表头, 表示列数
{
printf("\t\t");
for (int i=;i<num;i++){
printf("%d\t",i);
}
printf("\n");
}
// 以上表头 while(cnt<num){
if (isprime(i,prime,cnt)){
prime[cnt++]=i; // 这个表达式将 i写入到cnt位置, 又使其+1
}
// 增加调试 用一对{}括起来
{
printf("i=%d\tcnt=%d\t",i, cnt);
for(int i=;i<num;i++) {
printf("%d\t",prime[i]);
}
printf("\n");
}
// 调试 i++;// 测试下一个i
}
for (i=;i<num;i++){
printf("%d",prime[i]);
if((i+)%) printf("\t");
else printf("\n");
}
return ;
}
那么如何构造素数表?.. (划线法) .. 想要构造n以内的素数表,
1.令x为2,
2.将小于n的2x 3x 4x...的数标记为非素数,
3.令x 为下一个没有被标记为非素数的数, 重复2; 直到所有的数都尝试完毕.
算法:
1.开辟prime[n], 初始化全为1, prime[x]=1表示x是素数,
2.令x=2;
3. 如果x是素数, 对于(i=2;i*x<n;i++) 令prime[i*x]=0;
4.x++, 如果x<n 重复3, 否则结束
程序如下
#include<stdio.h>
int main()
{
const int num=;// 找30 以内的素数 , 则建立一个长度是30的数组isprime[30]
int x;
int isprime[num];
int i;
for(i=;i<num;i++){
isprime[i]=;
} // 初始化prime 数组, 设置为1 for (x=;x<num;x++){
if (isprime[x]){
for (i=;i*x<num;i++)
isprime[i*x]=;
} // x是素数则 它的倍数都不是素数 标记为0
} for (i=;i<num;i++){ // 从i=2位置开始进行输出
if (isprime[i]==){
printf("%d\t",i);
} } //输出素数
printf("\n");
return ;
}
(一) 搜索实例, (美元不同币值称呼不同)
#include<stdio.h>
// penny 1; nickel 5; dime 10; quarter 25; half-dollar 50
int a[]={,,,,};
char *name[]={"penny","nickel","dime","quarter","half-dollar"};// 这里的* 必须要有, 否则出错! int search(int key, int a[],int len )
{
int ret=-;
for(int i=;i<len;i++){
if (key==a[i]){
ret=i;
break;
}
}
return ret;
} int main()
{
int k=;
int r=search(k,a,sizeof(a)/sizeof(a[]));
if (r>-){
printf("%s\n",name[r]); // 输出k表示的美元货币名字
} return ;
}
结果是dime.
但是这样缺点在于需要用到两个数组, 如何做到只需要一个数组? ...用struct
#include<stdio.h>struct{
int a;
char *name; // * 必须要有, 否则出错!
} coins[]={
{,"penny"},
{,"nickel"},
{,"dime"},
{,"quarter"},
{,"half-dollar"}
}; int main()
{
int k=;
for (int i=;i<sizeof(coins)/sizeof(coins[]);i++){
if (k==coins[i].a){
printf("%s\n",coins[i].name);
break;
}
} return ;
}
之前这种线性搜索很慢, 如果要搜索的值为数组的最后一个, 则需要全部遍历, 不好, 可以用二分法进行搜索, 确定left ,right ,mid , 缩小范围
但二分法的前提是数据已经从小到大排好了, 先假设数组中的元素已经按照升序排好了
#include<stdio.h>
int search(int key,int a[],int len)
{
int left=;
int right=len-;// 最大下标是长度-1
int ret=-; // 判别是否找到,记录位置
while(left<=right)
{
int mid=(left+right)/;
if(a[mid]==key){
ret=mid;
break;
}else if(a[mid]>key){
right=mid-;
}else{
left=mid+;
}
}
return ret;
}
int main()
{
int a[]={,,,,,};
int k=;
int loc=search(k,a,sizeof(a)/sizeof(a[]));
printf("%d",loc);
return ;
}
上述要找k=3 所在的位置, 开始left=0,right=5, mid=2, 之后 left=0, right=1, mid=0; 之后left=1, right=1, 终止循环, 但是没有输出啊, 函数中ret=-1没有改变过!!
这是怎么回事?
接下来考虑如何排序问题,,,
我们用选择法 进行排序
#include<stdio.h>
// 排序
// 思路, 找到数组中找出最大的值的位置;
// 交换位置, 将最大值与数组的最后一个位置的值交换;
// 剩下的n-1长度的继续找最大的,
int max(int a[],int len)
{
int maxid=;
for(int i=;i<len;i++){
if (a[i]>a[maxid]){
maxid=i;
}
}
return maxid;
} int main()
{
int a[]={,,,,,,,,};
int len=sizeof(a)/sizeof(a[]);
for (int i=len-;i>;i--)
{
int maxid=max(a,i+);// 找到最大的
// swap a[maxid] and a[len-1]
int t=a[maxid];
a[maxid]=a[i];
a[i]=t;
}
// 输出排序后的结果
for(int i=;i<len;i++){
printf("%d ",a[i]);
}
return ;
}
小学生都看得懂的C语言入门(4): 数组与函数的更多相关文章
- 小学生都看得懂的C语言入门(3): 数组与函数
#include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...
- 小学生都看得懂的C语言入门(1): 基础/判别/循环
c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++ ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...
- 小学生都看得懂的C语言入门(5): 指针
现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=; ...
- 小学生都看得懂的C语言入门(6): 字符串
1.字符用 char 表示 #include<stdio.h> int main() { char c; char d; c=; d='; if (c==d){ printf(" ...
- 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例
1.bool 类型 定义bool类型之前需要导入#include <stdbool.h> #include <stdio.h> #include <stdbool.h&g ...
- JS对象 JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
什么是对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方法: ...
- Go语言入门教程(十)之函数
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
- C语言二维数组作为函数的参数
前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...
- 小学生都能读懂的网络协议之:WebSocket
目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API 总 ...
随机推荐
- chrome调试技巧和插件介绍
14 个你可能不知道的 JavaScript 调试技巧 五种前端开发必备的调试技术 日志的艺术 吐血推荐珍藏的Chrome插件 吐血推荐珍藏的 Chrome 插件(二)
- 解决vue.js在编写过程中出现空格不规范报错的情况
找到build文件夹下面的webpack.base.conf.js文件. 然后打开该文件,找到图下这段代码,把他注释掉. 注释掉之后,再进行子页面等编写的时候,空格不规范的情况下也不会再报错啦.因为这 ...
- python中的私有变量
class Test1: def f1(self): self.name ="张三" self.__age = 20 #使用名称变形实现私有变量 print(self.name) ...
- ActiveMQ中Broker的应用与启动方式
Broker:英语有代理的意思,在activemq中,Broker就相当于一个Activemq实例. 1. 命令行启动实例: 1.activemq start使用默认的activemq.xml启动 E ...
- android checkBox setTextColor无效
代码中动态设置checkBox的文字选中背景和未选中背景,用如下代码: checkView.setTextColor(getResources().getColor(R.color.item_colo ...
- Vue -自定义指令&钩子函数
除了核心功能默认内置的指令,Vue也允许注册自定义指令 页面加载后,让文本框自动获取焦点,原生js做法是获取文本框元素后调用focus()方法,但Vue不建议手动操作DOM元素,所以此时要自定义指令 ...
- P4001 [ICPC-Beijing 2006]狼抓兔子
题目地址:P4001 [ICPC-Beijing 2006]狼抓兔子 平面图 边与边只在顶点相交的图. 对偶图 对于一个平面图,都有其对应的对偶图. 平面图被划分出的每一个区域当作对偶图的一个点: 平 ...
- RocketMQ 简单梳理 及 集群部署笔记【转】
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- javascript面向对象学习
1.this指向问题,指向的是当前的方法属于谁,当前的方法属于谁就指向谁!! 例子: oDiv.onclick = function () { this指向的是oDiv,因为这个方法属于oDiv } ...
- unity实现剧情对话
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private string show ...