2018年3月份的PTA(一)


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


由程序說明p++等價於(p)++,因為(p++)在程序中是沒有地址的,而輸出中p++和(*p)++的地址不同是由於在線C語言開發環境地址是動態的

C高級第一次PTA作業(1)

題目6-1 計算兩數的和與差

1.設計思路

(1)算法:(子函數)

第一步:子函數的聲明,子函數名sum_diff,定義輸入的兩個實屬的形參op1,op2,以及兩個實數和與差的變量對應的指針型變量的形參psum,pdiff
第二步:在子函數中使用間接訪問運算符*,訪問兩實數和與差的地址即對應的變量,用形參計算和與差

(2)流程圖

2.實驗代碼

#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\nThe diff is %.2f\n", sum, diff);
    return 0; 
}
void sum_diff(float op1,float op2,float *psum,float *pdiff)
{
  *psum=op1+op2;
  *pdiff=op1-op2;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:

錯誤原因:編譯錯誤,在子函數中計算和與差時,用的形參變量是主函數的變量
改正方法:將子函數中的a,b改成op,op2
錯誤信息2:

錯誤原因:子函數中計算差時多想了,考慮了差為負數,自行加了一個絕對值
改正方法:將絕對值去掉

題目6-2 拆分實數的整數與小數部分

1.設計思路

(1)算法(子函數)

第一步:定義子函數名字splitfloat,定義實數x的形參單精度型x,實數x的整數部分地址的形參指針型intpart,實數x小數部分地址的形參指針型fracpart
第二步:間接訪問實數x的整數部分是強制實數x為整型的值,間接訪問實數x的小數部分是實數x減去強制實數x為整型值的差

(2)流程圖

2.實驗代碼

#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\n", intpart);
    printf("The fractional part is %g\n", fracpart);
    return 0;
}
void splitfloat(float x,int *intpart,float *fracpart)
{
  *intpart=int(x);
  *fracpart=x-int(x);
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:

錯誤原因:進行強制類型轉換時,在變量x上加了括號,類型int上沒加括號
改正方法:將括號加在類型int上,變量x上的括號去掉

C高級第一次PTA作業(2)

題目6-1 在數組中查找指定元素

1.設計思路

(1)算法(子函數)

第一步:定義整型子函數名search,定義形參數組list[],數組長度n,待找數x
第二步:設置指針型循環變量i的初值為數組首元素的地址,循環條件為循環變量i在數組地址的范圍內
第三步:判斷地址i對應的數是否為待找的數x,若是則返回對應增加的sizeof的個數,否則繼續循環
第四步:若循環結束還未有返回值則返回-1

(2)流程圖

2.實驗代碼

#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\n", index);
    else
    printf("Not found\n");
    return 0;
}
int search(int list[],int n,int x)
{
  for(signed int *i=list;i<list+n;i++)
  {
    if(*i==x)
    return i-list;
  }
  return -1;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:

錯誤原因:把主函數的變量a胡亂放在子函數中使用了,形參list是一個不變的地址,錯誤地直接把list當作循環變量了
改正方法:重新定義指針型循環變量i,使它的初值為數組首元素的地址,把a改成形參list,list改成i

題目6-2 找最大值極其下標

1.設計思路

(1)算法(子函數)

第一步:定義子函數名fun,形參整型指針型a、b,整數n
第二步:a=>max,定義整型指針型循環變量i等於a+1
第三步:若i<a+n,則下一步,否則返回max
第四步:若
i>max,則I=>max,i-a=>a,i<=i+1,跳到第三步

(2)流程圖

2.實驗代碼

#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\n",max,p);
	return 0;
}
int fun(int *a,int *b,int n)
{
  int max=*a;
  for(signed int *i=a+1;i<a+n;i++)
  if(*i>max)
  {
    max=*i;
    *b=i-a;
  }
  return max;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:

錯誤原因:在定義循環變量i時,將循環變量i定義成整型而不是指針型,導致進行循環時間接訪問的不是地址
改正方法:將循環變量i定義成指針型

C高級第一次PTA作業(3)

題目 6-1 最小數放前最大數放后

1.設計思路

(1)算法(子函數)

第一步:定義子函數名intput,形參整型指針型arr,整型n
第二步:循環變量i<=0
第三步:若i<數組長度n,則下一步,否則返回主函數
第四步:輸入*(arr+i),i<=i+1,跳到第三步

第一步:定義子函數名max_min,形參整型指針型arr,整型n
第二步:arr=>MAX,arr=>MIN,整型循環變量1=>i
第三步:若i<n,則下一步,否則跳到第五步
第四步:若(arr+i)>MAX,則(arr+i)=>MAX,i=>max,若(arr+i)<MIN,則(arr+i)=>MIN,i=>min,i<=i+1,跳到第三步
第五步:交換(arr+min)和arr,交換(arr+max)和(arr+n-1)

第一步:定義子函數名output,形參整型指針型arr,整型n,整型循環變量i<=0
第二步:若i<n,則下一步,否則返回主函數
第三步:輸出*(arr+i),i<=i+1,跳到第二步

(2)流程圖

2.實驗代碼

#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)
{
  for(signed short int i=0;i<n;i++)
  scanf("%d",arr+i);
}
void max_min(int *arr,int n)
{
  short int MAX=*arr,MIN=*arr,swap,max,min;
  for(signed short int i=1;i<n;i++)
  {
    if(*(arr+i)<MIN)
    {
      MIN=*(arr+i);
      min=i;
    }
  }
  swap=*(arr+min);
  *(arr+min)=*arr;
  *arr=swap;
  for(signed short int i=1;i<n;i++)
  {
    if(*(arr+i)>MAX)
    {
      MAX=*(arr+i);
      max=i;
    }
  }
  swap=*(arr+max);
  *(arr+max)=*(arr+n-1);
  *(arr+n-1)=swap;
}
void output(int *arr,int n)
{
  for(signed short int i=0;i<n;i++)
  printf("%3d",*(arr+i));
}

3.本題調試過程碰到問題及解決辦法

本題無錯誤信息

題目6-2 指針選擇法排序

1.設計思路

(1)算法(子函數)

第一步:定義子函數名sort,形參整型指針型x,整型n
第二步:整型指針型循環變量i<=x,j,整型指針型k
第三步:i賦給k,i+1=>j
第四步:若j<x+n,則跳到第六步,否則下一步,若k<j,則j賦給k,否則下一步
第五步:j+1=>j,跳到上一步
第六步:交換k和i,i+1=>i,若i<x+n-1,則跳到第三部,否則返回主函數

(2)流程圖

2.實驗代碼

#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("\n");
	return 0;
 }
