C语言程序设计CAP——C语言学习笔记(七) 上

7.1-1 初试数组

•  如何写一个程序计算用户输入的数字的平均数?

int x; 
double sum = 0;
int cnt  = 0;
scanf("%d", &x);
while ( x!= -1 ){
    sum += x;
    cnt ++;
    scanf("%d", &x);
}
if ( cnt >0 ) {
    printf("%f\n", sum/cnt);
}

• 不需要记录输入的每一个数

• 如何写一个程序计算用户输入的数字的平均数,并输出所有大于平均数的数?
• 必须先记录每一个输入的数字,计算平均数之后,再检查记录下来的每一个数字,与平均数⽐比较,决定是否输出

如何记录很多数?

• int num1,num2,num3…..?

数组

• int number[100];
• scanf(“%d”, &number[i]);

7.1-2 数组的定义和使用

定义数组

• <类型> 变量名称[元素数量];
• int grades[100];
• double weight[20];
• 元素数量必须是整数
• C99之前:元素数量必须是编译时刻确定的字面量

数组

• 是一种容器(放东西的东西),特点是:
• 其中所有的元素具有相同的数据类型;
• 一旦创建,不能改变大小
• *(数组中的元素在内存中是连续依次排列的)

int a[10]

• ⼀一个int的数组
• 10个单元:a[0],a[1],…,a[9]

• 每个单元就是⼀一个int类型的变量
• 可以出现在赋值的左边或右边:
• a[2] = a[1]+6;
• *在赋值左边的叫做左值

数组的单元

• 数组的每个单元就是数组类型的一个变量
• 使用数组时放在[]中的数字叫做下标或索引,下标从0开始计数:
• grades[0]
• grades[99]
• average[5]

 
有效的下标范围

• 编译器和运行环境都不会检查数组下标是否越界,无论是对数组单元做读还是写
• 一旦程序运行,越界的数组访问可能造成问题,导致程序崩溃
• segmentation fault!
• 但是也可能运气好,没造成严重的后果
• 所以这是程序员的责任来保证程序只使用有效的下标值:[0,数组的大小-1]

int x;
double sum = 0;
int cnt = 0;
int number[100];
scanf("%d", &x);
while ( x!= -1 ) {
    number[cnt] = x;
    cnt ++;
    scanf("%d", &x);
}
if ( cnt > 0 ) {
    int i;
    double average = sum / cnt;
    for ( i=0; i<cnt; i++ ) {
        if ( i=0; i<cnt; i++) {
            printf("%d ", number[i]);
        }
    }
}

• 这个程序是危险的,因为输入的数据可能超过100个

计算平均数

int x;
double sum = 0;
int cnt;
printf("请输入数字的数量: ");
scanf("%d", &cnt);
if ( cnt>0 ) {
    int number[cnt];
    scanf("%d", &x);
    while ( x!= -1) {
        number[cnt] = x;
        sum += x;
        cnt ++;
        scanf("%d", &x)
    }
}

• 如果先让用户输入有多少数字要计算,可以用C99的新功能来实现

长度为0的数组?

• int a[0];
• 可以存在,但是无用

7.1-3 数组的例子:投票统计

• 写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束

 思考题:

1、字符可以做下标吗?

数组的下标必须是整数,那么字符可以做下标吗?比如:

int a[255]; a['A'] = 1;

这样的代码可行吗?为什么?

2、*容器*

根据你对其他编程语言的认识,比如C++、Java、Python、PHP、JavaScript等,谈谈你对容器的认识:你觉得容器是什么?其他语言对容器的支持能做到什么程度?

一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。

3、*数组的单元在内存中是连续存放的*

数组单元在内存中是连续存放的,你能否设计一个程序来证明这一点?如果你写的程序对初学者是会起到错误的示范作用的(比如越界什么的),务请说明。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cnt10是一种使用Verilog编程语言实现的计数器。Verilog是一种硬件描述语言,广泛应用于数字电路设计和验证。cnt10是一个计数器,它可以自动进行数值递增,并在达到特定条件时重新开始计数。 cnt10的实现可以借助Verilog中的寄存器和组合逻辑来实现。首先,我们需要定义一个数字表示计数器的寄存器,并将其初始化为0。然后,我们使用组合逻辑来判断是否应该递增计数器的值。当满足特定的条件时,比如达到某个特定的数值,我们可以将计数器的值重置为0。 以下是一个简单的示例代码: ```verilog module cnt10 ( input wire clk, input wire reset, output wire [3:0] count ); reg [3:0] count_reg; always @(posedge clk or posedge reset) begin if (reset) begin count_reg <= 4'b0000; //将计数器重置为0 end else if (count_reg == 4'b1001) begin count_reg <= 4'b0000; //达到9时,重新计数 end else begin count_reg <= count_reg + 1; //递增计数器的值 end end assign count = count_reg; endmodule ``` 上述代码中,cnt10模块具有一个输入时钟信号`clk`和复位信号`reset`,以及一个4位的输出信号`count`用于显示计数器的值。在时钟的上升沿或复位信号被触发时,always块将会执行。当复位信号处于高电平时,计数器被重置为0;当计数器的值等于9时,计数器的值被重置为0;否则,计数器的值将会自增1。 通过使用这个cnt10模块,我们可以在Verilog中实现一个可自动计数并重新开始计数的计数器。这是Verilog的一种基础应用,可以在数字电路设计中发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值