您的位置:首页 > 编程语言 > C语言/C++

5. 04 C语言 数组,字符串

2015-05-20 01:09 211 查看
数组的定义

基本概念:

在定义数组时,计算机会分配一块连续的空间

定义方式为:类型 数组名[数组长度];

命名规则与变量命名规则相同(首字母小写、驼峰法)

数组长度定义后,就不能改变

Clang编译环境下,长度可以是变量。但是数组取的值,是定义数组时,变量的值。



字符串

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串(字符数组即元素为字符的数组)。并且将\0作为结束标志。

字符串定义

char string[10];

因为最后一位string[9]要留给\0,所以对于string来说,有效位应该是9位。

char string[]
= {'a', 'b', 'c', 'd'}; // 此时空间长度为4,只是字符数组

char string[]
= "abcd"; // 此时真正的空间长度是5,系统自动加了\0



#include <string.h>



strlen

功能:计算字符串长度

char string[10]
= "abc";

int length = strlen(string);





strcat

功能:把string2中的字符串连接到string1 中字符串的后面,并删去string1后的串标志“\0”。本函数返回值是string1的首地址。

注意:因为字符串会直接拼接给string1,所以要确保string1的长度够长,至少能装下拼接过来的string2。

char string1[10]
= "abc";

char string2[] = "def";



strcat(string1,
string2);



strcpy

功能:字符串拷贝,将string2拷贝给string1(把后一个拷贝给前一个)。

char string1[10]
= {};

char string2[] = "def";



strcpy(string1,
string2);



strcmp

功能:字符串比较。通过ASCII,比较两个字符串的大小。根据编译器不同,有的返回-1,
0, 1;有的返回相差多少(Clang返回相差多少)。

char string1[10]
= "abc";

char string2[] = "ard";



int a = strcmp(string1,
string2);

printf("%d",
a); // 输出-16







作业:

1. 编写一个C程序,接收用户输入的7个温度,然后求出7个温度的平均值,然后打印该平均值。



#include <stdio.h>



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

    

    double temp[7]
= {0.0};

    double sum = 0.0;

    double avgTemp = 0.0;

    

    printf("Input
each day's tempreture(last week): \n");

    

    for (int i
= 0; i < 7; i++) {

        

        scanf("%lf",
&temp[i]);

        sum += temp[i];

    }

    

    avgTemp = sum / 7;

    

    printf("Average
tempreture of this week: %.2f\n",avgTemp);

    return 0;

}





2. 循环录入5个数字,然后按反序输出(将一个数组中的值按逆序重新存放,例如原来的顺序为:8,6,5,4,1.要求改为:1,4,5,6,8;并将数组中的值输出)



#include <stdio.h>



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

    

    int num[5]
= {0};

    int temp[5]
= {0};

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

    

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

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

        temp[4 - i] = num[i];

    }

    

    for (int j
= 0; j < 5; j++) {

        printf("%d
", temp[j]);

    }

    return 0;

    

}





3. 随机产生20个100-200之间的正整数存放到数组中,并求数组中的所有元素最大值、最小值、平均值,然后将各元素的与平均值的差组成一个新数组。



#include <stdio.h>

#include <stdlib.h>

#include <time.h>



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

    

    unsigned int arr[20]
= {0};

    unsigned int new[20]
= {0};

    

    srand((unsigned) time(NULL));



//generate a radom number;

    printf("You've
got an radom number array[20]: \n");

    for (int i
= 0; i < 20; i++) {

        

        int a = 100,
b = 200;

  

        arr[i] = (rand() % (b - a + 1))
+ a;

        printf("%u
", arr[i]);

    }

    printf("\n\n");

    

//get max, min, avg

    

    int max = arr[0];

    int min = arr[0];

    int sum = 0;

    int avg = 0;

    

    for (int i
= 0; i < 20 ; i++) {

        if (max < arr[i]) {

            max = arr[i];

        }

        if (min > arr[i]) {

            min = arr[i];

        }

        

        sum += arr[i];

    }

    

    avg = sum / 20;

    

    printf("Max =
%d\n", max);

    printf("Min =
%d\n", min);

    printf("Avg =
%d\n\n", avg);

    

//generate new array

    

    printf("And your
new array[20]: \n");

    for (int i
= 0; i < 20 ; i++) {

        new[i] = arr[i] - avg;

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

    }

    printf("\n\n");

    

    

    return 0;

    

}







4. 数组有1000个元素,设数组a[1000],存放1-1000内的数值,但是现在有一个数值重复了,只遍历一次数组,找出那个重复的数。(注:本题可以先采用10个数做例子,不需要循环录入1000个数)

(例:{1,3,4,5,6,7,2,9,8,3},找出重复数为3)



方法1:算数法

#include <stdio.h>



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



    int a[10]
= {1, 3, 4, 5, 6, 7, 2, 9, 8, 3};

   

    int sum = 0;

    int temp = 0;

    int result = 0;

    

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

        temp += (i + 1);

        sum += a[i];

    }

    

    sum += a[9];

    

    result = sum - temp;

    

    printf("%d\n",
result);



    return 0;



}





方法2:填坑法

void question4() {

    

    int array[10]
= {1, 4, 6, 5, 6, 7, 2, 9, 8, 3};



    int array1[10]
= {0};



    // 遍历数组

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



        int index = array[i] - 1; // 得到一个下标

       

// 将index作为array1的下标

        if (array1[index] > 0)
{



            printf("%d是重复的",
array[i]);

            break;

        }

        array1[index] ++;

    }

}





reference:

/article/1617349.html

http://www.cnblogs.com/cysolo/p/3587314.html

http://buptdtt.blog.51cto.com/2369962/749049





5. 求整型数组(每个元素都是0-9的整数)中最长连续元素子串所组成的最大的数值。

测试数据

int arr1[] = {1,3,3,3,4,4,4,4,4,0,0,0,4,4,4,4},此例中由5个连续的4为最大连续子串,返回结果为44444.

int arr2[] = {1,3,3,3,4,4,4,4,4,0,0,0,0,0,0,5,5,5,5},返回44444;

int arr3[] = {1,3,3,3,5,5,5,5,5,4,4,4,4,4,0,0,0,0,0,0,4,4,4,4},返回55555;



#include <stdio.h>



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

    

//    int arr1[] = {1,3,3,3,4,4,4,4,4,0,0,0,4,4,4,4};

//    int arr2[] = {1,3,3,3,4,4,4,4,4,0,0,0,0,0,0,5,5,5,5};

    int arr3[] = {1,3,3,3,5,5,5,5,5,4,4,4,4,4,0,0,0,0,0,0,4,4,4,4};

    

  

    int length = sizeof(arr3)
/ sizeof(arr3[0]);

    

    long int sum
= arr3[length - 1];

    

    long int max
= sum;

    

    int index = 1;

    

    for (int i
= length - 1; i > 0; i--) {

        

        if (arr3[i] == arr3[i - 1])
{

           

            index *= 10;

            sum += arr3[i - 1] * index;

            if (max < sum) {



                max = sum;

            }

            

        } else {

            

            index = 1;

            sum = arr3[i -1];

            if (max < sum) {

                

                max = sum;

            }

        }

    }

    

    printf("max =
%ld\n", max);

    

    return 0;

    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: