第六章,数组
例6.1 对10个数组元素赋值0-9,按要求逆序输出
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int str[10];
for (int i = 0; i < 10; i++) {//下标0-9
str[i] = i;
}
for (int j = 9; j >= 0; j--) {//下标从9开始,逆序输出
printf("%d ", str[j]);//输出数组元素
}
return 0;
}
例6.2,用数组实现斐波那契数列,算40个数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int str[100];
str[0] = str[1] = 1;//前两个数先初始化一下
int sum = 0;
for (int i = 2; i < 40; i++) {
str[i] = str[i - 1] + str[i - 2];//这个i-1,i-2太妙了
}
for (int j = 0; j < 40; j++) {
if (j % 5 == 0&&j!=0) {//要排除掉0%5的情况,第一行不能空一行
printf("\n");
}
printf("%d ", str[j]);
}
return 0;
}
有十个数要求从小到大排序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//rand()的头文件
int main() {
int str[20];
int temp;//中间变量
for (int i = 0; i < 10; i++) {
str[i] = rand();//随机生成数,不想自己写数了,要写头文件
}
for (int i = 0; i < 10; i++) {
for (int j = i; j < 10; j++) {
if (str[i] > str[j]) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", str[i]);//从小到大输出
}
return 0;
}
例6.4将一个二行三列的二维数组行列互换
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int str[2][3];//还有一个方法是建立两个二维数组,把a[i][j]=b[j][i];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
scanf("%d", &str[i][j]); //输入一个二维数组
}
}
printf("交换前:\n");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", str[i][j]);
}
printf("\n");
}
printf("交换后:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 2; j++) {
printf("%d ", str[j][i]);//把下标都写下来找规律
}
printf("\n");
}
return 0;
}
例6.5,有一个3*4的二维数组,找出最大的数,并输出他的行列下标
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int str[3][4];
int max;//保存最大值
int row, col;//行标和列标
int temp;//中间变量
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
scanf("%d", &str[i][j]);//输入三行四列数
}
}
printf("输出数组\n");
for (int i = 0; i < 3; i++) {//一定要先输出,再去找最大值,因为在比较的过程中会交换值
for (int j = 0; j < 4; j++) {
printf("%d ", str[i][j]);//先把输入的数按顺序输出一下,好看结果
}
printf("\n");
}
printf("\n");
max = str[0][0];//把第一个值给最大值
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
if (str[i][j] > max) {
temp = str[i][j];
str[i][j] = max;
max = temp;
row = i;
col = j;
}
}
}
printf("%d %d %d", max, row, col);
return 0;
}
例6.6输出一个已知的字符串
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char str[] = { 'I','a','m','.' };//每一个字符用单引号和逗号隔开
//int n = strlen(str);(只能求字符串长度,里面不能有别的符号
int n = sizeof(str) / sizeof(str[0]);//计算字符串长度
for (int i = 0; i < n; i++) {
printf("%c ", str[i]);//输出字符串
}
return 0;
}
常用字符串函数
strcpy(复制),strcmp(比较),srlen(长度),strlwr(转小写字母),strupr(转大写), strcat(连接)
isalpha(是字母),isdigit(是数字),isspace(是空格)加头文件ctype.h
例6.8输入一行字符,统计其中有多少个单词
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>
int main() {
char str[100];
int sum = 0;
fgets(str, 100, stdin);
int n = sizeof(str) / sizeof(str[0]);
for (int i = 0; str[i] != '\0'; i++) {
if (isalpha(str[i]) && !isalpha(str[i + 1])){//这个判断是不是字母的函数要记住isalpha
sum++;
}
}
printf("%d", sum);
return 0;
}
例6.9有三个字符串,比较
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//上一个是用二维数组做的,虽然可能更简单,但没有一维好想
int main() {
char str1[20]="";
char str2[20]="";
char str3[20]="";
scanf("%s", &str1);//会给一个返回值被忽略的警告,但我不知道什么意思
scanf("%s", &str2);
scanf("%s", &str3);
char max[20]="";
if (strcmp(str1, str2) > 0) {//比较函数,大于0则前面的那个大
strcpy(max, str1);
}
else {
strcpy(max, str2);//数组不能整体给,要用strcpy
}
if (strcmp(max, str3) < 0) {
strcpy(max, str3);
}
int i;
i = 0;//输出方式一,要想结尾有\必须将字符串初始化
while (max[i] != '\0') {
printf("%c", max[i]);
i++;
}
printf("\n");
printf("%s", max);//输出方式二,直接输出
return 0;
}
/*选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序。
从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,
然后将第二个数字与剩下数字中最小的那个交换位置,以此类推,直到最后一个数字。*/
题2,用选择法对十个数排序,从大到小
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//生成随机数的头文件
int main() {
int str[20];
int i;
int j;
int min;
int temp;
for (i = 0; i < 10; i++) {
str[i] = rand();//生成随机数,不想自己写数了
//scanf("%d", &str[i]);
}
for (i = 0; i < 10; i++) {//定义了一个min始终指向最左边的数,但不定义也可以吧
min = i;
for (j = i; j < 10; j++) {
if (str[j] > str[min]) {
temp = str[j];
str[j] = str[min];
str[min] = temp;
}
/*if (str[j] > str[i]) {//不用min直接用i,j比较,也没问题
temp = str[j];
str[j] = str[i];
str[i] = temp;
}*/
}
}
for (i = 0; i < 10; i++) {
printf("%d ", str[i]);
}
return 0;
}
/*冒泡法排序是指:在排序时,每次比较数组中的相邻两个数组元素的值,
将较小的数排在较大的数前面。*/
扩展:冒泡排序
//个人觉得冒泡不如选择好理解哎,但冒泡好写
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int str[100];
int temp;
for (int i = 0; i < 10; i++) {
str[i] = rand();
}
for (int i = 0; i < 9; i++) {//管从头到尾排几趟的
for (int j = 0; j < 9 - i; j++) {
if (str[j] > str[j + 1]) {//自己跟自己的下一个比
temp = str[j];
str[j] = str[j + 1];
str[j + 1] = temp;
}
}
}
for (int i = 0; i < 10; i++) {
printf("%d ", str[i]);
}
return 0;
}