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

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

时间:2024-05-24 20:54:44浏览次数:22  
标签:int s1 编程 C语言 char str printf include 指针

1. 实验任务1

task1_1.c

 1 #include<stdio.h>
 2 #define N  5
 3 
 4 void input(int x[],int n);
 5 void output(int x[],int n);
 6 void find_min_max(int x[],int n,int *pmin,int *pmax);
 7 
 8 int main()
 9 {
10     int a[N];
11     int min,max;
12 
13     printf("录入%d个数据:\n",N);
14     input(a,N);
15 
16     printf("数据是:\n");
17     output(a,N);
18 
19     printf("数据处理...\n");
20     find_min_max(a,N,&min,&max);
21 
22     printf("输出结果:\n");
23     printf("min=%d,max=%d\n",min,max);
24 
25     return 0;
26 }
27 void input(int x[],int n)
28 {
29     int i;
30 
31     for(i=0;i<n;++i)
32         scanf("%d", &x[i]);
33 }
34 
35 void output(int x[], int n) {
36     int i;
37     
38     for(i = 0; i < n; ++i)
39         printf("%d ", x[i]);
40     printf("\n");
41 }
42 void find_min_max(int x[],int n,int *pmin,int *pmax)
43 {
44     int i;
45     
46     *pmin=*pmax=x[0];
47 
48     for(i=1;i<n;++i)
49         if(x[i]<*pmin)
50             *pmin=x[i];
51         else if(x[i]>*pmax)
52             *pmax=x[i];
53 }

1. 函数 find_min_max 实现的功能是查找数组元素的最小值和最大值,并将其通过指针变量放到main函数的min  max 中

2. "指针变量在使用之前必须指向确定的地址"。执行到line45时,指针变量pmin、pmax 都指向x[0]

task1_2.c

 1 #include<stdio.h>
 2 #define N 5
 3 
 4 void input(int x[], int n);
 5 void output(int x[], int n);
 6 int *find_max(int x[],int n);
 7 
 8 int main()
 9 {
10     int a[N];
11     int *pmax;
12 
13     printf("录入%d个数据:\n", N);
14     input(a, N);
15 
16     printf("数据是: \n");
17     output(a, N);
18 
19     printf("数据处理...\n");
20     pmax=find_max(a,N);
21 
22     printf("输出结果:\n");
23     printf("max= %d\n",*pmax);
24 
25     return 0;
26 
27 }
28 void input(int x[], int n) {
29     int i;
30 
31     for(i = 0; i < n; ++i)
32         scanf("%d", &x[i]);
33 }
34 
35 void output(int x[], int n) {
36     int i;
37     
38     for(i = 0; i < n; ++i)
39         printf("%d ", x[i]);
40     printf("\n");
41 }
42 int *find_max(int x[], int n)
43 {
44     int max_index = 0;                                                                                  
45     int i;
46 
47     for(i = 1; i < n; ++i)
48         if(x[i] > x[max_index])
49             max_index = i;
50     
51     return &x[max_index];
52 }

1. 函数 find_max 的功能是找出数组元素的最大值,并返回最大值所在地址

2. 把函数 find_max 的实现写成以下代码,可以,通过返回指针变量的值,返回最大值地址

2. 实验任务2

task2_1.c

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 80
 4 
 5 int main()
 6 {
 7     char s1[]="Learning makes me happy";
 8     char s2[]="Learning makes me sleepy";
 9        char tmp[N];
10    
11     printf("sizeof(s1)vs.strlen(s1):\n");
12     printf("sizeof(s1)=%d\n",sizeof(s1));
13     printf("strlen(s1)=%d\n",strlen(s1));
14 
15     printf("\nbefore swap:\n");
16     printf("s1:%s\n",s1);
17     printf("s2:%s\n",s2);
18 
19     printf("\nswaping...\n");
20     strcpy(tmp,s1);
21     strcpy(s1,s2);
22     strcpy(s2,tmp);
23 
24     printf("\nafter swap:\n");
25     printf("s1:%s\n",s1);
26     printf("s2:%s\n",s2);
27 
28     return 0;
29 }

问题1:数组s1的大小是4, sizeof(s1) 计算的是字符串所占用的字节数, strlen(s1) 统计的是有效字符数,不包括'\0'