void sort(int *x,int n)
{
  for(signed int *i=x;i<x+n-1;i++)
  {
    short int *k=i;
    for(signed int *j=i+1;j<x+n;j++)
    if(*k<*j)
    k=j;
    int swap;
    swap=*i;
    *i=*k;
    *k=swap;
}

3.本題調試過程碰到問題及解決辦法

本題無錯誤信息

C高級第一次PTA作業(4)

題目6-1 判斷回文字符串

1.設計思路

(1)算法(子函數)

第一步:定義子函數名palindrome,形參字符指針型s
第二步:整數N為字符串s的長度,循環變量i<=0,j<=N-1
第三步:若j>=N/2,則下一步,否則跳到第五步
第四步:若(i+s)不等於(j+s),返回false,否則j-1=>j
第五步:i+1=>i,若i<=N/2,跳到第三步,否則返回true

(2)流程圖

2.實驗代碼

#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\n");
    else
    printf("No\n");
    printf("%s\n", s);
    return 0;
}
bool palindrome(char *s)
{
  short int N=strlen(s);
  short int i=0,j=N-1;
  for(;i<=N/2;i++)
  while(j>=N/2)
  if(*(i+s)!=*(j+s))
  return false;
  else
  {
    j--;
    break;
  }
  return true;
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:

錯誤原因:把主函數的實參sp當子函數的形參s用了,循環變量定義成了指針型,但是賦了一個整數值,不是地址
改正方法:把sp改成s,循環變量改成整型
錯誤信息2:

錯誤原因:兩次for循環把前半部分的字符和后半部分的每一個字符都進行比較了,所以第二輪就返回false
改正方法:把內循環改成while循環,這樣每次循環的時候就確保第幾個字符和倒數第幾個字符比較了
錯誤信息3:

錯誤原因:循環條件當遇到字符的長度是偶數的時候,中間的兩個數沒有在范圍內,導致沒有比較到
改正方法:在循環條件上都加一個等號

題目6-2 使用函數實現部分字符串復制

1.設計思路

(1)算法(子函數)

第一步:定義子函數名strmcpy,形參字符指針型t,整型m,字符指針型m
第二步:若m>主函數數組長度MAXN,則'\0'=>s,否則下一步
第三步:循環變量i<=m-1,j<=0
第四步:若i<MAXN,則返回下一步,否則返回主函數
第五步:
(s+j)<=(t+i),(t+i+1)<='\0',i+1=>i,j+1=>j,返回上一步

(2)流程圖

2.實驗代碼

#include <stdio.h>
#define MAXN 20
void strmcpy( char *t, int m, char *s );
void ReadString( char s[] ); /* 由裁判實現,略去不表 */
int main()
{
    char t[MAXN], s[MAXN];
    int m;
    scanf("%d\n", &m);
    ReadString(t);
    strmcpy( t, m, s );
    printf("%s\n", s);
    return 0;
}
void strmcpy(char *t,int m,char *s)
{
  short int i=m-1,j=0;
  if(m>MAXN)
  *s='\0';
  else
  {
    for(i=m-1,j=0;i<MAXN;i++,j++)
    *(s+j)=*(t+i);
    *(t+i+1)='\0';
  }
}

3.本題調試過程碰到問題及解決辦法

錯誤信息1:

錯誤原因:循環變量i,j在循環初值中設定的,只適用於for循環,在子函數的語句中無法使用
改正方法:將循環變量的定義放在子函數的范圍內

額外加題3

#include <stdio.h>
#include <stdlib.h>
int main()
{
	char code;
	do
	{
		code=getchar();
		if(code=='z')
		code='b';
		else if(code=='y')
		code='a';
		else if(code<='x'&&code>='a')
		putchar(code);
	}
	while(code!='\n'||code!='\0');
	system("pause");
	return 0;
}

學習總結和進度

總結知識點:

這周主要指針的定義、使用,數組指針的使用,字符串的使用,間接訪問符號,指針型的變量就是一個地址,地址存放的是一個變量的值,通過指針變量間接訪問可以實現在子函數中直接改變指針變量指向的變量的值,在寫代碼的時候容易把主函數的變量當作子函數的變量使用,出現編譯錯誤,要用到地址的變量沒設置成指針型,這是幾個容易犯的錯誤。

git地址:https://github.com/MemoriesBook/C-PTA-.git

董欣

董雅潔

馮子旋

日期 代碼時間 代碼行數 博客時間 博客行數
3.12 0 0 0 0
3.13 0 0 0 0
3.14 6 3 25 17
3.15 11 5 0 0
3.16 0 0 0 0
3.17 0 0 0 0
3.18 9 7 19 24
3.19 17 21 0 0
3.20 0 0 0 0
3.21 0 0 0 0
3.22 12 8 31 40
3.23 48 19 45 86
3.24 0 0 0 0
3.25 0 0 0 0


免責聲明!

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



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