2019第七周作業


2019年春季學期第七周作業

| 1 | 2 | |
| -------- | -----: |
| 課程名稱 | c語言程序設計2|
| 作業要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2935 |
| 我的課程目標 | 學習指針基本知識 |
|這個作業在哪個方面幫助我實現目標|指針與自定義函數結合刪除或修改字符串中的字符 |
|參考文獻|課本c語言程序設計指針章 |

基礎作業一

6-2 每個單詞的最后一個字母改成大寫 (10 分)

函數fun的功能是:將p所指字符串中每個單詞的最后一個字母改成大寫。(這里的“單詞”是指由空格隔開的字符串)。

函數接口定義:

void fun( char *p );

其中 p 是用戶傳入的參數。函數將 p所指字符串中每個單詞的最后一個字母改成大寫。

裁判測試程序樣例:

#include <stdio.h>
void fun( char *p );
int main()
{
 char chrstr[64];  int d ;
  gets(chrstr);
  d=strlen(chrstr) ;
  chrstr[d] = ' ' ;
  chrstr[d+1] = 0 ;
  fun(chrstr);
  printf("\nAfter changing:   %s\n", chrstr);
return 0;
}

/* 請在這里填寫答案 */

輸入樣例:

my friend is happy

輸出樣例:

After changing:   mY frienD iS happY

一)我的代碼

void fun( char *p )
{
    while(*p!='\0'){
		if(*p==' ')
		    *(p-1)=*(p-1)-32; //轉換 
		    *p++;
	}
}

二)設計思路

三)實驗遇到的問題及解決方案

此題需利用利用ASCII轉換原理,但是題目給的裁判測試程序樣例中沒有#include<string.h>這個函數,導致c++上一直編譯不對,因為有這個strlen(chrstr)必須有前面所提的函數,加上即可。一遍過。

四)運行結果截圖

基礎題二

7-2 自動售貨機 (30 分)

如圖所示的簡易自動售貨機,物品架1、2上共有10樣商品,按順序進行編號分別為1-10,標有價格與名稱,一個編號對應一個可操作按鈕,供選擇商品使用。如果物架上的商品被用戶買走,儲物櫃中會自動取出商品送到物架上,保證物品架上一定會有商品。用戶可以一次投入較多錢幣,並可以選擇多樣商品,售貨機可以一次性將商品輸出並找零錢。

用戶購買商品的操作方法是:

(1)從“錢幣入口”放入錢幣,依次放入多個硬幣或紙幣。錢幣可支持1元(紙幣、硬幣)、2元(紙幣)、5元(紙幣)、10元(紙幣),放入錢幣時,控制器會先對錢幣進行檢驗識別出幣值,並統計幣值總額,顯示在控制器顯示屏中,提示用戶確認錢幣放入完畢;

(2)用戶確認錢幣放入完畢,便可選擇商品,只要用手指按對應商品外面的編號按鈕即可。每選中一樣商品,售貨機控制器會判斷錢幣是否足夠購買,如果錢幣足夠,自動根據編號將物品進行計數和計算所需錢幣值,並提示余額。如果錢幣不足,控制器則提示“Insufficient money”。用戶可以取消購買,將會把所有放入錢幣退回給用戶。

輸入格式:

先輸入錢幣值序列,以-1作為結束,再依次輸入多個購買商品編號,以-1結束。

輸出格式:

輸出錢幣總額與找回零錢,以及所購買商品名稱及數量。

輸入樣例:

1 1 2 2 5 5 10 10 -1
1 2 3 5 1 6 9 10 -1

輸出樣例:

Total:36yuan,change:19yuan
Table-water:2;Table-water:1;Table-water:1;Milk:1;Beer:1;Oolong-Tea:1;Green-Tea:1;

一)我的代碼

#include<stdio.h>
#include<string.h>
int main()
{
  int i,num=0,sum=0,money;
    int a[11]={0},b[11]={0,1,1,1,2,2,3,3,3,4,4};
      char str[11][20]={"","Table-water",
      "Table-water","Table-water",
      "Coca-Cola","Milk",
      "Beer","Oolong-Juice",
      "Sprite","Oolong-Tea",
      "Green-Tea"
      };
        while (1)
        {
            scanf("%d",&money);
            if(money==-1)
            break;
            if(1<=money&&money<=10) 
            num+=money;//計算總錢數  
        }
            int type,change;
            while(1)
        {
            scanf("%d",&type);//輸入商品類型,以-1結束  
            if(type==-1)
             break;
            if(1<=type&&type<=10)    
            a[type]++; 
        }
            for(i=1;i<11;i++)
            sum+=b[i]*a[i];
            if(sum>num)//錢幣不足 
             printf("Insufficient money");
            else
            {
            printf("Total:%dyuan,change:%dyuan\n",num,num-sum);
            for(i=1;i<11;i++)
            if(a[i]!=0&&a[i]>=1&&a[i]<=10)//滿足條件即輸出
            printf("%s:%d;",str[i],a[i]);
            }
            return 0;
            }

