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 | 指針的一些基本知識, | 對指針的運算不清晰,容易與數組混淆 |