2018上C語言程序設計(高級)作業- 第1次作業


作業要求一

1、寫程序證明P++等價於(p)++還是等價於*(p++)?

       代碼證明:
 #include <stdio.h>
int main()
{
    int a=10;
	int *p=&a;
	printf("p=%d\n",p);              //p=6487620
	printf("p++=%d\n",p++);          //p++=6487620
	p=&a;
	printf("(p)++=%d\n",(p)++);      //(p)++=6487620
	printf("*(p++)=%d\n",*(p++));    //*(p++)=6487628
 } 

作業要求二

-題目6-1 計算兩數的和與差
1、設計思路
(1)主要描述題目算法
第一步:根據題意,首先先計算兩個實數的和。由形參*psum和實參sum相關聯,再由實參與形參的關系即可得出兩數之和;
第二步:求兩數之差,和求兩數之和相似,用同樣的原理即可得出。
(2)流程圖:

2、實驗代碼

#include<stdio.h>
 void sum_diff( float op1, float op2, float *psum, float *pdiff )
 {
 	*psum=op1+op2;
 	*pdiff=op1-op2;
 }

3、本題調試過程中碰到的問題及解決方法
錯誤信息1:

        錯誤原因:用注釋里的編程方式沒有把運行構造函數后的結果返回給主函數,導致運行結果出錯。
       改正方法:在出現這種方法錯誤的時候,我通過改主函數中的sum和diff的值得出自己的錯誤原因的。之后自己通過翻閱課本,照葫蘆畫瓢寫出了用指針的正確方法。通過形參中指定的形參來返回給實參。

-題目6-2拆分實數的整數與小數部分
1、設計思路
(1)主要描述題目算法
第一步:根據題意,要求一個實數的整數部分,直接把這個實數強制轉換成整數型即可得到所得的整數部分。
第二步:想得到該實數的小數部分,可利用先前求出的整數部分,通過原實數和其整數部分做差即可得出其小數部分。
(2)流程圖:
2、實驗代碼

#include <stdio.h>
void splitfloat( float x, int *intpart, float *fracpart )
{
	*intpart=(int)(x);
	*fracpart=x-*intpart;
}
3、本題調試過程碰到問題及解決辦法
          由於此題和第一題類似,在調試過程中沒有出現問題。
  • 題目6-3在數組中查找指定元素
    1、設計思路
    (1)主要描述題目算法
    第一步:在構造的函數里首先要定義一個循環變量j,以及定義一個函數返回值result;
    第二步:根據題目要求,要找指定的元素,首先要遍歷數組,在遍歷的過程中用if判斷語句進行判斷並返回相應的下標;
    (2)流程圖:

    2、實驗代碼
    
#include <stdio.h>
int search( int list[], int n, int x )
{
	int j=0,result=0;
	for(j=0;j<n;j++)
	{
		if(x==list[j])
		{
			result=j;
			return result;
		}
	}
	if(result==0)
	{
		return -1;
	}
} 
3、本題調試過程碰到問題及解決辦法
          本題在解答的過程中沒有遇到問題;
  • 題目6-4找最大值及其下標
    1、設計思路
    (1)主要描述題目算法
    第一步:要找數組中的最大值及其下標,首先需要遍歷數組,故先定義循環變量j;
    第二步:根據題目給出的構造函數的形式,首先要給兩指針變量賦初值a=0,b=0;
    第三步:在遍歷數組的過程中利用if判斷語句,進行逐一的判斷數組中的最大值,並將其賦給a,將其下標賦給b;
    (2)流程圖:

     2、實驗代碼
    
#include<stdio.h>
int fun(int *a,int *b,int n)
{
	int j=0;
	*a=0;*b=0;
	for(j=0;j<n;j++)
	{
		if(*a<*(a+j))
		{
			*a=*(a+j);
			*b=j;
		}
	}
	return *a;
}
 3、本題調試過程碰到問題及解決辦法
            本題在解答的過程中沒有遇到問題;
  • 題目6-5最小數放前最大數放后
    1、設計思路
    (1)主要描述題目算法
    第一步:根據題目要求,此題需要定義三個函數接口;首先需要定義一個函數使得數組存入數據;
    第二步:在第二個函數接口中,需要進行題目要求的最小值在前,最大值在后的操作。要完成這個操作,首先要分兩步去進行,先把最小值去放在第一位。而在數組中第一位的小標一般為0,故可定義一個變量x=0,之后再遍歷數組,找出最小值並把它交換到一個位;同理可用此方法找最大值,但題目要求是把最大值放在最后,而在數組一般最后的元素下標為n-1,故可定義變量y=n-1,可用逆序遍歷的方法去找到最大值。(就個人而言,逆序遍歷還比較簡單,也可正序遍歷,純屬個人習慣);
    第三步:在第三個函數中,要去把已經進行完排序的數組進行輸出操作,定義此函數直接遍歷數組進行輸出。(注:題目中要求的每個元素輸出占3列,就個人的理解為在輸出次元素的時候前面還有2個和此元素相同類型的空間,即題目所需輸出的為%3d);
    (2)流程圖:①第一個函數:
    ②第二個函數:
    ③第三個函數:

         2、實驗代碼
    
