作業要求二
1)C進階第一次PTA作業(1)
6-1 計算兩數的和與差
本題要求實作一個計算輸入的兩數的和與差的簡單函數。
代碼如下:
`void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum = op1 + op2;
*pdiff = op1 - op2;
}`
指針在題目中的作用:
op1代表a,op2代表b,*psum代表sum,*pdiff代表diff。
6-2 拆分實數的整數與小數部分
本題要求實作一個拆分實數的整數與小數部分的簡單函數。
`void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart = x;
*fracpart=x - *intpart;
}`
x為輸入數,*intpart取x整數部分,*fracpart取輸入數減整數的部分(也就是小數部分)。
2)C進階第一次PTA作業(2)
6-1 在數組中查找指定元素
本題要求實作一個在數組中查找指定元素的簡單函數。
`int search(int list[], int n, int x ){
int i,index;
for(i=0;i<n;i++)
{
if(list[i]==x){
index = i;
break;
}else{
index = -1;
}
}
return index;
}`
(1)主要描述題目算法
第一步:聲明函數
第二步:定義兩個變量
第三步:規劃循環判斷數組中有無指定函數
第四步:傳回原函數
(2)流程圖
錯誤資訊:
錯誤原因:一開始找到相等函數的時候忘記在index=i之後加入break導緻循環繼續答案錯誤。
改正方法:在index=i;之後加入break。
6-2 找最大值及其下标
在一維整型數組中找出其中最大的數及其下标。
`int fun(int *a,int *b,int n){
int i;
for(i=0;i<n;i++){
if(a[i]>*a){
*a = a[i];
*b = i;
}
}return *a;
}`
第一步:聲明函數
第二步:定義一個變量
第三步:規劃循環判斷數組中前一個數是否比後一個大
第四步:是就交換然後記下下标
第五步:傳回原函數
錯誤原因:最初的時候不知道輸出什麼好,是以寫了return *a和return *b,結果答案錯誤。
改正方法:咨詢了室友之後,室友告訴我隻需要輸出return *a就行,我問了室友原因室友也不知道,希望老師解答一下。
3)C進階第一次PTA作業(3)
6-1 最小數放前最大數放後
為一維數組輸入10個整數;将其中最小的數與第一個數對換,将最大的數與最後一個數對換;輸出數組元素。
`void input(int *arr,int n){
int i;
for(i=0;i<n;i++){
scanf("%d",&*(arr+i));
}
}
void max_min(int *arr,int n){
int t;
int i,x,y,z;
int min=*arr;
int max=0;
for(i=0;i<n;i++){
if(*(arr+i)<min){
min=*(arr+i);
x=i;
}
}
t=*(arr+x);
*(arr+x)=*arr;
*arr=t;
for(y=0;y<n;y++){
if(*(arr+y)>max){
max=*(arr+y);
z=y;
}
}
t=*(arr+z);
*(arr+z)=*(arr+n-1);
*(arr+n-1)=t;
}
void output(int *arr,int n){
int i;
for(i=0;i<n;i++){
printf("%3d",*(arr+i));
}
}`
第一步:聲明第一個函數
第二步:輸入數組中所有的數
第三步:傳回原函數
第四步:聲明第二個函數
第五步:找出最小的數并記下下标
第六步:交換最小數
第七步:找出最大的數并記下下标
第八步:交換最大數
第九步:傳回原函數
第十步:聲明第三個函數
第十一步:輸出數組中所有的數
第十二步:傳回原函數
錯誤原因:一開始我寫成了
min=*(arr+i); *arr=min;
隻是一開始的值變成了最小值或最大值,并沒有交換,結果答案錯誤。
改正方法:經過的DEV C++運作之後我發現了問題定義了新的變量來表示指針,然後進行了交換的三行代碼,答案正确。
6-2 指針選擇法排序
指針選擇法對10個數進行由大到小的排序。
`void sort(int *x,int n){
int i,j,t;
for(j=1;j<10;j++)
for(i=0;i<10-j;i++)
{
if(*(x+i)<*(x+i+1))
{
t=*(x+i);
*(x+i)=*(x+i+1);
*(x+i+1)=t;
}
}
}`
第一步:聲明第一個函數
第二步:定義三個變量
第三步:确定一共循環幾次
第四步:第一個數與後面的數比較排序然後第二個數依此循環
第五步:傳回原函數
4)C進階第一次PTA作業(4)
6-1 判斷回文字元串
本題要求編寫函數,判斷給定的一串字元是否為“回文”。
`bool palindrome( char *s ){
int i,j;
int n = strlen(s);
for(i=0,j=n-1;i<=(n-1)/2;i++,j--)
{
if(*(s+i)!=*(s+j))
{
return false;
}
}
if(i>=j) return true;
}`
第一步:聲明第一個函數
第二步:定義兩個變量
第三步:數清楚一共幾個字元
第四步:判斷第一個數與最後一個數是否一樣
第五步:循環
第六步:傳回原函數
錯誤資訊(1):
錯誤原因:忘記了strlen函數導緻忘記取字元串字元的數量。
改正方法:寫入strlen函數。
錯誤資訊(2):
錯誤原因:開始我寫的是
if(s[i]!=s[j]) break; if(i>j) return ture; return no;
造成的錯誤就是忽略了隻有兩個字元的情況。
改正方法:
if(*(s+i)!=*(s+j)) { return false; } if(i>=j) return true;
對于這種情況進行了分别的讨論。
6-2 使用函數實作字元串部分複制
本題要求編寫函數,将輸入字元串t中從第m個字元開始的全部字元複制到字元串s中。
`void strmcpy( char *t, int m, char *s ){
int n;
n=strlen(t);
int i;
int a=0;
if(m<=n){
for(i=m;t[i-m]!='\0';i++)
{
*(s+a)=t[i-1];
a++;
}*(s + n) = '\0';
}else{
*s='\0';
}
}`
第一步:聲明第一個函數
第二步:數清楚一共幾個字元
第三步:判斷是否有意義
第四步:如果有意義讓字元串t從第m個字元開始的全部字元複制到字元串s
第五步:最後加入'\0'
第七步:如果沒意義直接讓字元串s變為'\0'
第八步:傳回原函數
流程圖
錯誤原因:一開始寫的是
t[i]!='\0'
忘記了i的取值一開始是m結果編譯錯誤。
改正方法:改為
t[i-m]!='\0'
。
附加題
小寫字母y變換為a,小寫字母z變換為b,其他字母變換成為該字母ASCII碼順序後2為字母
`#include<stdio.h>
void mima( char *s );
int main ()
{
char a[20];
gets(a);
mima(a);
printf("%s",a);
return 0;
}
void mima( char *s ){
int i;
for(i=0;*(s+i)!='\0';i++)
{
if(*(s+i)=='y'){
*(s+i)='a';
}else if(*(s+i)=='z'){
*(s+i)='b';
}else{
*(s+i)=*(s+i)+2;
}
}
} `
第一步:輸入字元串
第二步:聲明函數
第三步:循環判斷是否為y,z
第四步:如果為y則變為a,如果為z則變為b,如果都不是則加2
第五步:傳回原函數
第七步:輸出字元串
結果圖
作業要求三
1、總結兩周裡所學的知識點有哪些學會了?哪些還沒有學會?
在所在的兩個周,我們主要先複習了上半學期的主要知識,然後對于指針以及針對于一般變量、數組與字元變量代替,和指針在函數中的應用。更是學習了指針的理論知識和它所注意的事情。
主要沒有搞清楚還有三點,一是對于字元變量還是略有生疏經常忘記
t[i]!='\0'
需要
i=0
要讓初始量為零;二是對于"strcpy"、"strcat"、"strcmp"的應用還是不太明白:三是希望老師解答一下C進階第一次PTA作業(2)6-2 找最大值及其下标中我的錯誤。
2、将PTA作業的源代碼使用git送出到托管平台上,要求給出上傳成功截圖和你的git位址。
git位址:https://git.coding.net/wuyaole/dayixiagxueqi01.git
截圖
3、點評作業
高立彬
豐大為
于耀淞