c12---数组

//
//  main.c
//  数组基本概念
//
//  Created by xiaomage on 15/6/9.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {

    // 当需要保持很多"相同类型"的数据时就可以使用数组来保持
    // 因为如果使用变量, 那么将变得非常复杂, 并且非常没有技术含量
    int score = 99;
    int score1 = 98;
    ...
    int score998 = 88;
    printf("%i\n", score);

    /*
     数组的定义格式:
     数据类型 变量名称;
     数据类型 数组名称[数据的个数];
     元素类型 数组名称[元素个数];
     元素类型: 就是数组中需要存储的数据类型, 一旦指定, 数组中就只能存储该类型的数据
     元素个数: 就是数组中能够存储的数据(元素)的个数
     */
    int num;
    num = 12;
    printf("num = %i\n", num);

    int scores[3]; // 定义了一个名称叫做scores的数组, 数组中可以存放3个int类型的数据
//    scores = 12; // 系统搞不清楚应该赋值给谁
    // 只要定义一个C语言的数组, 系统就自动会给数组中的每一块小得存储空间一个编号
    // 这个编号从0开始, 一次递增
    // 数组中系统自动绑定的编号, 我们称之为 索引
    scores[0] = 12;
    scores[1] = 66;
    scores[2] = 59;

    printf("scores[0] = %i\n", scores[0]);

    return 0;
}
//
//  main.c
//  数组的初始化和遍历
//
//  Created by xiaomage on 15/6/9.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 需求保持全班101个人的分数
    // 元素类型 数组名称[元素个数];
    /*
    // 先定义再初始化
    int scores[5];
    scores[0] = 99;
    scores[1] = 88;
    scores[2] = 77;
    scores[3] = 66;
    scores[4] = 100;
     */
    /*
    int num;
    num = 10;

    int num1 = 10;
     */
    // 依次将{}中的每一个值赋值给数组中的每一个元素
    // 并且从0开始赋值
    // 也称之为数组的初始化(完全初始化)
    int scores[5] = {99,88,77,66,100};

    // 部分初始化
    // 默认从0开始初始化, 依次赋值
    // 注意: 如果"在部分初始化中"对应的内存没有被初始化, 那么默认是0
    int scores1[3] = {11, 22};
    printf("0 = %i\n", scores1[0]);
    printf("1 = %i\n", scores1[1]);
    printf("2 = %i\n", scores1[2]);

    printf("-------\n");

    // 注意: 如果没有对数组进行初始化(完全和部门), 那么不要随便使用数组中的数据, 可能是一段垃圾数据(随机值)
    int scores2[3];
    printf("0 = %i\n", scores2[0]);
    printf("1 = %i\n", scores2[1]);
    printf("2 = %i\n", scores2[2]);

    printf("-------\n");

    // 注意: 定义数组的时候, 数组的元素个数不能使用变量, 如果使用变量, 那么数组中是一些随机值
    int num = 10;
    int scores3[num];
    printf("0 = %i\n", scores3[0]);
    printf("1 = %i\n", scores3[1]);
    printf("2 = %i\n", scores3[2]);

    // 注意: 不建议使用变量定义数组, 如果使用了变量定义数组, 作为数组的元素个数, 不初始化的情况下是随机值, 如果初始化会直接报错
//    int num2 = 10;
//    int scores4[num2] = {11, 12};
     printf("-------\n");

    // 注意: 如果定义的同时进行初始化, 那么元素的个数可以省略
    // 省略之后, 初始化赋值几个数据, 那么数组的长度就是几. 也就是说数组将来就能存储几个数据
    int scores5[] = {1, 3};
    printf("0 = %i\n", scores5[0]);
    printf("1 = %i\n", scores5[1]);
    printf("-------\n");

    // 注意; 如果定义数组时没有进行初始化, 那么不能省略元素个数
//    int scores6[];

//    0 1 2 3 4
//    int socres7[101] = {0, 0, 0, 1, 3};
//    int socres7[101];
//    socres7[99] = 1;
//    socres7[100] = 3;

    // 可以通过[索引] = 的方式, 给指定索引的元素赋值
    int socres7[101] = {[99] = 1, [100] = 3};
    printf("3 = %i\n", socres7[99]);
    printf("4 = %i\n", socres7[100]);

//    注意: 只能在定义的同时利用{}进行初始化, 如果是先定义那么就不能使用{}进行初始化
    // 如果先定义那么就不能再进行整体赋值, 只能单个赋值
//    int scores8[3];
//    scores8 = {1 , 4, 19};
//    scores8[0] = 1;

    return 0;
}
//
//  main.c
//  数组的遍历
//
//  Created by xiaomage on 15/6/9.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // 取出数组中所有的值, 称之为遍历
    int scores[6] = {1, 23, 44, 66, 71, 88, 99 , 2};
    /*
    printf("scores[0] = %i\n", scores[0]);
    printf("scores[1] = %i\n", scores[1]);
    printf("scores[2] = %i\n", scores[2]);
    printf("scores[3] = %i\n", scores[3]);
    printf("scores[4] = %i\n", scores[4]);
    printf("scores[5] = %i\n", scores[5]);
     */
    // 注意: 在遍历数组的时候, 尽量不要把遍历的次数写死
    // 遍历多少次应该由数组来决定, 也就是说遍历多少次应该通过数组计算得出
    /*
    printf("scores = %lu\n", sizeof(scores)); // 计算出数组占用的总字节数
    printf("scores[0] = %lu\n", sizeof(scores[0])); // 计算出数组中某一个元素占用的字节数
    printf("一个有多少个元素 : %lu\n", sizeof(scores) / sizeof(scores[0]));
    */
    // 动态计算数组的元素个数
    int length = sizeof(scores) / sizeof(scores[0]);

    for (int i = 0; i < length; i++) {
        printf("scores[%i] = %i\n", i,scores[i]);
    }
    return 0;
}
时间: 2024-10-29 03:23:40