#include<stdio.h>
void input(int *arr,int n)
{
	int i=0;
	for(i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
 } 
void max_min(int *arr,int n)
 {
 	int j=0,x=0,y=n-1;
 	for(j=0;j<n;j++)
 	{
 		if(arr[x]>arr[j])
 		{
 			int swap;
 			swap=arr[x];arr[x]=arr[j];arr[j]=swap;
		 }
	 }
	 for(j=n-1;j>0;j--)
	 {
	 	if(arr[y]<arr[j])
	 	{
	 		int temp;
	 		temp=arr[y];arr[y]=arr[j];arr[j]=temp;
		 }
	 }
 }
 void output(int *arr,int n)
 {
 	int k=0;
 	for(k=0;k<n;k++)
 	{
 		printf("%3d",arr[k]);
	 }
 }

修改后,簡便一點的答案,只含第二個函數:

void max_min(int *arr,int n)
 {
 	int j=0,max=0,min=0,swap=0,m=0,f=0;
 	for(j=0;j<n;j++)
 	{
 		if(j==0)
 		{
 			max=arr[0];min=arr[0];
		 }else
		 {
		 	if(max<arr[j])
		 	{
		 		max=arr[j];m=j;
			 }
			 if(min>arr[j])
			 {
			 	min=arr[j];f=j;
			 }
		 }
    }
    swap=arr[0];arr[0]=min;arr[f]=swap;
    swap=arr[n-1];arr[n-1]=max;arr[m]=swap;
	} 
         3、本題調試過程碰到問題及解決辦法
                     錯誤信息1:
 void max_min(int *arr,int n)
 {
 	int j=0,x=0,y=n-1;
 	for(j=0;j<n;j++)
 	{
 		if(arr[x]>arr[j])
 		{
 			int swap;
 			swap=arr[x];arr[x]=arr[j];arr[j]=swap;
		 }
	 }
	 for(j=n-1;j>0;j--)
	 {
	 	if(arr[y]<arr[j])
	 	{
	 		int temp;
	 		temp=arr[y];arr[y]=arr[j];arr[j]=temp;
		 }
	 }
 }
                     錯誤原因:出現這個錯誤主要是在第一次在編寫過程完成后再核對過程中出現的馬虎現象。當時在核對時,輸入pta中的實例,但由於沒仔細看輸出結果,故直接上傳到pta上,當出現錯誤的時候仔細看了下代碼,發現此方法在查找最小值是沒有問題的,問題主要出現在查找最大值的代碼中,由我自己寫的代碼,發現在查找到最大值之后也把最大值放到了最后一個位置,但是在這遍歷的過程中其他的位置上元素也發生了變化(自己也對這段代碼有些迷惑,但感覺自己的這種看法是對的)用此函數運行后的結果會出現這種的結果:


改正方法:在第一次提交錯誤之后,自己再重新檢查了一下自己代碼,找到原因所在,就重新的編寫了一遍。

  • 題目6-6指針選擇法排序(之前用了冒泡法,現在改為了選擇法)
    1、設計思路:
    (1)第一步:根據題目,要求把數組的元素從小到大遍歷一遍,故首先在創建循環變量,由於用到選擇法(或冒泡法)排序,需要定義兩個循環變量,故定義j=0,k=0;
    第二步:利用冒泡法排序的話,其原理是先將首元素和其他元素逐一比較進行交換,並在數組中依次類推到其他的元素上,依次排序;
    (題目說選擇法排序,但我用了冒泡法排序,也是通過了測試,感覺用冒泡還比較熟悉一點,選擇法排序和冒泡自我認為大同小異)
    (2)流程圖:

       2、實驗代碼
    
#include<stdio.h>
void sort(int *x,int n)
 {
 	int j=0,k=0,max=0,swap=0,flag=0;
 	for(j=0;j<n-1;j++)
 	{
 		max=x[j];
 		flag=j;
 		for(k=j+1;k<n;k++)
		{
			if(max<x[k])
			{
				max=x[k];flag=k;
			}
		 }
		 swap=x[j];x[j]=max;x[flag]=swap; 
	 }
  } 
      3、本題調試過程碰到問題及解決辦法
                    本題在調試過程中沒有出現問題;
  • 題目6-7判斷回文字符串
    1、設計思路:
    (1)第一步:判斷是否為回文字符串滿足的條件為首尾相等,且首加一,尾減一仍成立,依次類推。故,首先先找出這個字符串的長度;
    第二步:在找到長度之后,再定義兩個循環變量進行依次的判斷只要出現兩者不相等的時候就返回false,反之返回true;
    (2)流程圖
    2、實驗代碼
#include <stdio.h>
#include <string.h>
#define MAXN 20
bool palindrome( char *s )
{
	int i=0,j,flag,n;
    flag = strlen(s);
    j = flag - 1;
    n = flag/2;
    while(i<=n){
        if(*(s+i)!= *(s+j))
            return false;
        j--;
        i++;
    }
    return true;
 } 
      3、本題調試過程碰到問題及解決辦法
              錯誤信息1

              錯誤原因:起初,在寫這種含有字符問題的時候是比較懵的,當拿到這個題之后,自己當時只有一個怎么去判斷是否為回文的方法構架,就是簡單的去挨個去比較由中心字符隔開的左右兩側是否相同。於是就寫下來上述的截圖代碼。在當時自己很肯定的說這個是錯的,但是不知道具體出現在哪。
              改正方法:於是就去網上查了一下相關的代碼。找到了一個和我的想法查不太多的看了之后就仿照他的寫了自己的這個代碼。總結的看,我的代碼可能是在for語句上出現了錯誤,以及在前后兩者在進行比較的時候也是錯的。
  • 題目6-8使用函數實現字符串部分復制
    1、設計思路
    (1)第一步:根據題目要求,首先要引入一個有關字符的函數包這是為了之后在字符進行操作的是所用到的。
    第二步:之后利用字符所擁有的函數,將已知的字符復制到一個空的字符數組里。
    第三步:再根據題目要截取已知的字符數組的一部分,此時需要進行嵌套,讓空的數組進行依次截取出所需的數組;

             (2)流程圖
    


2、實驗代碼
```
#include <stdio.h>
#include<string.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s )
{
int i,j,len;

strcpy(s, t);  
len = strlen(s);  
for(i=m-1;i>0;i--){  
    for(j=i;j<len;j++){  
        s[j-1]=s[j];  
    }  
}  
s[len-m+1]='\0'; 
}
```
        3、本題調試過程碰到問題及解決辦法
                錯誤信息1:本題沒有問題,因為自己不會寫;
                改正方法:自己去網上去查了查才會的這道題。這道題看明白之后,自己感覺似懂非懂,有種一看就會又有種看不懂的感覺。但是這個是自己仿照網上自己憑感覺寫的,只是幸運的通過了。
  • 附加題3
    實驗代碼
#include<stdio.h>
#include<string.h>
#define MAX 10
int main()
{
	char str[MAX];
	int i=0;
	char c=getchar();
	while(c!='\n')
	{
		str[i]=c;
		i++;
		c=getchar();
	}
	str[i]='\0';
	for(i=0;str[i]!='\0';i++)
	{
		if(str[i]=='y')
		{
			str[i]='a';
		}
		if(str[i]=='z')
		{
			str[i]='b';
		}
		if(str[i]>='a'&&str[i]<='x')
		{
			str[i]=str[i]+2;
		}
	}
		printf("%s",str);
	return 0;
}

實驗截圖:

流程圖:

作業要求三

1、總結兩周里所學的知識點有哪些學會了?哪些還沒有沒有學會?

         這兩周所學: 這兩周總的來說我學到了指針的用法。其中自我感覺較為重要的是指針在數組上的應用。同時這兩周我還復習鞏固了一下上學期的函數調用。
         未學會的知識點:這兩周是開學的前兩周,自我感覺講的內容和與上學期的聯系很密切,而我的問題也是和上學期的問題差不多,我在字符上的問題很大。一遇到這種問題整個人都是懵的,感覺啥也不會,在別的方面感覺還是可以的。所以自己打算補補在字符方面的內容。

2、PTA作業源代碼上傳Git

          ①Git超鏈接:

地址
②上傳成功截圖:

3、點評3位同學本周作業,並邀請3位同學點評作業

          ①點評3位同學:

於耀淞
豐大為
班慶澤
②邀請3位同學:
豐大為
班慶澤
執念丶。

4、表格和折線圖記錄學習情況

          ①表格:

          ②折線圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM