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

数组的定义 

基本概念: 

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

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

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

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

  • 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个数字,然后按反序输出(将一个数组中的值按逆序重新存放,例如原来的顺序为:86541.要求改为:14568;并将数组中的值输出) 

 

#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. 随机产生20100-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((unsignedtime(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个数) 

(例:{1345672983},找出重复数为3 

 

方法1:算数法 

#include <stdio.h> 

 

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

 

    int a[10] = {1345672983}; 

    

    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] = {1465672983}; 

 

    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: 

 

 

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; 

     

} 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值