PTA 8習題講解
判斷題

-
指標變數指向某變數的地址不一定是1000,陳述句的含義應該是將指標P指向的變數內容賦值為1000.

-
該陳述句的含義應該是定義了一個指標變數p,兩個int 型別的普通變數,

-
int *p只能指向int型別的變數,同樣char *p只能指向char型別的變數,double *p只能指向double型別的變數,float *p只能指向float型別的變數.

-
不同型別的指標變數不可以相互賦值,同型別的指標變數可以相互賦值,

-
*p是一個指標變數,需賦值一個可用的地址之后才可這樣賦值,

- 教材P189頁 在函式定義時將指標作為函式的形參,在函式呼叫時把變數的地址作為實參,



- a即陣列a的首地址,地址為常量,不可對其賦值,



- P201頁




- 字串比較規則是指依次比較相對應字符的ASCII碼,并回傳兩個字符的差,而不是比較兩個字串的長度




- 指標陣列存放的是指標,這些指標指向各個字串



單選題

























填空題
4-1
#include <stdio.h>
int main(void)
{
int a[10], b[10], *pa, *pb, i;
pa = a;
pb = b;
for( i=0; i<3; i++, pa++, pb++){
*pa = i;
*pb = 2*i;
}
pa = &a[0];
pb = &b[0];
for ( i=0; i<3; i++,pa++,pb++){
*pa = *pa + i;
*pb = *pb + i;
}
printf("%d %d", *--pa, *--pb); /* 輸出的數字之間有一個空格 */
return 0;
}
寫出下列程式的執行結果:
4 6
分析:

4-2

4-3

p+5指向e,遇到\0結束列印
4-4


4-5

程式填空題
- 5-1


- 5-35

5-2

#include <stdio.h>
#include <string.h>
int main(void)
{
//初始化//
char s[80], ch, *p, *q;
int i, j, n;
gets(s);
p = s (1分);
//消除輸入字串的前后空格//
while ( *p == ' ') p++ (1分);
n = strlen(s);
q = s+n-1(1分) ;
while ( *q == ' ') q--(1分) ;
//判斷是否是“回文”//
while (p<q (1分) && *p ==*q)
{
p++;
q--(1分);
}
if ( p<q )
printf("NO\n");
else
printf("YES\n");
return 0;
}
如果字串前后有空格,則經過第一個while后p指向第一個非空格的字符,同理,經過第二個while后q指向最后一個非空格的字符,這樣就實作了消除字串的前后空格
*通過指標p和q的依次移動來判斷回文,當通過p>=q退出回圈時,判斷為回文字串,當通過*p!=q退出回圈時,p<q,不是回文字串
- 5-3

- 5-4

- 5-5

突破點在于要求每傳送三個字符后再存放一個空格
for回圈里的陳述句將a中的字符依次傳到陣列b中
而 if 內的陳述句用來實作每傳送三個字符后再存放一個空格
當實作傳送完三個字符后,由于for回圈里的陳述句執行完后i++,因此這時候i=4,此時要進行存放空格的操作,
故可得出第二個空填==(i-1)%3 == 0==,第一個空填上==(i-1)%3!=0==
此時考慮特殊情況i=1時,由題意要進行傳字符而不是放空格的操作,所以第一個空補充為==(i-1)%3 == 0 || i-1 == 0==
函式題
6-4

# include <stdio.h>
void month_day ( int year, int yearday, int * pmonth, int * pday);
int main (void)
{
int day, month, year, yearday; /* 定義代表日、月、年和天數的變數*/
scanf ("%d%d", &year, &yearday );
month_day (year, yearday, &month, &day );/* 呼叫計算月、日函式 */
printf ("%d %d %d\n", year, month, day );
return 0;
}
/* 請在這里填寫答案 */
void month_day (int year,int yearday,int *pmonth,int *pday)
{
int k,leap;
int tab[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
leap=(year%4==0&&year%100!=0)||year%400==0;
for (k=1;yearday>tab[leap][k];k++)
yearday-=tab[leap][k];
*pmonth=k;
*pday=yearday;
}
6-1

#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;
}
6-3 利用指標找最大值

#include <stdio.h>
void findmax( int *px, int *py, int *pmax );
int main()
{
int max, x, y;
scanf("%d %d", &x, &y);
findmax( &x, &y, &max );
printf("%d\n", max);
return 0;
}
/* 你的代碼將被嵌在這里 */
void findmax( int *px, int *py, int *pmax )
{
if(*px>*py)
*pmax=*px;
else
*pmax=*py;
}
6-3

#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 )
{
int i;
for (i=0;i<n;i++)
if (list[i]==x){
return i;
break;
}
if (i==n)
return -1;
}
6-5

#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 )
{
int n;
n=strlen(s);
int i=0,k=n-1;
while(i<k){
if(s[i]!=s[k])break;
i++;k--;
}
if(i>=k)return true;
else return false;
}
6-6 陣列回圈右移

| a0 | a1 | a2 | a3 | … | … | … | … | an-2 | an-1 |
陣列回圈右移即每一個陣列元素都向右移m個單位
- 演算法思路:
先考慮:如何實作每個陣列元素向右移一個單位?
從陣列的最后一項開始,依次將每前一項的值賦給后一項,為了避免丟掉最后一項a[n-1]的資料,我們可以將a[n-1]這一項copy到一個變數temp中,當每次賦值完成后,a[1]中即為a[0]的值,然后我們可以再將temp中存放的a[n-1]的值賦值給a[0],這樣就實作了每個陣列元素都向右移一個單位 ^__ ^

| an-1 | a0 | a1 | a2 | … | … | … | … | an-3 | an-2 |
于是我們想:
st=>start: 如果要右移m個單位
op=>operation: 進行m次上述回圈
st(right)->op
- 具體代碼實作:
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代碼將被嵌在這里 */
int ArrayShift( int a[], int n, int m )
{
int i;
int k;
for(k=1;k<=m;k++)
{
int temp=a[n-1];
for(i=n-1;i>0;i--)
{
a[i]=a[i-1];
}
a[0]=temp;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/238591.html
標籤:其他
上一篇:編譯原理-文法的定義與分類
