数组程序基础知识

news2024/9/23 21:24:21

为了处理方便,把具有相同类型的变量按有序的形式组织起来。这些同类数据元素的集合称之为数组。数组可分为数值数组、字符数组、指针数组、结构数组等。

01--一维数组

在使用数组前需要先定义:

类型说明符 数组名[常量表达式];

类型说明符是基本数据类型或者构造数据类型

常量表达式表示数组元素的个数,或者说是数组的长度。

eg:  float x[4];   说明实型数组x,有4个元素,分别为x[0],x[1],x[2],x[3].下标从0开始

数组元素的一般形式为:

数组名[下标]

必须先要定义数组,才能使用下标变量

在C中只能逐个使用下标变量而不能一次用整个数组

例如有5个元素的数组必须使用循环语句逐个输出各个下标变量

for(i=0;i<4;I++) printf("%d",a[i]);

而不允许直接使用 printf("%d",a);

#include <stdio.h>
int main()

{

  int i,a[10];

  for(i=0;i<=9;i++)

    {  a[i]=i;
      printf("%d ",a[i]);}
      
  for(i=9;i>=0;i--)

      printf("%d ",a[i]);
  return 0;
}

#include <stdio.h>
int main()

{

  int i,a[10];

  for(i=0;i<10;)

      a[i++]=i;

  for(i=9;i>=0;i--)

      printf("%d",a[i]);
  return 0;
 }

#include <stdio.h>
int main()

{

  int i,a[10];

  for(i=0;i<10;i++)

      a[i]=2*i+1;

  for(i=0;i<=9;i++)

	  printf("%d ",a[i]);

  printf("\n%d %d\n",a[2],a[8]);
  return 0;
}

1.一维数组的初始化

一般形式为:  类型说明符 数组名[常量表达式]={值,值......,值};

int a[4]={0,1,2,3};  相当于a[0]=0,a[1]=1,a[2]=2,a[3]=3;

1)可以只赋值给部分元素

int a[5]={0,1};   表示只给a[0]=0,a[1]=1,其他元素均为0

2)只能逐个元素赋值,不可整体赋值

int a[3]={2,2,2};  不可写为int a[3]=2;

3)若给所有元素赋值,可不写出元素个数

int a[3]={2,2,2};  可写为int a[]={2,2,2}; 

#include <stdio.h>
int main()

{

  int i,max,a[5];

  printf("input 5 numbers:\n");

  for(i=0;i<5;i++)

      scanf("%d",&a[i]);

  max=a[0];

  for(i=1;i<5;i++)

      if(a[i]>max) max=a[i];

  printf("maxmum=%d\n",max);
  return 0;
}

#include <stdio.h>
int main()

{

  int i,j,p,q,s,a[10];

  printf("\n input 10 numbers:\n");

  for(i=0;i<10;i++)

      scanf("%d",&a[i]);

  for(i=0;i<10;i++){

      p=i;q=a[i];

      for(j=i+1;j<10;j++)

      if(q<a[j]) { p=j;q=a[j]; }

      if(i!=p)

        {s=a[i];

         a[i]=a[p];

         a[p]=s; }

      printf("%d ",a[i]);

  }
  return 0;
}

02--二维数组

一般形式:

类型说明符 数组名[常量表达式1][常量表达式2]

常量表达式1表示第一维下表长度,常量表达式2表示第二维下标长度

例: int x[2][3]  表示一个2行3列的数组,数组名为x,下标变量的类型为整型

共有2*3=6个元素   分别为:x[0][0],x[0][1],x[0][2],x[1][0],x[1][1],x[1][2],每个元素占用的空间都为int类型的大小

1.二维数组元素的引用

假设有4位同学的语数外成绩如下,打印出来求每科成绩的平均分及每个人的总分。

