一,数组
1.1 越界
法一:输入的时候计数,超过范围不再输入
法二:自己先输入数组的范围
……试了一下没有试出来……丢,会INT NUMBER[CNT]会报错,看来我这不是C99?
1.2 统计个数
#include<stdio.h>
int main(void) {
const int number = 10;
int x ;
int count[number];
int i = 0;
for (i = 0; i < number; i++) {
count[i] = 0;
//printf("%d\n", count[i]);
}//初始化数组,试过了不初始化会得到奇怪的值,但是运算是对的
scanf("%d", &x);
while (x > -1) {
if (x >= 0 && x <= 9) {
count[x]++;
}
scanf("%d\n", &x);
}
for (i = 0; i < number; i++) {
printf("%d的个数是%d\n", i,count[i]);
}
return 0;
}
第一个是,VS不支持INT NUMBER[CNT]这样的写法,但是DEV可以
第二个是,理论上应该-1结束,但是-1结束不了,两个软件都是-2结束的,>-1和!=-1都试过了
1.3 集成初始化
int count[] = { 2 ,452,5,3,6,6,2,5,32,1,3,3,5};
int i = 0;
for (i = 0; i <13; i++) {
printf("%d\n", count[i]);
}
int count[13] = {2};
int i = 0;
for (i = 0; i <13; i++) {
printf("%d\n", count[i]);
}
第一个是2 后面全部是0,
上一题初始化的简单写法 int count[]={0}
int count[13] = {[2]=2,[10]=888};
printf("%lu\n", sizeof(count));
printf("%lu\n", sizeof(count[13]));
for (i = 0; i < sizeof(count)/sizeof(count[0]); i++) {
printf("%d\n", count[i]);
}
数组的大小,连续记录,安全的范围
1.4 赋值
不能int b[] = count;只能遍历数组
int b[];
for (i = 0; i < sizeof(count)/sizeof(count[13]); i++) {
b[i] = count[i];
}
< sizeof(count)/sizeof(count[13]这是最不容易出错的写法
并且循环结束后,I的值正好是数组最大的有效下标
!!!!但是,不能做数组元素的下标
int count[13] = {6,677,2,3,57,21,89,26,33,67,2,1,24,};
int i = 0;
int x;
scanf_s("%d", &x);
for (i = 0; i < 13; i++) {
if (x == count[i]) {
printf("数%d在数组的%d位置上\n",x,i);
break;
}
else {
printf("不存在\n");
}
}
一点小问题,这里“不存在”是循环输出的
#include<stdio.h>
int main() {
int sea(int key, int a[], int lll);
//声明
int a[] = { 3,6,7,8,2,6,14,2342, };
int key;
scanf_s("%d", &key);
int lll = 8;//可以省,不设置这个变量直接带入8
int ret = sea(key, a, lll);
if (ret != -1) {
printf("%d存在,位置是%d", key, ret);
}
else {
printf("不存在");
}
return 0;
}
//哦哦,这是一个函数,定义
int sea(int key, int a[], int lll)
{
int ret = -1;
int i;
for (i = 0; i < lll; i++) {
if (a[i] == key) {
ret = i;
break;
}
}
return ret;
}
****数组作为函数参数的时候,往往必须再用另一个参数来传入数组的大小
数组作为函数的参数时:
不能在【】中给出数组的大小
也不能用SIZEOF()计算数组的元素个数了
0317补:我是实在没有听懂讲的什么东西
现在的勉强理解就是,在函数里面需要数组作为参数的时候,只能在小括号里面写a[注意!中括号里面是空的],再用另一个参数来传入数组的大小,好像是,我们知道a[11】但是不能直接写,只能写INT A[].INT B,B可以是一个数字,可以是一个字母??????
1.5 素数****
逻辑N-1遍——偶数除开,N/2遍——平方根!已经是最大的因数了!!!sqrt(x)遍——判断能否被已知的小于X的素数整除!!!【理解一下就是,分解因数!!!】
虽怕但头铁
1.5.1 分解最小因数
#include<stdio.h>
int main() {
//设置变量,统计100以内的素数,弄进数组,遍历除数组,得到结论
const int number=10;
int a[number] = { 2 };
int i;
int t=0;
for(i=2;t<100;i++){
if(i/a[number]!=0){
t++;
a[t]=i;
}
}
for(t=0;t<10;t++){
printf("%d\t",a[t]);
}
return 0;
}
错的,啊啊啊啊啊罢了,不要为难自己,输出的结果离谱的让我想噶
我是真的菜,我的天啊
#include<stdio.h>//没跑成功
int isprime(int x,int knownprimes[],int numberofknowprimes);
int main(void) {
const int number=100;
int prime[number]={2};//构造了素数表,初始化为2
int count=1;//因为有一个数了,count为1
int i=3;//从3开始测试是不是素数
// {
// int i;
// printf("\t\t\t\t");
// for(i=0;i<number;i++){
// printf("%d\t",i)
// }
// }//测试的时候输出表头
while(count<number){
if(isprime(i,prime,count)){
//把I输入函数,看是不是,如果是,加入数组
//判断的结果是0,1,函数的结果也是0,1
prime[count++]=i;
//做了两件事,count++是给COUNT的值加1,但是输出加1之前的值
//PEIME[COUNT++]=PRIME[COUNT],但是,此时COUNT已经加1了,指向了下一个位置
}
// {
// printf("i=%d\tcnt=%d\t",i,count);
// int i;//只有C99可以,在我定义之前,I是外面的I,
//这个I和外面的I没有关系,只是运算到这里,变成了里面的I
//不是C99,就是再加一个括号
// for(i=0;i<number;i++){
// printf("%d\t",prime[i]);
// } //遍历
// printf("\n");
// }调试
i++;
}
for(i=0;i<number;i++){
prinntf("%d",prime[i]);//报错
if((i+1)%5)printf("\t");
else printf("\n");//这里就是依次输出数组内容,以及为了%5是让格式美观一点
}
return 0;
}
int isprime(int x,int knownprimes[],int numberofknowprimes)//最后一个报错
{
int ret=1;
int i;
for(i=0;i<numberofknownprimes;i++){
if(x%knownprimes[i]==0){
ret=0;
break;
}
}
return ret;
}
1.5.2 反向构造素数表
#include<stdio.h>
int main(){
const int maxNumber=25;
int isPrime[maxNumber];
int i;
int x;
for(i=0;i<maxNumber;i++){
isPrime[i]=1;
}
for(x=2;x<maxNumber;x++){
if(isPrime[x]){
for(i=2;i*x<maxNumber;i++){
isPrime[i*x]=0;
}
}
}
for(i=1;i<maxNumber;i++){
if(isPrime[i]){
printf("%d\t",i);
}
}
printf("\n");
return 0;
}
我哭死,这次不仅没有打错,而且能跑,我真的哭死,当然,这么晚了,我的脑子只允许我抄打一份
#include<stdio.h>
int main(){
const int maxNumber=25;//所以求25以内的素数
int isPrime[maxNumber];
int i;
int x;
for(i=0;i<maxNumber;i++){
isPrime[i]=1;
}//初始化数组,1 ,假定都是素数
{//表头
//for test
printf("\t");
for(i=2;i<maxNumber;i++){
printf("%d\t",i);
}
}printf("\n");
//for test
for(x=2;x<maxNumber;x++){
if(isPrime[x]){//X=2的时候,是1,会进入循环,基于我们已经知道2是素数
for(i=2;i*x<maxNumber;i++){
isPrime[i*x]=0;//把2的倍数都标记为非素数,0,不会进入IF
}
}
//for test
printf("%d\t",x);
for(i=2;i<maxNumber;i++){
printf("%d\t",isPrime[i]);
}printf("\n");
//for test
}
for(i=1;i<maxNumber;i++){
if(isPrime[i]){
printf("%d\t",i);
}//遍历数组,找到数组的变量为1时,数组的标号
}
printf("\n");
return 0;
}
1.6 二维数组
呵呵,我真的麻了,一维的我都麻了,明天再说