mook网c语言入门之数组,字符串

同样我们在程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组。可以将数组理解为大小固定,所放物品为同类的一个购物袋,在该购物袋中的物品是按一定顺序放置的。

声明:

数据类型    数组名称[长度];


初始化:

 数据类型 数组名称[长度n] = {元素1,元素2…元素n};

2、 数据类型 数组名称[] = {元素1,元素2…元素n};

3、 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n] = 元素n+1;


获取:

获取数组元素时: 数组名称[元素所对应下标]; 

如:初始化一个数组 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。

注意:

1、数组的下标均以0开始;

2、数组在初始化的时候,数组内元素的个数不能大于声明的数组长度;

3、如果采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0;

4、在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。


数组遍历:

注意:

1、最好避免出现数组越界访问,循环变量最好不要超出数组的长度,比如:

2、C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法。

由于C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并通过,但是结果就不能肯定了,因此还是不要越界或者改变数组的长度


1,整个数组当作函数参数,即把数组名称传入函数中,例如:

注意是 temp(arr)传的是数组名  而非  arr[]


2、数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:


数组作为函数参数时注意以下事项:

1、数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。

2、数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致


任务

替换指定数组中的最大元素。要求指定整数为数组arr2中的第一个元素arr2[0]。

#include <stdio.h>
void replaceMax(int arr[],int value)
{
    int max = arr[0];
    int index = 0;
    int i;
    for(i=1;i<5;i++)
    {
        if(arr[i]>max)
        {
            max=arr[i];          //将数组中较大的数赋值给max
            index = i;  //记录当前索引
        }                
    }  
    arr[index] = value;
}


int main()
{
    int arr1[] = {10,41,3,12,22};
    int arr2[] = {1,2,3,4,5};
    int i;
    replaceMax(arr1, arr2[0]); //将数组arr1和数组arr2的第一个元素传入函数中
    for(i=0;i<5;i++)
    {
        printf("%d ",arr1[i]);                
    }
    return 0;    
}

冒泡排序

以升序排序为例冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。



printf("%.2f, ", arr[i]);  //%.2f表示小数点后精确到两位

通过遍历实现数组元素的查找。比如以下程序实现在指定数组中查找指定元素的功能,如果找到该元素返回该元素的下标,否则返回-1:



#include <stdio.h>
int getIndex(int arr[5],int value)
{
    int i;
    int index;
    for(i=0;i<5;i++)
    {
       if(arr[i]==value)
       {
           index=i;
           break;//跳出当前循环,即不再继续了,不然还要遍历完???
       }
       else
       index=-1;
    }
    return index;
}


int main()
{
    int arr[5]={3,12,9,8,6};
    int value = 8;
    int index = getIndex(arr, value);      //这里应该传什么参数呢?
    if(index!=-1)
    {
        printf("%d在数组中存在,下标为:%d\n",value,index);             
    }
    else
    {
        printf("%d在数组中不存在。\n",value);    
    }
    return 0;    
}

字符串与数组

字符串是神马?字符串就是由多个字符组合而成的一段话。

在C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:

1、char 字符串名称[长度] = "字符串值";

2、char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'};

注意:

1、[]中的长度是可以省略不写的;

2、采用第2种方式的时候最后一个元素必须是'\0','\0'表示字符串的结束标志;

3、采用第2种方式的时候在数组中不能写中文

在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);。例如:

#include <stdio.h>
/* 定义say函数 */
void say(char string[])       //数组参数应该怎么写呢?  注意定义的时候数组参数的写法 string[]
{
        printf(" %s\n ",string);//打印字符串
}


int main()
{
    //定义字符串数组
    char string[] = "我在慕课网上学习IT技能!";
    say(string);                 //调用say函数输出字符串   注意调用的时候数组参数的写法  string
    return 0;
}



1、strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。比如:

2、strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小,例如:

3、strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝,比如:

strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,如:

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[100]="";
    char s2[]="我爱,";
    char s3[]="慕课网";
    /*在以下补全代码*/
    
    strcpy(s1,s2);
    strcat(s1,s3);
    printf("%s\n",s1);
    return 0;    
}

多维数组:

多维数组的定义格式是:

数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];


这样定义了一个名称为num数据类型为int二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。

我们可以把上面的数组看作一个3×3的矩阵,如下图:

多维数组的初始化与一维数组的初始化类似也是分两种:

1、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};

2、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;

多维数组初始化要注意以下事项:

1、采用第一种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数

2、采用第二种初始化时数组声明必须同时指定行和列的维数。


多维数组的遍历:

当输入前面的字会覆盖后面的  按insert进行转换

#include <stdio.h>
int main()
{
    int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int i,j;
    int sum=0;
    for(i=0;i<3;i++)
    {
       for(j=0;j<3;j++)
       {
           if(j==i||j+i==2)
           sum=sum+arr[i][j];  
       }
    }
    //sum=sum-arr[1][1];因为是判断每一个元素是否符合,并没有重复加,符合一个条件或是两个是一样的
    printf("对角线元素之和是:%d\n",sum);
    return 0;    
}


以上是求二维数组对角线的和


// ConsoleApplication12.cpp : 定义控制台应用程序的入口点。
//在一个长度为10的整型数组里面,保存了班级10个学生的考试成绩。要求编写5个函数,分别实现计算考试的总分,最高分,最低分,平均分和考试成绩降序排序。


#include "stdafx.h"
#include<iostream>
#include <stdio.h>
int sum;
int high;
int low;//写在函数外面的是全局变量
int total(int score[])//这里的形参前要加int
{
int all=0;
int i;
for (i = 0; i < 10; i++)
all = all + score[i];
printf("total=%d\n", all);
sum = all;
return 0;//每个函数要return一个值
}
int ave(int score[])
{
printf("ave=%d\n", sum / 10);
return 0;
}
int lowxu(int a[])
{


int temp;
int i,j;
for (i = 9; i>=0; i--)//冒泡法排序是两层循环 不是一层  而且是倒着换的
for(j=0;j<i;j++)
{
if (a[j] < a[j+ 1])
{
temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
for (i = 0; i < 10; i++)
{
printf("%d  ", a[i]);
}
printf("\n");
high = a[0];
low = a[9];
return 0;
}
int highvalue()
{
printf("high is %d\n", high);
return 0;
}
int lowvalue()
{
printf("low is %d\n", low);
return 0;
}
int main()
{
int score[] = { 67,98,75,63,82,79,81,91,66,84 };
total(score);
ave(score);
lowxu(score);
highvalue();
lowvalue();
system("pause");
return 0;
}

综合训练    要有自信哦   你也是很棒的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值