数组的定义
基本概念:
-
在定义数组时,计算机会分配一块连续的空间
-
定义方式为:类型 数组名[数组长度];
-
命名规则与变量命名规则相同(首字母小写、驼峰法)
-
数组长度定义后,就不能改变
-
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:
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;
}