目录

C语言初尝试洛谷

C语言初尝试——洛谷

一、C数组:

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

声明数组

在 C 中要声明一个数组,需要指定元素的类型和元素的数量,如下所示:


type arrayName [ arraySize ];

初始化数组

在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:


double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

访问数组元素

数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:


double salary = balance[9];

获取数组长度

数组长度可以使用 sizeof 运算符来获取数组的长度,例如:


int numbers[] = {1, 2, 3, 4, 5};
int length = sizeof(numbers) / sizeof(numbers[0]);

利用数组解决问题:

1.将数组逆序重存放:

https://i-blog.csdnimg.cn/direct/78483c7824c2423bbc233bea71804d02.png


#include <stdio.h>

int main() {
	int n;
	int a[500];
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	for (int i = n; i >= 1; i--) {
		printf("%d ", a[i]);
	}
	return 0;
}

2.年龄与疾病:

https://i-blog.csdnimg.cn/direct/fb30689ef8c440d2aa944143da97a118.png


#include <stdio.h>

int main() {
	int a;
	scanf("%d", &a);

	int arr[100];
	float count18 = 0;
	float count35 = 0;
	float count60 = 0;
	float count61 = 0;
	for (int i = 0; i < a; i++) {
		scanf("%d", &arr[i]);
		int age = arr[i];
		for	(int i = 0; i < a; i++) {
			if ( age <= 18) {
				count18++;
			} else if ( age <= 35) {
				count35++;
			} else if (age <= 60) {
				count60++;
			} else {
				count61++;
			}
		}

	}
	printf("%.2f%%\n", count18 / a * 10 );
	printf("%.2f%%\n", count35 / a * 10 );
	printf("%.2f%%\n", count60 / a * 10 );
	printf("%.2f%%\n", count61 / a * 10 );

}

3.向量点积计算:

https://i-blog.csdnimg.cn/direct/d6fff20f6de14c1ea75a3d74589ce5ab.png


#include <stdio.h>
int main() {
	int a;
	scanf("%d", &a);

	int arr[1000];
	int brr[1000];
	for (int i = 0; i < a; i++) {
		scanf("%d", &arr[i]);
	}
	for (int i = 0; i < a; i++) {
		scanf("%d", &brr[i]);
	}

	int num = 0;
	for (int i = 0; i < a; i++) {
		num += arr[i] * brr[i];
	}

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

}

4.开关灯:

https://i-blog.csdnimg.cn/direct/c3dc2ac706d8497494a99ca7fbc4a1d2.png

错误提交代码:


#include <stdio.h>

int main() {
	int N;
	scanf("%d", &N);
	int arr[5000];

	for (int i = 1; i * i <= N; i++) {
		printf("%d", i * i);
	}
}

错误原因:

仅寻找表层规律,认为只需要输出样例范围内给出的平方数,不可能适用于所有条件,遗憾仅得10分。

改正代码:


#include <stdio.h>
#include <stdbool.h>



int main() {
	int N;
	scanf("%d", &N);
	// 初始化灯的状态:true表示开,false表示关,初始全部为开
	bool light[N];
	for (int i = 1; i <= N; ++i) {
		light[i] = true;
	}
	for (int k = 1; k <= N; ++k) {
		for (int i = k; i <= N; i += k) {
			light[i] = !light[i];
		}
	}
	bool isFirst = true;

	for (int i = 1; i <= N; ++i) {
		if (!light[i]) {
			if (isFirst) {
				printf("%d", i);
				isFirst = false;
			} else {
				printf(" %d", i);
			}
		}
	}
	return 0;
}

二、字符串:

C 字符串

在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。

空字符(Null character)又称结束符,缩写 NUL,是一个数值为 0 的控制字符,\0 是转义字符,意思是告诉编译器,这不是字符 0,而是空字符。

下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词 RUNOOB 的字符数多一个。


char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};

依据数组初始化规则,您可以把上面的语句写成以下语句:


char site[] = "RUNOOB";

C 中有大量操作字符串的函数:

序号函数 & 目的
1strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
2strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
3strlen(s1); 返回字符串 s1 的长度。
4strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
5strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
6strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

下面的实例使用了上述的一些函数:

实例


#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[14] = "runoob";
   char str2[14] = "google";
   char str3[14];
   int  len ;
 
   /* 复制 str1 到 str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1) :  %s\n", str3 );
 
   /* 连接 str1 和 str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2):   %s\n", str1 );
 
   /* 连接后,str1 的总长度 */
   len = strlen(str1);
   printf("strlen(str1) :  %d\n", len );
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:


strcpy( str3, str1) :  runoob
strcat( str1, str2):   runoobgoogle
strlen(str1) :  12

利用字符串解决问题:

1.统计数字字符个数:

https://i-blog.csdnimg.cn/direct/d8a9b81d4b634adfa3f26b931283fdde.png


#include <stdio.h>
#include <string.h>

int main() {
	char arr[500];
	scanf("%[^\n]", &arr);
	int len = strlen(arr);
	int count = 0;

	for (int i = 0; i < len; i++) {
		char c = arr[i];
		if (c >= '0' && c <= '9') {
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

2.输出亲朋字符串:

https://i-blog.csdnimg.cn/direct/3792e1f9603c49d7882b214872b51180.png


#include <stdio.h>
#include <cstring>

int main() {
	char s[1000];
	scanf("%s", s);
	int len = strlen(s);

	for (int i = 0; i < len; i++) {
		char c = s[i];// 获取当前索引i对应的字符
		char n;// 定义变量n,用于存储下一个字符
		// 判断当前字符是否是字符串的最后一个字符
		if (i == len - 1) {
			n = s[0];// 如果是最后一个字符,下一个字符取第一个字符
		} else {
			n = s[i + 1];//否则下一个字符取当前字符的后一位字符
		}
		printf("%c", c + n);// 输出当前字符c与下一个字符n的ASCII值相加后得到的新字符
	}
	return 0;
}