二)設計思路

三)實驗遇到的問題及解決方案

剛開始想用switch語句來解決這個題,但是忘得差不多了,沒辦法,用這學期學的數組與字符串結合來弄,耗費了我幾個小時,等到提交時答案只對了一部分·,數組沒初始化導致所購買商品數量為一個隨機值,初始化之后發現答案對了一半,最大sample等價錯誤,仔細檢查了一下我的代碼,發現最后輸出商品數量所用的條件&&與||一起用了,沒使運算符一致。下次要更注意了。

四)運行結果截圖

預習題

7-1 使用函數刪除字符串中的字符 (10 分)

輸入一個正整數 repeat (0<repeat<10),做 repeat 次下列運算:

輸入一個字符串 str,再輸入一個字符 c,將字符串 str 中出現的所有字符 c 刪除。

要求定義並調用函數delchar(str,c), 它的功能是將字符串 str 中出現的所有 c 字符刪除,函數形參str的類型是字符指針,形參c的類型是char,函數類型是void。

輸入輸出示例:括號內為說明,無需輸入輸出

輸入樣例:

3               (repeat=3)
happy new year  (字符串"happy new year")
a               (待刪除的字符'a')
bee             (字符串"bee")
e               (待刪除的字符'e')
111211          (字符串"111211")
1               (待刪除的字符'1')

輸出樣例:

result: hppy new yer    (字符串"happy new year"中的字符'a'都被刪除)
result: b               (字符串"bee"中的字符'e'都被刪除)
result: 2               (字符串"111211"中的字符'1'都被刪除)

一)我的代碼

#include<stdio.h>
void delchar(char str[],char c);
int main()
{    
    int n;   
    char str[80],c;  
    scanf("%d\n",&n);    
    while(n--)  
    {        
    gets(str);  //輸入字符串         
    scanf("%c",&c);         
    printf("result: ");        
    delchar(str,c);//調用函數     
    }   
    return 0;
}
void delchar(char str[], char c){ 
    char *p,*q;  
    p=str; //將字符指針賦值給p,p和str同時指向傳遞過來的字符串    
    while(*p!='\0')     
    {      
    if(*p==c)   //特定刪除的字符                 
    { 	   
    q=p;//指針p賦值給q
    while(*q!='\0')             
    { 	
    *q=*(q+1); 
    q++;  //刪除該字符
    }      
    q='\0';   //字符串結束    
    }      
    if(*p!=c)    
        putchar(*p);	
        p++;         
        } 
 }

二)設計思路

三)實驗遇到的問題及解決方案

四)運行結果截圖

學習感悟

學習真的是一件體力活,想代碼也是。感覺指針真是個難懂,同時又萬能,相當於一個媒介。本周仔細看了指針的運算,通過函數調用來改變主調函數中的某個值,使用指針作為參數。兩個相同類型指針相減表示它們之間相隔的存儲單元數目,其他操作非法。指向同一個數組中的不同元素的兩個指針可以進行關系運算,例如p1=p2表示兩者指向同一數組元素,p1>p2表示p1處於高地址位置,指針變量還可以與0比較<p=0表示其是一個空指針,不指向任何變量,空指針是由對指針變量賦予0值所得到的。一個表達式的最后結果如果是一個指針,那么則為指針表式,它具有四個要素,指針類型,指針所指向的類型,指針指向的內存區,指針自身占據的內容。利用指針編程可以表示各種數據,通過#指針可使主調函數與被調函數實現數據結構。總而言之,指針好處多多,還有很多不懂的地方,應該好好去學。

結對編程感想

周三晚自習是一個結對編程的好時光,每一次都能有所收獲。這周和隊友一起討論解題的時間太少,原因就是我去開會了,開完會后匆匆忙忙趕到教室差不多只有半小時了,就和隊友先討論了一下第一題把單詞字母改為大寫,這題他提前做過了,因此把他的思路分享給了我,利用ASCII轉換原理轉變為大寫,因此我使用while語句和指針的減法做了出來。討論第二題時,我認為用數組和字符串的知識看能不能解出來,隊友主張用switch語句,然后簡單說了幾句,下課了,所以這周的結對編程我還是做的比較失敗的,下周會堅持和隊友討論做題。

學習進度

周/日期 這周所花的時間 代碼行 學到的知識點簡介 目前比較迷惑的問題
4-7-4/11 2天三小時 101 指針的一些基本知識, 對指針的運算不清晰,容易與數組混淆

折線圖


免責聲明!

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



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