#include <stdio.h>
int main()
{
    int i,total;
    float c;
    int a[4][3]={{95,89,99},{93,92,95},{99,95,92},{91,97,94}};
    printf("Here are the scores of all the students!\n");
    printf("      穆山  穆川  沐枫  沐玥\n");
    printf("语文: ");  
    for(i=0;i<4;i++)
    printf("%d    ",a[i][0]);
    printf("\n数学: ");  
    for(i=0;i<4;i++)
    printf("%d    ",a[i][1]);
    printf("\n英语: ");  
    for(i=0;i<4;i++)
    printf("%d    ",a[i][2]);

    for(i=0,c=0;i<4;i++)
    c=c+a[i][0];
    c=c/4;
    printf("\n\n语文的平均分为:%4.2f    ",c);
    for(i=0,c=0;i<4;i++)
    c=c+a[i][1];
    c=c/4;
    printf("\n数学的平均分为:%4.2f    ",c);
    for(i=0,c=0;i<4;i++)
    c=c+a[i][2];
    c=c/4;
    printf("\n英语的平均分为:%4.2f    ",c);

    for(i=0,total=0;i<3;i++)
    total=total+a[0][i];
    printf("\n穆山的总分为:%d    ",total);
    for(i=0,total=0;i<3;i++)
    total=total+a[1][i];
    printf("\n穆川的总分为:%d    ",total);
    for(i=0,total=0;i<3;i++)
    total=total+a[2][i];
    printf("\n沐枫的总分为:%d    ",total);
    for(i=0,total=0;i<3;i++)
    total=total+a[3][i];
    printf("\n沐玥的总分为:%d    ",total);
}

上述如果用二维的变量表示可以改为如下代码,最后运行结果与上面一致

#include <stdio.h>
int main()
{
    int i,j;
    float c=0,s=0,v[3],t[4];
    int a[4][3]={{95,89,99},{93,92,95},{99,95,92},{91,97,94}};
    printf("Here are the scores of all the students!\n");
    printf("      穆山  穆川  沐枫  沐玥\n");
    printf("语文: ");  
    for(i=0;i<4;i++)
    printf("%d    ",a[i][0]);
    printf("\n数学: ");  
    for(i=0;i<4;i++)
    printf("%d    ",a[i][1]);
    printf("\n英语: ");  
    for(i=0;i<4;i++)
    printf("%d    ",a[i][2]);
    for(i=0;i<3;i++)
   {
      for(j=0;j<4;j++)
      c=c+a[j][i];
      v[i]=c/4;
      c=0;
   }
    printf("\n\n语文的平均分为:%4.2f    ",v[0]);
    printf("\n数学的平均分为:%4.2f    ",v[1]);
    printf("\n英语的平均分为:%4.2f    ",v[2]);
    for(i=0;i<4;i++)
   {
      for(j=0;j<3;j++)
      s=s+a[i][j];
      t[i]=s;
      s=0;
   }
    printf("\n穆山的总分为:%.2f    ",t[0]);
    printf("\n穆川的总分为:%.2f    ",t[1]);
    printf("\n沐枫的总分为:%.2f    ",t[2]);
    printf("\n沐玥的总分为:%.2f    ",t[3]);
}

1)可以只对部分元素赋初值,没有被赋值的元素自动取0

如: int a[2][3]={{1},{2}};

各个元素的值为 

1 0 0

2 0 0

2)如果对全部元素赋值了,则一维的长度可以不写

如: int a[2][3]={0,1,2,3,4,5}; 可写为int a[][3]={0,1,2,3,4,5};

3)C语言允许二维数组分解为多个一维数组

如二维数组a[3][4]可以分为3个一维数组,其数组名分别为:

a[0] , a[1] , a[2]

上面每个数组又有4个元素,比如a[0]有 a[0][0],a[0][1],a[0][2],a[0][3]

03--字符数组

形式与前面的数值数组相同

char c[5];

字符数组也可以数二维或者多维数组

char c[2][3]

字符数组的初始化

char c[]={'a','f','c',' ','l'};  长度为5

