C语言数组与字符串综合实践
实验一:一维数组内存布局分析
#include <stdio.h>
#include <stdlib.h>
#define SIZE 4
void analyze_int_array() {
int numbers[SIZE] = {5, 8, 3, 7};
int index;
printf("整型数组占用内存: %zu字节\n", sizeof(numbers));
for (index = 0; index < SIZE; ++index)
printf("地址%p: 数值%d\n", &numbers[index], numbers[index]);
printf("数组首地址: %p\n", numbers);
}
void analyze_char_array() {
char chars[SIZE] = {'A', 'B', 'C', 'D'};
int index;
printf("字符数组占用内存: %zu字节\n", sizeof(chars));
for (index = 0; index < SIZE; ++index)
printf("地址%p: 字符%c\n", &chars[index], chars[index]);
printf("数组首地址: %p\n", chars);
}
int main() {
printf("分析一: 整型数组内存分布\n");
analyze_int_array();
printf("\n分析二: 字符数组内存分布\n");
analyze_char_array();
system("pause");
return 0;
}
实验观察:整型数组元素在内存中连续分配,每个元素占用4字节;字符数组同样连续分配,每个元素占用1字节。
实验二:二维数组存储特性研究
#include <stdio.h>
#include <stdlib.h>
#define ROWS 2
#define COLS 4
void analyze_int_matrix() {
int matrix[ROWS][COLS] = {{10, 20, 30, 40}, {50, 60, 70, 80}};
int row, col;
printf("整型矩阵占用内存: %zu字节\n", sizeof(matrix));
for (row = 0; row < ROWS; ++row)
for (col = 0; col < COLS; ++col)
printf("地址%p: 数值%d\n", &matrix[row][col], matrix[row][col]);
printf("\n");
printf("矩阵地址%p\n", matrix);
printf("第一行地址%p\n", matrix[0]);
printf("第二行地址%p\n", matrix[1]);
printf("\n");
}
void analyze_char_matrix() {
char grid[ROWS][COLS] = {{'W', 'X', 'Y', 'Z'}, {'P', 'Q', 'R', 'S'}};
int row, col;
printf("字符矩阵占用内存: %zu字节\n", sizeof(grid));
for (row = 0; row < ROWS; ++row)
for (col = 0; col < COLS; ++col)
printf("地址%p: 字符%c\n", &grid[row][col], grid[row][col]);
printf("\n");
printf("矩阵地址%p\n", grid);
printf("第一行地址%p\n", grid[0]);
printf("第二行地址%p\n", grid[1]);
}
int main() {
printf("测试一: 整型二维数组");
analyze_int_matrix();
printf("\n测试二: 字符二维数组");
analyze_char_matrix();
system("pause");
return 0;
}
实验结论:二维数组按行优先顺序连续存储,相邻行地址差值等于一行元素占用的总字节数。
实验三:字符串交换实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 80
void exchange_strings(char dest[], char src[]);
void test_single_arrays();
void test_double_array();
int main() {
printf("测试一: 使用两个独立一维数组\n");
test_single_arrays();
printf("\n测试二: 使用二维数组行\n");
test_double_array();
system("pause");
return 0;
}
void test_single_arrays() {
char text1[MAXLEN] = "hello world, nice to meet you";
char text2[MAXLEN] = "goodbye world, see you later";
printf("交换前: \n");
puts(text1);
puts(text2);
exchange_strings(text1, text2);
printf("交换后: \n");
puts(text1);
puts(text2);
}
void test_double_array() {
char texts[2][MAXLEN] = {"hello world, nice to meet you",
"goodbye world, see you later"};
printf("交换前: \n");
puts(texts[0]);
puts(texts[1]);
exchange_strings(texts[0], texts[1]);
printf("交换后: \n");
puts(texts[0]);
puts(texts[1]);
}
void exchange_strings(char dest[MAXLEN], char src[MAXLEN]) {
char buffer[MAXLEN];
strcpy(buffer, dest);
strcpy(dest, src);
strcpy(src, buffer);
}
思考总结:一维数组名代表数组起始地址;二维数组名指向第一行,每行可视为独立的一维数组。
实验四:英文文本单词统计
#include <stdio.h>
#include <stdlib.h>
#define BUFFER 80
int word_counter(char text[]);
int main() {
char sentence[BUFFER+1];
int count;
while(gets(sentence) != NULL) {
count = word_counter(sentence);
printf("检测到的单词数量: %d\n\n", count);
}
system("pause");
return 0;
}
int word_counter(char text[]) {
int pos;
int in_word = 0;
int total = 0;
for(pos = 0; text[pos] != '\0'; pos++) {
if(text[pos] == ' ')
in_word = 0;
else if(in_word == 0) {
in_word = 1;
total++;
}
}
return total;
}
实验五:最长单词查找算法
#include <stdio.h>
#include <stdlib.h>
#define MAX_TEXT 1000
int main() {
char content[MAX_TEXT];
int current_len;
int longest_len;
int end_pos;
int idx;
while(gets(content) != NULL) {
current_len = 0;
longest_len = 0;
end_pos = 0;
idx = 0;
while(1) {
while(content[idx] == ' ') {
current_len = 0;
idx++;
}
while(content[idx] != '\0' && content[idx] != ' ') {
current_len++;
idx++;
}
if(longest_len < current_len) {
longest_len = current_len;
end_pos = idx;
}
if(content[idx] == '\0')
break;
}
printf("最长单词: ");
for(idx = end_pos - longest_len; idx < end_pos; ++idx)
printf("%c", content[idx]);
printf("\n\n");
}
system("pause");
return 0;
}
实验六:进制转换工具
#include <stdio.h>
#include <stdlib.h>
#define MAX_DIGITS 100
void convert_base(int value, int base);
int main() {
int decimal;
printf("请输入十进制整数: ");
while(scanf("%d", &decimal) != EOF) {
convert_base(decimal, 2);
convert_base(decimal, 8);
convert_base(decimal, 16);
printf("\n请输入十进制整数: ");
}
system("pause");
return 0;
}
void convert_base(int value, int base){
char result[MAX_DIGITS];
char digits[17]="0123456789ABCDEF";
int quotient, remainder;
int position, index;
position = 0;
while(1) {
quotient = value / base;
remainder = value % base;
result[position++] = digits[remainder];
if(quotient == 0)
break;
value = quotient;
}
for(index = position - 1; index >= 0; --index)
printf("%c", result[index]);
printf("\n");
}
实验七:成绩管理系统
#include <stdio.h>
#include <stdlib.h>
#define STUDENTS 5
void collect_data(int scores[], int count);
void display_data(int scores[], int count);
double calculate_average(int scores[], int count);
void sort_descending(int scores[], int count);
int main() {
int grades[STUDENTS];
double avg;
printf("请录入%d个学生成绩:\n", STUDENTS);
collect_data(grades, STUDENTS);
printf("\n原始成绩数据: \n");
display_data(grades, STUDENTS);
printf("\n正在处理数据: 计算平均分并排序...\n");
avg = calculate_average(grades, STUDENTS);
sort_descending(grades, STUDENTS);
printf("\n平均成绩: %.2f\n", avg);
printf("\n排序后成绩(从高到低):\n");
display_data(grades, STUDENTS);
system("pause");
return 0;
}
void collect_data(int scores[], int count) {
int i;
for(i = 0; i < count; ++i)
scanf("%d", &scores[i]);
}
void display_data(int scores[], int count) {
int i;
for(i = 0; i < count; ++i)
printf("%d ", scores[i]);
printf("\n");
}
double calculate_average(int scores[], int count){
int i;
int total = 0;
double mean;
for(i = 0; i < count; ++i){
total = total + scores[i];
}
mean = (double)total / count;
return mean;
}
void sort_descending(int scores[], int count){
int i, j, temp;
for(j = 0; j < count - 1; j++)
for(i = 0; i < count - j - 1; i++)
if(scores[i] < scores[i + 1])
{
temp = scores[i];
scores[i] = scores[i + 1];
scores[i + 1] = temp;
}
}
实验八:姓名字典排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define COUNT 5
#define LENGTH 20
void show_names(char list[][LENGTH], int num);
void sort_lexicographically(char list[][LENGTH], int num);
int main() {
char people[][LENGTH] = {"Alice", "Bob", "Charlie", "David", "Eve"};
int i;
printf("初始名单:\n");
show_names(people, COUNT);
printf("\n执行字典排序...\n");
sort_lexicographically(people, COUNT);
printf("\n排序后名单:\n");
show_names(people, COUNT);
system("pause");
return 0;
}
void show_names(char list[][LENGTH], int num) {
int i;
for(i = 0; i < num; ++i)
printf("%s\n", list[i]);
}
void sort_lexicographically(char list[][LENGTH], int num){
int i, j;
char swap[LENGTH];
for(j = 0; j < num - 1; j++){
for(i = 0; i < num - j - 1; i++){
if(strcmp(list[i], list[i + 1]) > 0){
strcpy(swap, list[i]);
strcpy(list[i], list[i + 1]);
strcpy(list[i + 1], swap);
}
}
}
}
实验九:数字重复检测
#include <stdio.h>
#include <stdlib.h>
#define MAX_INPUT 105
int has_duplicate(char input[]);
int main(){
char number[MAX_INPUT];
while(scanf("%s", number) != EOF){
if(has_duplicate(number))
printf("存在重复\n");
else
printf("无重复\n");
}
system("pause");
return 0;
}
int has_duplicate(char input[]){
int digit_count[10] = {0};
int i, digit;
for(i = 0; input[i] != '\0'; ++i){
digit = input[i] - '0';
digit_count[digit]++;
if(digit_count[digit] > 1)
return 1;
}
return 0;
}
实验十:矩阵循环移位
#include <stdio.h>
#include <stdlib.h>
#define ROWS 4
#define COLS 4
void display_matrix(int data[][COLS], int size);
void shift_right(int data[][COLS], int size);
int main() {
int matrix[ROWS][COLS] = {{11, 22, 33, 44},
{55, 66, 77, 88},
{99, 10, 20, 30},
{40, 50, 60, 70}};
printf("原始矩阵:\n");
display_matrix(matrix, ROWS);
shift_right(matrix, ROWS);
printf("右移一位后:\n");
display_matrix(matrix, ROWS);
system("pause");
return 0;
}
void display_matrix(int data[][COLS], int size) {
int i, j;
for (i = 0; i < size; ++i) {
for (j = 0; j < size; ++j)
printf("%4d", data[i][j]);
printf("\n");
}
}
void shift_right(int data[][COLS], int size){
int i, j;
int last_element;
for(i = 0; i < size; i++){
last_element = data[i][size - 1];
for(j = size - 1; j > 0; j--){
data[i][j] = data[i][j - 1];
}
data[i][0] = last_element;
}
}