c12---数组的相关文章

后缀数组 DC3构造法 —— 详解

学习了后缀数组,顺便把DC3算法也看了一下,传说中可以O(n)复杂度求出文本串的height,先比较一下倍增算法和DC3算法好辣. DC3 倍增法 时间复杂度 O(n)(但是常数很大)   O(nlogn)(常数较小) 空间复杂度   O(n)    O(n) 编程复杂度    较高   较低 由于在时间复杂度上DC3的常数比较大,再加上编程复杂度比较高,所以在解决问题的时候并不是最优选择.但是学到了后缀数组还是补充一下的好点. DC3算法的实现: 1:先把文本串的后缀串分成两部分,第一部分是后

[poj 1743]后缀数组例题

题目链接:http://poj.org/problem?id=1743 首先,musical theme只与前后位置的增减关系有关,而与绝对的数值无关,因此想到做一次差分. 然后对于差分后的数组,找到最长的出现两次(或两次以上)的一个子串即可.这个如果说两个子串可以交叉的话就好做了,直接取height的最大值即可,但是题目要求不能交叉,前几天一位师兄讲课刚讲了,可以用二分做.对于一个指定长度L,判断它是否可行,就用这个L去划分height数组,对于每个部分的分别看看最远的两个是否没有交叉就可以了

POJ 2406 Power String 后缀数组

这题曾经用KMP做过,用KMP 做非常的简单,h函数自带的找循环节功能. 用后缀数组的话,首先枚举循环节长度k,然后比较LCP(suffix(k + 1), suffix(0)) 是否等于len - k, 如果相等显然k就是一个循环节. 得到LCP的话可以通过预处理出所有点和0的lcp就好了.另外倍增法构造后缀数组还有用RMQ来搞lcp nlogn是不行的,会超时,所以可以dc3走起了.. #include <cstdio> #include <cstring> #include

后缀数组模板第一版

/*---------------倍增算法+RMQ后缀数组模板-------------- 输入:从0开始的字符串g,长度len最大为10^6 输出: sa[]表示:n 个后缀从小到大进行排序之后把排好序的后缀的开头位置顺 次放入 sa 中,sa[i]表示排第i位的字符串开头是sa[i],因为添加了一个结尾0,所以sa[0]=len height 数组(h[]):定义 h[i]=suffix(sa[i-1])和 suffix(sa[i])的最长公 共前缀,也就是排名相邻的两个后缀的最长公共前缀.

HDU5769-Substring-多校#4-1006-后缀数组

给定一个字符x和一个字符串.要求输出包含此字符的所有不同字串. 后缀数组可以计算一个字符串的所有不同字串,理解了原理就能做这题了. 对于每一个后缀i,将产生len-sa[i]-hight[i]的前缀,累加起来就是所有不同字串.这里要求字串必须包含x 也就是对于每一个后缀i,要减去不含x的前缀. 保存每一个x的位置,用lower_bound查询在此后缀中的第一个x,然后之前的都不计算到贡献当中. dc3敲起来太慢了 1 #include <cstdio> 2 #include <algor

kuangbin带你飞 后缀数组 题解

2份模板 DC3 . 空间复杂度O3N 时间复杂度On #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb)) #define G(x) ((x) < tb ? (x) * 3 + 1 :((x) - tb) * 3 + 2) const int MAXN = 300010; const int MAXM = 100010; char input[MAXM]; int wa[MAXN],wb[MAXN],ws[MAXN],wv[MAXN],wsd[MAX

树状数组和线段树

一.树状数组 在解题过程中,我们有时需要维护一个数组的前缀和 S[i]=A[1]+A[2]+...+A[i] .但是不难发现,如果我们修改了任意一个 A[i],S[i] . S[i+1]...S[n] 都会发生变化.可以说,每次修改 A[i] 后,调整前缀和 S[] 在最坏情况下会需要 O(n) 的时间.当 n 非常大时,程序会运行得非常缓慢.因此,这里我们引入"树状数组",它的修改与求和都是 O(logn) 的,效率非常高. 实现: 对于正整数x,定义lowbit(x)为x的二进制表

[spoj DISUBSTR]后缀数组统计不同子串个数

题目链接:https://vjudge.net/contest/70655#problem/C 后缀数组的又一神奇应用.不同子串的个数,实际上就是所有后缀的不同前缀的个数. 考虑所有的后缀按照rank排好了,我们现在已知height,也就是相邻的两个的最长公共前缀是多少.那么不同的子串个数怎么统计呢? 从第一个串开始考虑,ans+=L1.再看第二个串,会加进来几个不同的前缀呢?就是ans+=L2-height[2].第三个类似,会加进来ans+=L3-height[3]-- 因此最后的结果就是a

后缀数组:倍增法和DC3的简单理解

一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n-1,那么子串S[i,n-1]称作它的后缀,用Suffix[i]表示. 串比较:对于两个串S1,S2,设长度分别为n1,n2.若存在一个位置i,使得对于0<=j<i满足S1[j]=S2[j]且S1[i]<S2[i],那么我们称S1<S2.如果S1是S2的一个前缀,那么也有S1<S2

PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌

00-自测1. 打印沙漏(20) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两行符号数差2:符号数先从大到小顺序递减到1,再从小到大顺序递增:首尾符号数相等. 给定任意N个符号,不一定能正好组成一个沙漏.要求打印出的沙漏能用掉尽可能多的符号. 输入格式: 输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔. 输出格式: 首先