#include <stdio.h>
int main()
{
  int i,j;
  char a[][5]={{'H','e','l','l','o',},{'W','o','r','l','d'}};

  for(i=0;i<=1;i++)
    {
      for(j=0;j<=4;j++)
          printf("%c",a[i][j]);
      printf("\n");
    }
	return 0;
}

C语言允许用字符串的方式对数组作初始化赋值

例如:

char c[]={'H','e','l','l','o'};

可以写为:char c[]={"Hello"};

或者为char c[]="Hello"

用字符串方式赋值要比用字符逐个赋值要多占一个字节,多个字节用于存放字符串结束标志'\0'

#include <stdio.h>
int main()

{

  char c[]="Hello\nWorld";

  printf("%s\n",c);
  return 0;
}

由于使用的是"%s"字符串进行输出,只用写数组名就可以了,不可写为
  printf("%s\n",c[]);

#include <stdio.h>
int main()

{

  char st[15];

  printf("input string:\n");

  scanf("%s",st);

  printf("%s\n",st);
  return 0;
}

当用scanf函数输入字符串时,中间不能有空格,否则空格将作为结束符

可作如下改进:

#include <stdio.h>
int main()

{

  char st1[6],st2[6],st3[6],st4[6];

  printf("input string:\n");

  scanf("%s%s%s%s",st1,st2,st3,st4);

  printf("%s %s %s %s\n",st1,st2,st3,st4);
  return 0;
}

scanf一般以地址的方式出现,但在上面例子中没有使用&,这是因为C语言规定,数组名就代表了该数组的首地址

如: char c[5];  写作scanf("%s",&c);是错误的,只能写为scanf("%s",c);或者scanf("%s",&c[0]);

04--字符串处理函数

用于输入输出的字符串函数,需要包含头文件"stdio.h"

其他字符串函数需要包含头文件"string.h“

1.字符串输出函数 puts

格式: puts(字符数组名)

功能:把字符数组中的字符串输出到显示器

#include"stdio.h"

int main()

{

  char c[]="Hello\nWorld";

  puts(c);
  return 0;
}

2.字符串输入函数 gets

格式: gets(字符数组名)

功能:输入设备上输入一个字符串

#include"stdio.h"

int main()

{

  char st[15];

  printf("input string:\n");

  gets(st);

  puts(st);
  return 0;
}

3.字符串连接函数 strcat

