小学生都看得懂的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 总 ...
随机推荐
- ==,hashcde, equals(一)
1.Hash 的属性, 1)bucket 和 list 2.java.lang.object 的 hashcode 和 equal 通过内存地址比较 3.为什么要重写hashcode 和 equal ...
- MyBatis中---数据库配置的属性名冲突问题
一.db.properties 属性文件中 最好加特殊的标志前缀 jdbc.username ,如果单纯的username有可能影响到 mapper.xml中的 ${username}; 举例 ...
- Vue & webpack
在webpack构建的项目中使用vue进行开发 在入口文件中 import Vue from 'vue' 导入的构造函数,功能不完整,只提供了runtime-only的方式,并没有提供网页中那样的使用 ...
- C++ Template 编程,泛型编程练习
#include <iostream> #include <string> #include <deque> #include <stdexcept> ...
- 【转】Python之面向对象与类
[转]Python之面向对象与类 本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 继承层级关系中子类的实例对象对属性的查找顺序问题 一.面向对 ...
- shell脚本 统计一段程序运行时间【转】
转自:https://bbs.csdn.net/topics/391943383#include <stdio.h> #include <stdlib.h> #include ...
- 使用 Charles 抓取 App 网络请求
最近开发App的时候需要用到大量其他应用的数据,但接口不公开,所以想到了抓取.差不多要读到5W的用户数据,采用的是找到数据接口,然后不停发请求的方式.用到的抓取工具是Charles,本文讲解的应用是W ...
- Git学习笔记06-版本回退
在实际中,向版本库提交多次后,几千行代码肯定不记得每次都改了什么,可以使用git log来查看提交日志.也就是git commit -m 后面填写的这部分内容 也可以使用git log --pre ...
- document.execCommand()的用法小记
项目中遇到金额输入框限制只能输入数字,输入特殊字符或者字母汉字时间隔不到1秒内容就会自动清空.跟正则纠缠多年的我初次见到,很是神奇-.- 代码实现: <input type="text ...
- 清理messages提示-bash: /var/log/messages: Operation not permitted的处理
报警提示系统盘容量不足了/var/log下查看messages日志已经很大了,所以就想着把messages清空一下,以此来释放空间.在删除的时候提示没有权限. 看了下日志,发现是大量的haproxy日 ...