zoukankan      html  css  js  c++  java
  • C语言——第一次作业(2)

    1.写程序证明p++等价于(p)++还是等价于*(p++)?

    #include <stdio.h>
    int main()
    {
    	int *p,a=5;
    	p = &a;
    	printf("*p = %d
    ",*p);         //*p = 5
    	printf("p = %d
    ",p);         //p = 6487620
    	printf("p++ = %d
    ",p++);         //p++ = 6487620
            //printf("(p)++ = %d
    ",(p)++);        //(p)++ = 6487620
    	//printf("*p++ = %d
    ",*p++);        //*p++ = 5
    	//printf("*(p++) = %d
    ",*(p++));        //*(p++) = 5
     } 
    

    题目

    题目1.计算两数的和与差(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:通过局部变量op1,op2进行加减运算,计算psum、pdiff的值。

    第三步:函数调用结束,结果返回主函数。

    - (2)流程图

    2.实验代码

    void sum_diff( float op1, float op2, float *psum, float *pdiff )
    {
    	*psum = op1 + op2;
    	*pdiff = op1 - op2; 
    } 
    

    完整代码

    #include <stdio.h>
    
    void sum_diff( float op1, float op2, float *psum, float *pdiff );
    
    int main()
    {
        float a, b, sum, diff;
    
        scanf("%f %f", &a, &b);
        sum_diff(a, b, &sum, &diff);
        printf("The sum is %.2f
    The diff is %.2f
    ", sum, diff);
    	
        return 0; 
    }
    
    void sum_diff( float op1, float op2, float *psum, float *pdiff )
    {
    	*psum = op1 + op2;
    	*pdiff = op1 - op2; 
    } 
    

    3.本题调试过程碰到问题及解决办法

    本题未遇到问题。

    题目2.拆分实数的整数与小数部分(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:将x除以1,所得值为x的整数部分,将其赋值给*intpart。

    第三步:将x减去其整数部分intpart,所得值为x的小数部分,将其赋值给fracpart。

    第四步:函数调用结束,结果返回主函数。

    - (2)流程图

    2.实验代码

    void splitfloat( float x, int *intpart, float *fracpart )
    {
    	*intpart = x / 1;
    	*fracpart = x - *intpart;
    }
    

    完整代码

    #include <stdio.h>
    
    void splitfloat( float x, int *intpart, float *fracpart );
    
    int main()
    {
        float x, fracpart;
        int intpart;
    
        scanf("%f", &x);
        splitfloat(x, &intpart, &fracpart);
        printf("The integer part is %d
    ", intpart);
        printf("The fractional part is %g
    ", fracpart);
    
        return 0;
    }
    
    void splitfloat( float x, int *intpart, float *fracpart )
    {
    	*intpart = x / 1;
    	*fracpart = x - *intpart;
    }
    

    3.本题调试过程碰到问题及解决办法

    错误信息:

    错误原因:*fracpart是浮点型数据,(x/1)的运算没有作用。

    改正方法:将*fracpart = x - (x / 1)改为 *fracpart = x - *intpart。

    题目3.在数组中查找指定元素(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:定义i,使用for循环结构,在数组元素范围内,当存在数组元素等于所查找的数据时,返回主函数此元素下标;当循环结束时未查找到,则返回主函数-1。

    第三步:函数调用结束。

    - (2)流程图


    2.实验代码

    int search( int list[], int n, int x )
    {
        int i;
        for (i = 0 ; i < n ; i++)
        {
            if (list[i] == x)
            {
                return i ;
            }
        }
        return -1;
    }
    

    完整代码

    #include <stdio.h>
    #define MAXN 10
    
    int search( int list[], int n, int x );
    
    int main()
    {
            int i, index, n, x;
            int a[MAXN];
    
            scanf("%d", &n);
            for( i = 0; i < n; i++ )
                scanf("%d", &a[i]);
            scanf("%d", &x);
            index = search( a, n, x );
            if( index != -1 )
                printf("index = %d
    ", index);
            else
                printf("Not found
    ");
    
            return 0;
    }
    
    int search( int list[], int n, int x )
    {
        int i;
        for (i = 0 ; i < n ; i++)
        {
            if (list[i] == x)
            {
                return i ;
            }
        }
        return -1;
    }
    

    3.本题调试过程碰到问题及解决办法

    本题未遇到问题。

    题目4.找最大值及其下标(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:定义i,max=*a(使max初始值为数组a首元素地址),使用for循环结构,在数组元素范围内,将数组a中数值最大的元素存于max,将a的下标存于b。

    第三步:函数调用结束,结果返回主函数。

    - (2)流程图

    2.实验代码

    int fun(int *a,int *b,int n)
    {
    	int i,max=*a;
    	for(i = 0 ; i < n ; i++)
    	{
    		if(*(a+i) > max)
    		{
    			max = *(a+i);
    			*b = i;
    		}
    	}
    	return (max);
    }
    

    完整代码

    #include<stdio.h>
    #define N 10
    int fun(int *a,int *b,int n);
    int main()
    { 
            int a[N],i,max,p=0;
            for(i=0;i<N;i++) 
                scanf("%d",&a[i]);
             max=fun(a,&p,N);
             printf("max=%d,position=%d
    ",max,p);
             return 0;
    }
    
    int fun(int *a,int *b,int n)
    {
    	int i,max=*a;
    	for(i = 0 ; i < n ; i++)
    	{
    		if(*(a+i) > max)
    		{
    			max = *(a+i);
    			*b = i;
    		}
    	}
    	return (max);
    }
    

    3.本题调试过程碰到问题及解决办法

    本题未遇到问题。

    题目5.最小数放前最大数放后(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的input(int *arr,int n)函数,定义i,使用for循环结构,当i小于元素个数n时,输入arr数据。函数调用结束。

    第二步:调用题目中定义的max_min(int arr,int n)函数。定义 j,s=0,t,x=0,首先使用for循环结构,在循环中判断(arr+j)与(arr+s)的大小关系,当(arr+j)<*(arr+s) 时,将j赋值给s,若s不等于0,做交换,可得最小值;同理,可得最大值。函数调用结束。

    第三步:调用题目中定义的output(int *arr,int n)函数。定义k,使用循环结构,输出结果。函数调用结束。

    - (2)流程图




    2.实验代码

    void input(int *arr,int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",arr++);
    	}
    }
    void max_min(int *arr,int n)
    {
    	int j,s=0,x=0;
    	int t;
    	for(j=1;j<n;j++)
    	{
    		if(*(arr+j)<*(arr+s))  
    			s=j;
    	}
    	if(s!=0)
    	{
    		t=*arr;
            *arr=*(arr+s);
            *(arr+s)=t;
    	}
    	for(j=1;j<n;j++)
    	{
    		if(*(arr+j)>*(arr+x))  
    			x=j;
    	}
    	if(x!=0)
    	{
    		t=*(arr+n-1);
            *(arr+n-1)=*(arr+x);
            *(arr+x)=t;
    	}
    }
    void output(int *arr,int n)
    {
    	int k;
    	for(k=0;k<n;k++,arr++)
    	{
    		printf("%3d",*arr);
    	}
    }
    
    

    完整代码

    #include<stdio.h>
    void input(int *arr,int n);
    void max_min(int *arr,int n);
    void output(int *arr,int n);
    int main()
    { 
        int a[10];
        input(a,10);
        max_min(a,10);
        output(a,10);
        return 0;
    }
    
    void input(int *arr,int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
    		scanf("%d",arr++);
    	}
    }
    void max_min(int *arr,int n)
    {
    	int j,s=0,x=0;
    	int t;
    	for(j=1;j<n;j++)
    	{
    		if(*(arr+j)<*(arr+s))  
    			s=j;
    	}
    	if(s!=0)
    	{
    		t=*arr;
            *arr=*(arr+s);
            *(arr+s)=t;
    	}
    	for(j=1;j<n;j++)
    	{
    		if(*(arr+j)>*(arr+x))  
    			x=j;
    	}
    	if(x!=0)
    	{
    		t=*(arr+n-1);
            *(arr+n-1)=*(arr+x);
            *(arr+x)=t;
    	}
    }
    void output(int *arr,int n)
    {
    	int k;
    	for(k=0;k<n;k++,arr++)
    	{
    		printf("%3d",*arr);
    	}
    }
    
    

    3.本题调试过程碰到问题及解决办法

    本题出现了格式错误,题目中要求每个元素输出占3列,但是我并没有在代码中表现出这一点。修改输出格式即为正确答案。

    题目6.指针选择法排(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:定义i,t,k,j,使用双重for循环结构(即使用选择排序法排序)。

    第三步:函数调用结束。

    - (2)流程图


    2.实验代码

    
    void sort(int *x,int n)
    {
    	int i;
    	for(i=0;i<(n-1);i++)
    	{
    		int k,j;
    		k=i;
    		for(j=i+1;j<n;j++)
    		{
    			if(*(x+j)>*(x+k))
    			{
    				k=j;
    			}
    		}
    		if(i!=k)
    		{
    			int t; 
    			t=*(x+i); 
    			*(x+i)=*(x+k); 
    			*(x+k)=t;
    		}
    	 } 
    } 
    
    

    完整代码

    #include<stdio.h>
    void sort(int *x,int n);
    int main ( )
    {
         int *p,i,a[10];
         p=a;
         for (i=0;i<10;i++)  
            scanf("%d",p++);
         p=a;
         sort(a,10);
         for(i=0;i<10;i++)  
            printf("%4d",*p++);
         printf("
    ");
         return 0;
     }
    
    void sort(int *x,int n)
    {
    	int i;
    	for(i=0;i<(n-1);i++)
    	{
    		int k,j;
    		k=i;
    		for(j=i+1;j<n;j++)
    		{
    			if(*(x+j)>*(x+k))
    			{
    				k=j;
    			}
    		}
    		if(i!=k)
    		{
    			int t; 
    			t=*(x+i); 
    			*(x+i)=*(x+k); 
    			*(x+k)=t;
    		}
    	 } 
    } 
    

    3.本题调试过程碰到问题及解决办法

    本题未遇到问题。

    题目7.判断回文字符串(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:确定输入字符串的长度,定义i,j,(i为首元素下角标,j为末元素下角标)使用循环结构,判断在数组元素内是s[i]与s[j]是否相等。若是,则返回true;若不是则返回false。

    第三步:函数调用结束。

    - (2)流程图


    2.实验代码

    bool palindrome( char *s )
    {
    	int a = strlen(s);  
      	int i, j;  
      	for(i=0,j=a-1 ; i <= j ; i++, j--)
    	{  
       		if(s[i] == s[j]);  
       		return false;  
     	}  
      	return true;  
    }
    

    完整代码

    #include <stdio.h>
    #include <string.h>
    
    #define MAXN 20
    typedef enum {false, true} bool;
    
    bool palindrome( char *s );
    
    int main()
    {
        char s[MAXN];
    
        scanf("%s", s);
        if ( palindrome(s)==true )
            printf("Yes
    ");
        else
            printf("No
    ");
        printf("%s
    ", s);
    
        return 0;
    }
    
    bool palindrome( char *s )
    {
    	int a = strlen(s);  
      	int i, j;  
      	for(i=0,j=a-1 ; i <= j ; i++, j--)
    	{  
       		if(s[i] == s[j]);   
    		return false;  
     	}  
      	return true;  
    }
    

    3.本题调试过程碰到问题及解决办法

    本题未遇到问题。

    题目8.使用函数实现字符串部分复制(函数题)

    1.设计思路

    - (1)算法

    第一步:调用题目中定义的函数。

    第二步:先使用字符串复制函数,判断字符串长度。使用双重for循环结构,利用指针进行复制,注意最后的''结束符。

    第三步:函数调用结束,结果返回主函数。

    - (2)流程图


    2.实验代码

    void strmcpy(char *t, int m, char *s)  
    {  
        int i,j,a;  
        strcpy(s,t);
        a = strlen(s);  
        for (i = m - 1 ; i > 0 ; i--) 
    	{  
            for (j = i ; j < a + 1 ; j++)
                *(s + j - 1) = *(s + j);
        }  
        *(s + a - m + 1) = '';
        return;
    }
    

    完整代码

    #include <stdio.h>
    #define MAXN 20
    #include<string.h>
    
    void strmcpy( char *t, int m, char *s );
    //void ReadString( char s[] ); 
    
    int main()
    {
        char t[MAXN], s[MAXN];
        int m;
    
        scanf("%d
    ", &m);
        //ReadString(t);
        gets(t);
        strmcpy( t, m, s );
        printf("%s
    ", s);
    
        return 0;
    }
    
    void strmcpy(char *t, int m, char *s)  
    {  
        int i,j,a;  
        strcpy(s,t);
        a = strlen(s);  
        for (i = m - 1 ; i > 0 ; i--) 
    	{  
            for (j = i ; j < a + 1 ; j++)
                *(s + j - 1) = *(s + j);
        }  
        *(s + a - m + 1) = '';
        return;
    }
    

    3.本题调试过程碰到问题及解决办法

    本题原函数中存在一个“由裁判实现,略去不表”的函数,使得原代码在编译器中无法通过编译。不过修改也很简单,自行编写读入字符串的函数就好。

    额外加题

    为了防止信息被别人轻易盗取,需要把电码明文通过加密方式变换成为密文。变换规则如下:小写字母y变换为a,小写字母z变换为b,其他字母变换成为该字母ASCII码顺序后2为字幕,比如o变换成q。要求给出你的姓名全拼加密后的结果。

    1.设计思路

    - (1)算法

    第一步:定义数组,获取字符串。

    第二步:在字符不是''的情况下使用循环结构,在循环中进行判断输出。

    第三步:返回,结束。

    - (2)流程图

    2.实验代码

    #include <stdio.h>
    #define N 10001
    
    int main()
    {
    	char a[N];
    	gets(a);
    	int i = 0; 
    	while(a[i] != '')
    	{
    		if(a[i] == 'y')
    			printf("%c",'a');
    		else if(a[i] == 'z')
    			printf("%c",'b');
    		else if(a[i] >= 'a' && a[i] <= 'x')	
    			printf("%c",a[i]+2);
    		else;
    		i++;
    	}	
    	return 0;
    } 
    

    3.本题调试过程碰到问题及解决办法

    本题题目中未说明除小写字母外其它字符的变换规则,所以我将除小写字母外其他字母都当成默认不显示字符,未进行打印输出。

    学习总结和进度

    1.知识点

    1.使用指针变量做函数参数。

    2.数组与指针的结合使用。

    3.指针字符串的使用。

    学会了以上知识点。由于熟练程度有所欠缺,还不太习惯使用指针,解题总是习惯性地使用以前的思路,接下来解题会尽可能思考指针方法,提高熟练度。

    2.我的git地址

    3.点评链接

    链接一

    链接二

    链接三

    4.图表



  • 相关阅读:
    《mysql必知必会》学习_第23章_20180809
    禁止电脑自动乱装流氓软件
    网络地址转换技术NAT
    闲置手机作电脑无线音箱
    TransMac工具制作MacOS启动U盘
    制作MacOS启动U盘
    解决centos7启动后出现Warning: dracut-initqueue timeout‘ at startup进入emergency mode的问题
    思科 锐捷命令行简介
    VRRP 虚拟网关冗余协议
    STP 生成树协议
  • 原文地址:https://www.cnblogs.com/dx2017/p/8560765.html
Copyright © 2011-2022 走看看