首页 > 编程语言 >实验5 C语言指针应用编程

实验5 C语言指针应用编程

时间:2024-05-23 21:44:14浏览次数:24  
标签:int s1 编程 C语言 char ++ str printf 指针

task1_1.c

#include <stdio.h>
#define N 5

void input(int x[], int n);
void output(int x[], int n);
void find_min_max(int x[], int n, int* pmin, int* pmax);

int main() {
    int a[N];
    int min, max;

    printf("录入%d个数据:\n", N);
    input(a, N);

    printf("数据是: \n");
    output(a, N);

    printf("数据处理...\n");
    find_min_max(a, N, &min, &max);

    printf("输出结果:\n");
    printf("min = %d, max = %d\n", min, max);

    return 0;
}

void input(int x[], int n) {
    int i;

    for (i = 0; i < n; ++i)
        scanf("%d", &x[i]);
}

void output(int x[], int n) {
    int i;

    for (i = 0; i < n; ++i)
        printf("%d ", x[i]);
    printf("\n");
}

void find_min_max(int x[], int n, int* pmin, int* pmax) {
    int i;

    *pmin = *pmax = x[0];

    for (i = 1; i < n; ++i)
        if (x[i] < *pmin)
            *pmin = x[i];
        else if (x[i] > *pmax)
            *pmax = x[i];
}

A:

1.find_min_max的功能是通过间接访问求出五个数据中的最大值和最小值。

2.指针变量pmin、pmax都指向x[0]的地址。

 

task1_2.c

#include <stdio.h>
#define N 5

void input(int x[], int n);
void output(int x[], int n);
int* find_max(int x[], int n);

int main() {
    int a[N];
    int* pmax;

    printf("录入%d个数据:\n", N);
    input(a, N);

    printf("数据是: \n");
    output(a, N);

    printf("数据处理...\n");
    pmax = find_max(a, N);

    printf("输出结果:\n");
    printf("max = %d\n", *pmax);

    return 0;
}

void input(int x[], int n) {
    int i;

    for (i = 0; i < n; ++i)
        scanf("%d", &x[i]);
}

void output(int x[], int n) {
    int i;

    for (i = 0; i < n; ++i)
        printf("%d ", x[i]);
    printf("\n");
}

int* find_max(int x[], int n) {
    int max_index = 0;
    int i;

    for (i = 1; i < n; ++i)
        if (x[i] > x[max_index])
            max_index = i;

    return &x[max_index];
}

A:

1.功能:返回最大值。

2.可以。

 

task2_1.c

#include <stdio.h>
#include <string.h>
#define N 80