格式: strcat(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串连接到字符数组1中字符串后面,并删去字符串1后的"\0"

#include"stdio.h"
#include"string.h"
int main()
{
  static char st1[30]="My name is ";
  char st2[10];
  printf("input your name:\n");
  gets(st2);
  strcat(st1,st2);

  puts(st1);
  return 0;
}

4.字符串拷贝函数 strcpy

格式: strcpy(字符数组名1,字符数组名2)

功能:把字符数组2中的字符串拷贝到字符数组1中,串结束标志"\0"一起拷贝。相当于把一个字符串赋予一个字符数组。

#include"stdio.h"
#include"string.h"

int main()

{

  char st1[15]="I love you",st2[]="C Language";

  strcpy(st1,st2);

  puts(st1);printf("\n");
  return 0;
}

5.字符串比较函数 strcmp

格式: strcmp(字符数组名1,字符数组名2)

功能:按照ASCII顺序比较两个数组中的字符串,字符串1=字符串2,返回值=0;

字符串1>字符串2,返回值>0;字符串1<字符串2,返回值<0;

#include"stdio.h"
#include"string.h"

int main()
{ int k;
  static char st1[15],st2[]="C Language";
  printf("input a string:\n");
  gets(st1);
  k=strcmp(st1,st2);
  if(k==0) printf("st1=st2\n");
  if(k>0) printf("st1>st2\n");
  if(k<0) printf("st1<st2\n");
  return 0;
}

6.字符串长度函数 strlen

格式: strlen(字符数组名)

功能:测字符串的实际长度(不含结束标志'\0')并作为函数返回值

#include"stdio.h"
#include"string.h"

int main()

{ int k;

  static char st[]="C language";

  k=strlen(st);

  printf("The lenth of the string is %d\n",k);
  return 0;
}

#include"stdio.h"
#include"string.h"
int main()

{
    char st[20],cs[5][20];
    int i,j,p;
    printf("input country's name:\n");

    for(i=0;i<5;i++)
      gets(cs[i]);

    printf("\n");
    for(i=0;i<5;i++)
      { p=i;strcpy(st,cs[i]);
    for(j=i+1;j<5;j++)
      if(strcmp(cs[j],st)<0) {p=j;strcpy(st,cs[j]);}
    if(p!=i)
      {
	    strcpy(st,cs[i]);	
	    strcpy(cs[i],cs[p]);	
	    strcpy(cs[p],st);
      }
    puts(cs[i]);}printf("\n");
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

因 Mysql root 密码过于简单导致 Mysql 连接失败的解决方法

问题&#xff1a; Access denied for user ‘root’‘192.168.xx.xx’ (using password: YES) 用户“root”“192.168.xx.xx”的访问被拒绝&#xff08;使用密码&#xff1a;YES&#xff09; 解决方法&#xff1a; 1、使用root用户登录mysql&#xff0c;通过下面的命令给ro…

数据管理能力成熟度评估模型DCMM

一、引言 DCMM&#xff08;Data Management Capability Maturity Assessment Model&#xff0c;数据管理能力成熟度评估模型&#xff09;是我国首个数据管理领域国家标准&#xff08;GB/T 36073-2018&#xff09;&#xff0c;由中国国家标准化管理委员会于2018年3月15日发布&am…

FreeRTOS基础入门——FreeRTOS信号量及二值信号量(十三)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

智联云采 SRM2.0 autologin 身份认证绕过漏洞复现

0x01 产品简介 智联云采是一款针对企业供应链管理难题及智能化转型升级需求而设计的解决方案,针对企业供应链管理难题,及智能化转型升级需求,智联云采依托人工智能、物联网、大数据、云等技术,通过软硬件系统化方案,帮助企业实现供应商关系管理和采购线上化、移动化、智能…

【王树森】RNN模型与NLP应用(4/9):LSTM模型(个人向笔记)

前言 LSTM是对Simple RNN的改进&#xff0c;可以避免梯度消失的问题&#xff0c;能够有更长的记忆力。 LSTM 1. LSTM:Conveyor Belt 过去的信息 C t − 1 C_{t-1} Ct−1​ 通过一个传输带直接输送到下一个状态 C t C_t Ct​&#xff0c;不会发生太大的变化&#xff0c;由此…

激活函数 Sigmod 及其导数

文章目录 1. Sigmod 函数2. 取值3. 图像4. 导数 1. Sigmod 函数 Sigmod 函数是神经网络中最常用的激活函数之一&#xff0c;其形式如下&#xff1a; sigmod ( x ) f ( x ) 1 1 e − x . \text{sigmod}(x) f(x) \frac{1}{1 e^{-x}}. sigmod(x)f(x)1e−x1​. 2. 取值 分…

大模型理论基础

大模型理论基础与学习路径 1.大模型的理论基础&#xff0c;包括深度学习、预训练语言模型和大语言模型。 2.学习大模型开发的路径&#xff0c;包括理论学习、实践操作和项目应用。 3.如何通过理论学习提升上限&#xff0c;为深入学习大模型奠定基础。 GPT模型家族技术发展 1.GP…

数据结构——堆排序

目录 引言 堆排序 1.算法思想 2.算法步骤 3.代码实现 3.1 构建堆 (1)小堆 (2)大堆 3.2 交换与调整 3.3 重复上述过程 4.复杂度分析 5.完整代码 5.1算法实现代码 5.2 示例 6.堆排序的优势 结束语 引言 本篇博客&#xff0c;我们将利用堆结构实现的高效排序算法…

版本控制的核心:Git中的哈希与默克尔树解析

Git是最常用的代码版本控制工具。它帮助我们跟踪代码的更改、管理代码版本&#xff0c;同时保证代码库的完整性和安全性。我们知道 Git 中有一些基本的操作&#xff0c;比如commit、merge、rebase等&#xff0c;但这些操作的底层机制是如何实现的呢&#xff1f;哈希函数和默克尔…

深度学习|模型推理:端到端任务处理

文章目录 引言端到端的能力任务与模型简介手写数字识别数据准备训练集与测试集模型介绍 推理过程前向传播权重参数推理与评估 结语 引言 通过前文「深度学习&#xff5c;感知机&#xff1a;神经网络之始」中 XOR Gate 的示例&#xff0c;我们知道叠加层可以增强感知机的表达能…

单向链表排序及双向链表

单向链表的优缺点 优点&#xff1a;存储空间没有上限&#xff0c;插入删除效率高 缺点&#xff1a;修改和查找效率低&#xff0c;只能单向的向后遍历后续节点&#xff0c;不能向前遍历前驱节点 单向链表快慢指针法查找&#xff1a; 链表的排序 双向链表 由于单向链表只能通…

Linux 性能调优:策略与实践

引言 随着云计算和虚拟化技术的发展&#xff0c;Linux 已经成为企业和个人用户的首选操作系统。Linux 性能调优不仅有助于提高系统资源利用率&#xff0c;还能确保应用程序的高效运行。本文将探讨 Linux 性能调优的基本原则、常用工具和方法&#xff0c;以及实际案例分析。 一…

go中的并发处理

. Goroutines 概念&#xff1a; Goroutines 是 Go 的核心并发机制。它们是由 Go 运行时管理的轻量级线程&#xff0c;具有比操作系统线程更少的开销。每个 goroutine 只需少量的内存&#xff08;大约 2KB&#xff09;&#xff0c;并且由 Go 运行时负责调度和管理,哪怕是java发…

哈希表与统计——594、350、554、609、454(2简3中)

594. 最长和谐子序列&#xff08;简单&#xff09; 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums &#xff0c;请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列&a…

华大HC32F460移植FreeRTOS

参考&#xff1a; 关于MCU M4内核移植FreeRTOS的笔记 主要参考这位大佬的&#xff0c;照做就行了&#xff0c;用的也是IAR HC32F460 freeRTOS移植 这位是用Keil的 MCU&#xff1a;华大HC32F460 库版本&#xff1a;hc32f460_ddl_Rev2.2.0 IDE&#xff1a; IAR FreeRTOS版本&…

【多线程】概述

进程与线程 概述 一个正在运行过程中的程序&#xff0c;就是一个进程&#xff0c;也称一个任务。进程是一个重要的软件资源&#xff0c;是由操作系统内核管理和组织的。 并行&#xff1a;微观上同一个时刻&#xff0c;两个核心上的进程&#xff0c;就是同时进行的。 并发&…

遗传算法Github初学

遗传算法的理论是根据达尔文进化论而设计出来的算法&#xff1a;人类是朝着好的方向&#xff08;最优解&#xff09;进化&#xff0c;进化过程中&#xff0c;会自动选择优良基因&#xff0c;淘汰劣等基因 遗传算法&#xff08;genetic algorithm——GA&#xff09;是计算数学中…

【JavaScript】LeetCode:11-15

文章目录 11 最长连续序列12 移动零13 盛最多水的容器14 三数之和15 接雨水 11 最长连续序列 数组排序、去重遍历数组中的元素&#xff0c;当元素连续时&#xff0c;长度加1&#xff0c;当不连续时&#xff0c;长度设置为1。 /*** param {number[]} nums* return {number}*/ v…

AI科学家:自动化科研的未来之路

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;AI已经在众多领域中展现了强大的潜力&#xff0c;尤其是在科研方面的应用正在引起广泛关注。最近&#xff0c;Sakana AI与牛津大学和不列颠哥伦比亚大学联合推出了一款被称为“AI科学家”的自动化科研工具&am…

第4章-01-学会从Chrome浏览器中Network

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…