问题2:line6代码,不能替换成以下写法,s1 是字符串数组的起始地址常量

task2_2.c

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 80
 4 
 5 int main()
 6 {
 7     char *s1="Learning makes me happy";
 8     char *s2="Learning makes me sleepy";
 9     char *tmp;
10 
11     printf("sizeof(s1)vs.strlen(s1):\n");
12     printf("sizeof(s1)=%d\n",sizeof(s1));
13     printf("strlen(s1)=%d\n",strlen(s1));
14 
15     printf("\nbefore swap:\n");
16     printf("s1:%s\n",s1);
17     printf("s2:%s\n",s2);
18 
19     printf("\nswaping...\n");
20     tmp=s1;
21     s1=s2;
22     s2=tmp;
23 
24     printf("\nafter swap:\n");
25     printf("s1:%s\n",s1);
26     printf("s2:%s\n",s2);
27 
28     return 0;
29 }

问题1:指针变量s1中存放的是字符串的初始地址 , sizeof(s1) 计算的是指针变量s1所占用的字节数, strlen(s1) 统计的是s1所指向的字符串所占用的有效字节数

问题2:line6代码能替换成下面的写法,对比task2_1.c中的line7, task2_1中s1是地址常量,不能复制,task2_2中s1是指针变量,该语义是把字符串的初始地址赋值给s1

问题3:line19-line21,交换的是地址,s1 和s2所指向的字符串改变,字符串常量"Learning makes me happy"和字符串常 量"Learning makes me sleepy"在内存存储单元中没有交换

3. 实验任务3

 1 #include<stdio.h>
 2 int main()
 3 {
 4     int x[2][4]={{1,9,8,4},{2,0,4,9}};
 5     int i,j;
 6     int *ptr1;
 7     int(*ptr2)[4];//指向int型一维数组
 8 
 9     printf("输出1:使用数组名、下标直接访问二维数组元素\n");
10     for(i=0;i<2;++i)
11     {
12         for(j=0;j<4;++j)
13             printf("%d",x[i][j]);
14         printf("\n");
15     }
16 
17     printf("\n输出2:使用指向元素的指针变量ptr1间接访问二维数组元素\n");
18     for(ptr1=&x[0][0],i=0;ptr1<&x[0][0]+8;++ptr1,++i)
19     {
20         printf("%d",*ptr1);
21 
22         if((i+1)%4==0)
23             printf("\n");
24     }
25 
26     printf("\n输出3:使用指向一维数组的指针变量ptr2间接访问二维数组元素\n");
27     for(i=0,ptr2=x;i<2;++i,++ptr2)
28     {    
29         for(j=0;j<4;++j)
30                 printf("%d",*(*ptr2+j));
31         printf("\n");
32     }
33 
34     return 0;
35 }

int (*ptr)[4]; 中,标识符ptr表示的语义是ptr指向一维数组,相当于x[],

int *ptr[4];中,标识符ptr表示的语义是指针数组ptr[4]的起始地址

4. 实验任务4

task4-1.c

 1 #include<stdio.h>
 2 #define N 80
 3 
 4 void replace(char *str,char old_char,char new_char);
 5 
 6 int main()
 7 {
 8     char text[N]="c programming is difficult or not,it is a question.";
 9 
10 
11     printf("原始文本:\n");
12     printf("%s",text);
13 
14     replace(text,'i','*');//函数调用,注意字符形参写法,单引号不能少
15 
16     printf("处理后文本:\n");
17     printf("%s\n",text);
18 
19     return 0;
20 }
21 void replace(char *str,char old_char,char new_char)
22 {
23     while(*str)
24     {
25         if(*str==old_char)
26             *str=new_char;
27         *str++;
28     }
29 }

1. 函数 replace 的功能是把字符串中出现的old_char 替换为new_char

2. line24, 圆括号里循环条件可以改写成 *str != '\0','\0'存放的编码值即为0;