int main() {
    char s1[] = "Learning makes me happy";
    char s2[] = "Learning makes me sleepy";
    char tmp[N];

    printf("sizeof(s1) vs. strlen(s1): \n");
    printf("sizeof(s1) = %d\n", sizeof(s1));
    printf("strlen(s1) = %d\n", strlen(s1));

    printf("\nbefore swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);

    printf("\nswapping...\n");
    strcpy(tmp, s1);
    strcpy(s1, s2);
    strcpy(s2, tmp);

    printf("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);

    return 0;
}

 

A:

1.数组s1的大小是24字节,sizeof(s1)计算的是s1的字节长度,strlen(s1)计算的是s1的实际长度(不算空字符);

2.line6代码不能替换,因为数组名即数组首地址,是常量,不能对数组做赋值操作。

3.line19-21执行后,字符数组s1和s2中的内容发生交换.

 

task2_2.c

#include <stdio.h>
#include <string.h>
#define N 80

int main() {
    char* s1 = "Learning makes me happy";
    char* s2 = "Learning makes me sleepy";
    char* tmp;

    printf("sizeof(s1) vs. strlen(s1): \n");
    printf("sizeof(s1) = %d\n", sizeof(s1));
    printf("strlen(s1) = %d\n", strlen(s1));

    printf("\nbefore swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);

    printf("\nswapping...\n");
    tmp = s1;
    s1 = s2;
    s2 = tmp;

    printf("\nafter swap: \n");
    printf("s1: %s\n", s1);
    printf("s2: %s\n", s2);

    return 0;
}

 

A:

1.指针变量s1里面存放的是指向字符串常量的地址, sizeof(s1) 计算的是指针变量s1所占内存大小,strlen(s1) 统计的是s1指向的字符串的实际长度。

2.可以。定义一个指针变量,使其指向一个字符常量。

3.交换的是两个字符串常量的地址,没有。

 

task3.c

#include <stdio.h>

#include <stdio.h>

int main() {
    int x[2][4] = { {1, 9, 8, 4}, {2, 0, 4, 9} };
    int i, j;
    int* ptr1;     // 指针变量,存放int类型数据的地址
    int(*ptr2)[4]; // 指针变量,指向包含4个int元素的一维数组

    printf("输出1: 使用数组名、下标直接访问二维数组元素\n");
    for (i = 0; i < 2; ++i) {
        for (j = 0; j < 4; ++j)
            printf("%d ", x[i][j]);
        printf("\n");
    }

    printf("\n输出2: 使用指向元素的指针变量ptr1间接访问二维数组元素\n");
    for (ptr1 = &x[0][0], i = 0; ptr1 < &x[0][0] + 8; ++ptr1, ++i) {
        printf("%d ", *ptr1);

        if ((i + 1) % 4 == 0)
            printf("\n");
    }

    printf("\n输出3: 使用指向一维数组的指针变量ptr2间接访问二维数组元素\n");
    for (ptr2 = x; ptr2 < x + 2; ++ptr2) {
        for (j = 0; j < 4; ++j)
            printf("%d ", *(*ptr2 + j));
        printf("\n");
    }

    return 0;

A:

1.表示指向一个包含四个整形元素的指针。

2.表示的是一个含四个元素的数组,该数组的元素是指向整形变量的指针。

 

task4_1.c

#include <stdio.h>
#define N 80

void replace(char* str, char old_char, char new_char); // 函数声明

int main() {
    char text[N] = "c programming is difficult or not, it is a question.";

    printf("原始文本: \n");
    printf("%s\n", text);

    replace(text, 'i', '*'); // 函数调用 注意字符形参写法,单引号不能少

    printf("处理后文本: \n");
    printf("%s\n", text);

    return 0;
}

// 函数定义
void replace(char* str, char old_char, char new_char) {
    int i;

    while (*str) {
        if (*str == old_char)
            *str = new_char;
        str++;
    }
}

A:

1.将所有的'i'改成'*'。

2.可以。

 

task2_2.c

#include <stdio.h>
#define N 80

void str_trunc(char* str, char x);

int main() {
    char str[N];
    char ch;

    printf("输入字符串: ");
    gets(str);

    printf("输入一个字符: ");
    ch = getchar();

    printf("截断处理...\n");
    str_trunc(str, ch);

    printf("截断处理后的字符串: %s\n", str);

    return 0;
}

void str_trunc(char* str, char x) {
    while (*str) {
        if (*str == x)
            *str = '\0';     // blank1

        str++;   // blank2
    }

}

 

task5_1.c

#include <stdio.h>
#include <string.h>
void sort(char* name[], int n);

int main() {
    char* course[4] = { "C Program",
                       "C++ Object Oriented Program",
                       "Operating System",
                       "Data Structure and Algorithms" };
    int i;

    sort(course, 4);

    for (i = 0; i < 4; i++)
        printf("%s\n", course[i]);

    return 0;
}

void sort(char* name[], int n) {
    int i, j;
    char* tmp;

    for (i = 0; i < n - 1; ++i)
        for (j = 0; j < n - 1 - i; ++j)
            if (strcmp(name[j], name[j + 1]) > 0) {
                tmp = name[j];
                name[j] = name[j + 1];
                name[j + 1] = tmp;
            }
}

 

task5_2.c

#include <stdio.h>
#include <string.h>
void sort(char* name[], int n);

int main() {
    char* course[4] = { "C Program",
                       "C++ Object Oriented Program",
                       "Operating System",
                       "Data Structure and Algorithms" };
    int i;

    sort(course, 4);
    for (i = 0; i < 4; i++)
        printf("%s\n", course[i]);

    return 0;
}

void sort(char* name[], int n) {
    int i, j, k;
    char* tmp;

    for (i = 0; i < n - 1; i++) {
        k = i;
        for (j = i + 1; j < n; j++)
            if (strcmp(name[j], name[k]) < 0)
                k = j;

        if (k != i) {
            tmp = name[i];
            name[i] = name[k];
            name[k] = tmp;
        }
    }
}

 

A:

交换的是内存中字符串的存储位置。

 

task6.c

#include <stdio.h>
#include <string.h>
#define N 5

int check_id(char* str); // 函数声明

int main() {
    char* pid[N] = { "31010120000721656X",
                    "330106199609203301",
                    "53010220051126571",
                    "510104199211197977",
                    "53010220051126133Y" };
    int i;

    for (i = 0; i < N; ++i)
        if (check_id(pid[i])) // 函数调用
            printf("%s\tTrue\n", pid[i]);
        else
            printf("%s\tFalse\n", pid[i]);

    return 0;
}

// 函数定义
// 功能: 检查指针str指向的身份证号码串形式上是否合法。
// 形式合法,返回1,否则,返回0
int check_id(char* str) {
    // 补足函数实现
    // ...
    if (strlen(str) == 18) {
        while (*str) {
            if (!((*str <= 58 && *str >= 47) || (*str == 'X')))
                return 0;
            str++;
        }
        return 1;
    }
    else
        return 0;
}

 

task7.c

#include <stdio.h>
#define N 80
void encoder(char* str); // 函数声明
void decoder(char* str); // 函数声明

int main() {
    char words[N];

    printf("输入英文文本: ");
    gets(words);

    printf("编码后的英文文本: ");
    encoder(words); // 函数调用
    printf("%s\n", words);

    printf("对编码后的英文文本解码: ");
    decoder(words); // 函数调用
    printf("%s\n", words);
    return 0;
}

/*函数定义
功能:对s指向的字符串进行编码处理
编码规则:
对于a~z或A~Z之间的字母字符,用其后的字符替换; 其中,z用a替换,Z用A替换
其它非字母字符,保持不变
*/
void encoder(char* str) {
    // 补足函数实现
    // ×××
    while (*str) {
        if (*str >= 'A' && *str <= 'z')
            if (*str == 'z' || *str == 'Z')
                *str -= 32;
            else
                *str += 1;
        str++;
    }
}

/*函数定义
功能:对s指向的字符串进行解码处理
解码规则:
对于a~z或A~Z之间的字母字符,用其前面的字符替换; 其中,a用z替换,A用Z替换
其它非字母字符,保持不变
*/
void decoder(char* str) {
    // 补足函数实现
    // ×××
    while (*str) {
        if (*str >= 'A' && *str <= 'z')
            if (*str == 'a' || *str == 'A')
                *str += 32;
            else
                *str -= 1;
        str++;
    }
}

 

标签:int,s1,编程,C语言,char,++,str,printf,指针
From: https://www.cnblogs.com/xiaodubideyuanzi/p/18209405

相关文章

  • [Java]Socket套接字(网络编程入门)
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032037出自【进步*于辰的博客】参考笔记二,P61。注:“一对一”、“多对多”是相对于Socket而言,而非服务端/客户端类的个数。目录1、概述2、二种聊天模式2.1“一对一......
  • 【Linux C | 网络编程】基础概念
    一、IP和端口1、IP地址用来标识一台电脑的地址,它由四个字节组成,我们平时看到的192.168.100.30是把IP地址的四个字节按字节单独取出来显示的,在电脑中这个四个数字是存在一个32位的无符号整数中的,所以它的数值一般比较大2、端口每台电脑上有很多需要上网的程序,这些程序都是同......
  • 程序分享--常见算法/编程面试题:分发糖果
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。或关注博主免费专栏【程序......
  • 每日一练——颜色分类(快慢指针排序)
    目录题目代码分析案例模拟重难点分析自检复习 题目75.颜色分类-力扣(LeetCode)代码//交换函数,交换指针a和指针b指向的整数voidswap(int*a,int*b){intt=*a;*a=*b;*b=t;}voidsortColors(int*nums,intnumsSize){//双指针......
  • NodeJS-高性能编程-全-
    NodeJS高性能编程(全)原文:zh.annas-archive.org/md5/DF276329F6BD35B176ABE023A386AF47译者:飞龙协议:CCBY-NC-SA4.0前言在像Node.js这样的平台上实现高性能意味着要了解如何充分利用硬件的各个方面,并帮助内存管理发挥最佳作用,并正确决定如何设计复杂的应用程序。如果您的......
  • Node-Red-实战编程-全-
    Node-Red实战编程(全)原文:zh.annas-archive.org/md5/C5AA5862C03AC3F75583D0632C740313译者:飞龙协议:CCBY-NC-SA4.0前言Node-RED是由Node.js制作的基于流的编程工具。这个工具主要用于连接物联网设备和软件应用程序。然而,它不仅可以涵盖物联网,还可以涵盖标准的Web应用......
  • 关于如何使用JNI将C语言接口打包成可供java环境调用的so库文件
    一、环境检查在linux下打包.so文件,首先需要确认是否有安装java环境,可通过在终端中输入指令java的方式来进行查看。如下图所示,则为已安装java环境。  若当前未安装java环境,则可通过在终端中输入如下指令进行安装,我这里使用的java环境为1.8.0版本。sudoapt-getinstallo......
  • 代码随想录算法训练营第二天|977(双指针),209(滑动窗口),59(螺旋矩阵)
    977.有序数组的平方**1.数组中有正有负,且本身有序。平方后,较大值从两边来比较取出。**2.使用头尾指针方法。209.长度最小的子数组**1.从数组中找符合要求的连续子数组**2.滑动窗口方法:本质为快慢双指针,快指针不断前进直到子数组满足要求,然后慢指针前进直到子数组不满足......
  • PureBasic是一种基于BASIC语言的编程语言,它提供了一个简单易用的开发环境,旨在帮助开发
    PureBasic是一种基于BASIC语言的编程语言,它提供了一个简单易用的开发环境,旨在帮助开发人员快速创建跨平台的应用程序。PureBasic的特点如下:简单易学:PureBasic的语法类似于传统的BASIC语言,非常容易学习和理解,适合初学者入门。跨平台支持:PureBasic可以在多个操作系统上运行,包括W......
  • 1.说说你了解过、使用过什么编程语言?比较他们的优势 2.说说你了解过,使用过什么编程工
    1.我了解过、使用过的编程语言有C语言,Java,C++。比较:①C语言是一种通用的高级编程语言,具有高效性和直接接近计算机硬件的能力,适合编写操作系统和嵌入式系统等低级应用。但C语言缺乏面向对象的支持,对于大型项目的复杂性处理有些力不从心。②Java是一种跨平台的面向对象编程语言,......