task4-2.c

 1 #include<stdio.h>
 2 #define N 80
 3 
 4 void str_trunc(char *str,char x);
 5 
 6 int main()
 7 {
 8     char str[N];
 9     char ch;
10 
11     printf("输入字符串:");
12     gets(str);
13 
14     printf("输入一个字符:");
15     ch=getchar();
16 
17     printf("截断处理...\n");
18     str_trunc(str,ch);
19 
20     printf("截断处理后的字符串:%s\n",str);
21 
22     return 0;
23 }
24 void str_trunc(char *str,char x)
25 {
26     while(*str)
27     {
28         if(*str==x)
29             *str='\0';//blank 1
30         str++;//blank 2
31     }
32 }

5. 实验任务5

task5-1.c

 1 #include<stdio.h>
 2 #include<string.h>
 3 void sort(char *name[],int n);
 4 
 5 int main()
 6 {
 7     char *course[4]={"C Program",
 8                     "C++ Object Oriented Program",
 9                     "Operating System",
10                     "Data Structure and Algorithms"};
11     int i;
12 
13     sort(course,4);
14 
15     for(i=0;i<4;++i)
16         printf("%s\n",course[i]);
17 
18     return 0;
19 }
20 void sort(char *name[],int n)
21 {
22     int i,j;
23     char *tmp;
24 
25     for(i=0;i<n-1;++i)
26         for(j=0;j<n-1-i;++j)
27             if(strcmp(name[j],name[j+1])>0)
28             {
29                 tmp=name[j];
30                 name[j]=name[j+1];
31                 name[j+1]=tmp;
32             }
33 }

task5-2.c

 1 #include<stdio.h>
 2 #include<string.h>
 3 void sort(char *name[],int n);
 4 
 5 int main()
 6 {
 7     char *course[4]={"C Program",
 8                     "C++ Object Oriented Program",
 9                     "Operating System",
10                     "Data Structure and Algorithms"};
11     int i;
12 
13     sort(course,4);
14 
15     for(i=0;i<4;++i)
16         printf("%s\n",course[i]);
17 
18     return 0;
19 }
20 void sort(char *name[],int n)
21 {
22     int i,j,k;
23     char *tmp;
24 
25     for(i=0;i<n-1;++i)
26         {
27             for(j=i+1,k=i,tmp=name[k];j<n;++j)
28                 if(strcmp(name[j],name[k])<0)
29                     k=j;
30 
31             if(k!=i)
32                 {
33                     name[i]=name[k];
34                     name[k]=tmp;
35                 }
36         }
37 }

这两种算法实现中,交换的是指针变量的值

6. 实验任务6

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 5
 4 
 5 int check_id(char *str);
 6 
 7 int main()
 8 {
 9     char *pid[N]={"31010120000721656X",
10                     "330106199609203301",
11                     "53010220051126571",
12                     "510104199X11197977",
13                     "53010220051126133Y"};
14     int i;
15 
16     for(i=0;i<N;++i)
17         if(check_id(pid[i]))
18             printf("%s\tTrue\n",pid[i]);
19         else
20             printf("%s\tFalse\n",pid[i]);
21 
22     return 0;
23 }
24 int check_id(char *str)
25 {
26     int k=0;
27 
28     while(*str)
29         {
30             str++;
31             k++;
32     }
33 
34     if(k!=18)
35         return 0;
36     
37     str=str-k;
38 
39     for(k=0;k<18;k++)
40     {
41         if(k==17)
42         {
43             if(*(str+k)!='X'&&(*(str+k)<'0'||*(str+k)>'9'))
44                  return 0;
45         }
46         else if(*(str+k)<'0'||*(str+k)>'9')
47                 return 0;
48     }
49 
50 }

7. 实验任务7

 1 #include<stdio.h>
 2 #define N 80
 3 void encoder(char *str);
 4 void decoder(char *str);
 5 
 6 int main()
 7 {
 8     char words[N];
 9 
10     printf("输入英文文本:");
11     gets(words);
12 
13     printf("编译后的英文文本:");
14     encoder(words);
15     printf("%s\n",words);
16 
17     printf("对编译后的英文文本解码:");
18     decoder(words);
19     printf("%s\n",words);
20 
21     return 0;
22 }
23 void encoder(char *str)
24 {
25     while(*str)
26     {
27         if((*str>='a'&&*str<'z')||(*str>='A'&&*str<'Z'))
28             (*str)++;
29 
30         else if(*str=='z')
31             *str='a';
32         else if(*str=='Z')
33             *str='A';
34 
35         str++;
36     }
37 }
38 void decoder(char *str)
39 {
40     while(*str)
41     {
42         if((*str>'a'&&*str<='z')||(*str>'A'&&*str<='Z'))
43             (*str)--;
44 
45         else if(*str=='a')
46             *str='z';
47         else if(*str=='A')
48             *str='Z';
49 
50         str++;
51     }
52 }

8. 实验任务8

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 int main(int argc,char *argv[])
 5 {
 6     int i,j,k;
 7     char *tmp;
 8 
 9     for(i=1;i<argc;++i)
10         {
11             for(j=i+1,k=i,tmp=argv[k];j<argc;++j)
12                 if(strcmp(argv[j],tmp)<0)
13                     k=j;
14             if(k!=i)
15             {
16                 argv[i]=argv[k];
17                 argv[k]=tmp;
18             }
19     }
20 
21     for(i=1;i<argc;++i)
22         printf("hello,%s\n",argv[i]);
23 
24     system("pause");
25     return 0;
26 }

 

 

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

相关文章

  • 【c语言】一篇文章搞懂函数递归
    ......
  • 类的数组,数组指针,指针数组
    在C++中,类的数组、类的数组指针和类的指针数组是三种不同的数据结构,它们各自有不同的用途和特性。下面我将分别给出它们的示例和说明。1.类的数组类的数组是类的多个对象的集合,这些对象在内存中连续存储。cpp复制代码classMyClass{public:intvalue;MyClass(intv)......
  • 48.C语言初阶指针整理
    先来简单的了解指针可以说地址即是指针通过指针(地址)能找到以它为地址的内存单元存放于指针中的值都被当成地址处理一个简单的指针inta=10;int*p=&a;inta=1;int*pa=&a;char*pc=&a;//取出地址一样printf("%p\n",pa);printf("......
  • C语言----深入理解指针(3)
    1.字符指针变量//intmain()//{//charch='w';//char*pc=&ch;//printf("%c",*pc);//return0;//}/*intmain(){//char*p="abcdef";//chararr[]="abcdef";//常量字符串abcdef\0//......
  • C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
    #include<stdio.h>intmain(){intn,x;scanf("%d%d",&n,&x);intcount=0;for(inti=1;i<=n;i++){intm=i;//从1开始计算while(m)//循环运行的条件{if(m%10==x)//如果m除以10的余数是x的......
  • 【C语言】文件操作
    在C语言中,文件操作是通过一组标准库函数来实现的,这些函数定义在<stdio.h>头文件中。以下是一些基本的文件操作函数及其用法:文件打开(fopen):FILE*fopen(constchar*filename,constchar*mode);filename是要打开的文件名。mode是打开文件的方式,例如"r"(只读)、"w"(只......
  • 【C语言】字符函数和字符串函数
    在C语言中,字符函数和字符串函数通常用于处理单个字符和字符串。这些函数定义在<ctype.h>(字符函数)和<string.h>(字符串函数)头文件中。以下是一些常用的字符函数和字符串函数及其用法:字符函数(ctype.h)字符函数主要用于测试字符的属性或转换字符。isalnum():检查字符是......
  • STL 以及 C语言与C++的区别
    C++语言的标准库(STL)容器(Containers)vector:动态数组,可以动态增长和收缩,支持快速随机访问元素。list:双向链表,支持在任意位置快速插入和删除元素。map:关联容器,以键值对(key-value)形式存储元素,支持快速查找和插入。竞赛常用C++STL用法https://io.zouht.com/154.htmlv......
  • Python并发与异步编程
    Python的并发与异步编程是两个不同的概念,但它们经常一起使用,以提高程序的性能和响应能力。以下是对这两个概念的详细讲解:并发编程(Concurrency)并发编程是指在程序中同时执行多个任务的能力。Python提供了几种实现并发的机制:1.多线程(Threading):  -Python的`thread......
  • 面向对象编程思想杂谈
    最近在写一篇编程语言发展历史相关的书。正好在书中聊到了面向对象思想,摘录一些内容,跟大家分享。什么是OOP?面向对象编程(Object-OrientedProgramming,OOP)自上世纪80年代兴起以来,便以其独特的理念和强大的抽象能力,成为软件工程领域的主流编程范式。面向对象编程通过引入类......