39個C語言小程式(適合新手)
#include <stdio.h>
int main()
{
char a,b;
int sum;
printf("輸入兩個數字(0~9\n");
scanf("%c %c",&a,&b);
if(a==b){
考點:if else的用法,以及ascii碼中數值的大小,這個可以用man ascii檢視ascii表格printf("兩數不能相等!\n"); }else if( a<'0'|| a >'9' || b < '0' || b > '9'){ printf("兩個數必須為0~9的數字\n"); }else { sum=(a-'0')*10 + (b-'0'); printf("result = %d\n",sum); } return 0; }
------------------------------------------------------------------------------------------------------------------------------
2. 從鍵盤上輸入一個字元,如果它是大寫字母,則把它轉換成小寫字母輸出;否則,直接輸出。
考點:ascii碼中大小寫字母之間的差值,以及if else用法#include <stdio.h> int main(){ char a; printf("輸入一個字元"); scanf("%c",&a); if(a>='A' && a<='Z'){ a=a+32; printf("%c\n",a); }else if(a>='a' && a<='z'){ printf("%c\n",a); }else{ printf("請輸入一個字元\n"); } return 0; }
------------------------------------------------------------------------------------------------------------------------------
3. 程式設計輸入一串字串將字串中,字母、數字和其他符號歸類,並統計出各個字元的個數。
考點:分函式,以及傳參時簡單的一級指標的應用int charsize(char a[]);//字串長度函式 void classify(int n,int *a,int *b,int *c,char *ptr);//統計 int main() { char ch[200]; int i; int a=0,b=0,c=0; printf("輸入一個字串\n"); scanf("%s",ch); charsize(ch); classify(charsize(ch),&a,&b,&c,ch); printf("總共輸入%d個字元\n\n",charsize(ch),b); printf("字母有%d個\n數字有%d個\n其他有%d個\n",a,b,c); return 0; } //統計字串的長度,也可以用string.h庫中的函式,stelrn(char *str)函式來確定字串長度,新手建議自己動手寫。 int charsize(char a[]) { int n=0; while(*(a+n) != '\0') { n++; } return n; } //分類其中a,b,c,分別代表字母,數字,和其他。 void classify(int n,int *a,int *b,int *c,char *ptr) { int i; for(i=0;i<n;i++){ if((*(ptr+i)>='a'&&*(ptr+i)<='z')||(*(ptr+i)>='a'&&*(ptr+i)<='z')){ (*a)++; } else if((*(ptr+i)>='0'&&*(ptr+i)<='9')){ (*b)++; } else{ (*c)++; } } return ; }
------------------------------------------------------------------------------------------------------------------------------
4. 從鍵盤上輸入一個百分制成績 score,按下列原則輸 出 其 等 級 : score≥90 , 等 級 為 A ;80≤score<90,等級為 B;70≤score<80,等級為C;60≤score<70,等級為 D;score<60,等級為E。
#include <stdio.h>
void score(int temp)
{
switch(temp)
{
case 10:
printf("The score is : A");
break;
case 9 :
printf("The score is : A");
break;
case 8 :
printf("The score is : B");
break;
case 7 :
printf("The score is : C");
break;
case 6 :
printf("The score is : D");
break;
default:
printf("The score is : E");
break;
}
printf("\n");
return ;
}
int main()
{
int sco,temp;
printf("輸入一個學生成績:\n");
scanf("%d",&sco);
temp = sco/10;
score(temp);
return 0;
}
考點:分函式、switch語句的用法
------------------------------------------------------------------------------------------------------------------------------
5. 程式設計實現以下功能:讀入兩個運算數(data1 和 data2)及一個運算子(op),計算表示式 data1 opdata2 的值,其中 op 可為‘+’,‘-’,‘*’,‘/’(用 switch 語句實現)
這裡我們將+ - * / 以及main函式,分別用add.c sub.c mul.c div.c main.c 分別來寫,注意:這裡並不是分檔案,只是C語言的靈活寫法
//add.c
#include <stdio.h>
int add(int x,int y,int *res)
{
*res = x + y ;
return 0;
}
//sub.c
#include <stdio.h>
int sub(int d1,int d2,int *res)
{
*res = d1 - d2 ;
return 0;
}
//sub.c
#include <stdio.h>
int mul(int x,int y,int *p)
{
*p = x * y ;
return 0;
}
//div.c
#include<stdio.h>
int div(int x,int y,int *res)
{
if( y == 0 )
{
return 1;
}
else
{
*res = x / y ;
return 0;
}
}
//main.c
#include <stdio.h>
extern int add(int x,int y,int *res);
extern int sub(int x,int y,int *res);
extern int mul(int x,int y,int *res);
extern int div(int x,int y,int *res);
extern void display(int x,int *y);
int (*fun)(int x,int y,int *res); //函式的指標
int main()
{
char op;
int data1,data2,result; //result變數用來儲存運算後儲存的結果。
printf("輸入 A op B ,eg: 5 + 4 :\n");
scanf("%d %c %d",&data1,&op,&data2);
switch(op)
{
case '+':fun = add;break;
case '-':fun = sub;break;
case '*':fun = mul;break;
case '/':fun = div;break;
}
display(fun(data1,data2,&result),&result);//fun函式:將data1和data2的運算結果,儲存在result中
return 0;
}
這裡編譯的時候需要將.c檔案全部編譯:gcc add.c mul.c sub.c div.c main.c -o exe考點:extern關鍵字的靈活用法
------------------------------------------------------------------------------------------------------------------------------
6. 下面程式的功能是用 while 語句求 1 至 1000的數,且一行只打印五個數。
#include <stdio.h>
int main()
{
int i=0;
int count=0;
while(i<1000);
{
if((i%3==2)&&(i%5==3)&&(i%7==2))
{
printf("%5d",i);
count++;
if(count%5==0)
{
printf("\n");
}
}
i++;
}
return 0;
}
考點:while()語句------------------------------------------------------------------------------------------------------------------------------
7. 求 fibonacci 數列的前 40 個數。該數列的生成方法為:F1=1,F2=1,Fn=Fn-1+Fn-2(n>=3),即從第 3 個數開始,每個數等於前 2 個數之和。
#include <stdio.h>
#if 1
int fibonacci(); //外部函式宣告(extern)
int main()
{
int i;
for(i=0;i<40;i++){
if(i%4==0){ //每4個數為一行
printf("\n");
}
printf("%10d",fibonacci()); //列印fibonacci數列
}
printf("\n");
return 0;
}
/*
函式功能:計算fibonacci數列的下一個值
返回值 :last(fibonacci數列下一個值)
*/
int fibonacci()
{
static int last = 0;
static int last_but_one = 1;
int next;
next = last + last_but_one;
last_but_one = last; //注意賦值順序,防止last被覆蓋
last = next;
return last; //下一個數值
}
/*
static:靜態變數,函式結束後,變數不會被收回,佔用的內從空間還在,
空間裡儲存的數值還存在。
1 0 1 1 2 3 5
l_b_o l n l_b_o l n
last_but_one : l_b
last : l
next : n
*/
考點:static關鍵字
------------------------------------------------------------------------------------------------------------------------------
8. 編寫程式,輸出用一元人民幣兌換成 1 分、2 分和5 分硬幣的不同兌換方法。
#include <stdio.h>
int main()
{
int i; //兌換成5分的兌換方法,最多可兌換20個。
int j; //兌換成2分的兌換方法,最多可兌換50個。
int k; //兌換成1分的兌換方法,最多可兌換100個。
int count=0; //迴圈次數(種類)
for(i=0;i<=100/5;i++) //5分迴圈次數
{
printf("Five cents: %-5d",i); //2分迴圈次數
for(j=0;j<=(100-5*i)/2;j++)
{
count++;
if(j%5 == 0)
{
printf("\n");
}
printf("Two cents: %-5d",j);
k = 100 - 5*i - 2*j; //5分,2分已知,1分兌換方法固定
printf("One cent:%-5d",k);
}
printf("\n");
}
printf("the count is : %d\n",count);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------9. 打印出 100~1000 之間的所有“水仙花數”(“水仙花數”是指一個 3 位數,各位數字的立方和等於該數本身。 153=1 +5 +3 , 就是“水仙花數” )如:153
#include <stdio.h>
mypower(int x,int y);//求x的y次冪,x底數,y冪數
int is_flower();
int part();
int main()
{
int i;
for(i=100;i<1000;i++)
{
if(is_flower(i))
{
printf("%6d",i);
}
}
printf("\n");
return 0;
}
int is_flower(int n)//一個數是否為水仙花數
{
int sum=0;
int i;
for(i=0;i<3;i++)
{
sum += part(n,i);//i=0,個位的3次方;i=1,十位的3次方;i=2,百位的3次方
}
if(n == sum)
{
return 1;
}
else
{
return 0;
}
}
int part(int num,int digital)//num:輸入的數,digital:輸入的數的每位數為多少
{
int s;
int ss;
s = num/mypower(10,digital)%10;//分離一個百位數,求底數
ss = mypower(s,3); //求這個底數的三次方
return ss;
}
double mypower(double x,double y)
{
double sum=1;
int i;
if(y==0)
{
return 1.0;
}
if(y>0)
{
for(i=0;i<y;i++)
{
sum=sum*x;
}
}
if(y<0)
{
for(i=y;i<0;i++)
{
sum=sum*x;
}
sum=1.0/sum;
}
return sum;
}
------------------------------------------------------------------------------------------------------------------------------10. 程式設計取滿足式 11+20+29+38 ...... +n ≤100 的 n。
#include<stdio.h>
int main()
{
int i;
int a = 11;
int q = 9;
int n,nn; //nn = n+1
int sum = 0; //前n項總和
int sum_but_next = 0; //前n+1項總和
for(i=0;i<10;i++)
{
n = q * i + a;
nn = q * (i+1) + a;
sum = sum + n;
sum_but_next = sum + nn;
if(sum <= 100 && sum_but_next >= 100)
{
printf("i = %d\n",i); //輸出第n項
printf("n = %d\n",n); //項數n為多少
}
}
return 0;
}
-----------------------------------------------------------------------------------------------------------------------------11. 下面程式的功能是從鍵盤輸入一個字串,然後反序輸出輸的字串
#include <stdio.h>
#include <string.h>
int main()
{
int i;
char arra[128];
char arrb[128];
printf("輸入字串\n");
scanf("%s",arra); //輸入的字串存入arra陣列中
for(i=0;i<strlen(arra);i++) //strlen(arra)求arra字串的長度
{
arrb[strlen(arra)-1-i] = arra[i]; //將arra中的字串倒序存入arrb中
}
printf("%s\n",arrb);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------12. 下面程式的功能是顯示具有 n 個元素的陣列 s 中的最大元素,輸出最大數值和其位置。
#include <stdio.h>
#define N 6
void input(int n,int *ptr); //輸入函式,從鍵盤上輸入N個數,N為define N 定義的數
int fun_max(int n,int a[]); //查詢最大值,[email protected]:最大值下標
int main()
{
int arr[N];
input(N,arr); //輸入函式,輸入N個元素,arr:儲存陣列的元素
printf("the max is arr[%d] = %d\n",fun_max(N,arr),*(arr+fun_max(N,arr)));
return 0;
}
/*
*功能:查詢一個數組中的最大數位置
* */
int fun_max(int n,int a[])
{
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++)
{
if(temp < *(a+i+1))
{
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
/*
*功能 :輸入一個數組。
*param :n:輸入陣列的個數,*ptr:指向陣列的指標
* @return:空
* */
void input(int n,int *ptr)
{
int i,j;
printf("Input %d Integer:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&j);
*(ptr+i) = j;
}
}
------------------------------------------------------------------------------------------------------------------------------13. x 的值轉換為二進位制數,所得的二進位制數放在一個一維陣列中返回,二進位制數的最低位放在下標為 0 的元素中。
#include <stdio.h>
void output(int n,int *ptr);//輸出顯示一個數組的內容,
//n:陣列中元素的個數,*ptr,陣列指標。
int main()
{
int x;
int i = 0;
int arr[20]={0};
printf("please input a num\n");
scanf("%d",&x);
while(1){
*(arr+i)=x % 2;
x = x / 2;
i++;
if(x == 0){
break;
}
}
output(i,arr);
return 0;
}
void output(int n,int *ptr)
{
int i;
for(i=0;i<n;i++)
{
printf("%4d",*(ptr+i));
}
printf("\n");
}
------------------------------------------------------------------------------------------------------------------------------14. 以下程式是用來輸入 5 個整數,並存放在陣列中,找出最大數與最小數所在的下標位置,並把二者對調,然後輸出調整後的 5 個數。
//lib.h
#ifndef LIB_H
#define LIB_H
int fun_max(int n,int a[]);
int fun_min(int n,int a[]);
void input(int n,int *ptr);
void output(int n,int *ptr);
void swap(int *x,int *y);
#endif
//lib.c
#include <stdio.h>
int fun_max(int n,int a[]){ //n:陣列中元素個數,a[]:陣列指標,指向要查詢的陣列
int i;
int temp = *a; //取第一項,然後逐次與下一相比較
int count = 0;
for(i=0;i<n-1;i++){
if(temp < *(a+i+1)){ //如果下於下一項,那麼最大值為下一項
temp = *(a+i+1);//將最大值賦給temp
count = i+1; //下表值加1。
}
}
return count;
}
int fun_min(int n,int a[]){
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++){
if(temp > *(a+i+1)){
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
void input(int n,int *ptr){
int i,j;
printf("Input %d Integer:\n",n);
for(i=0;i<n;i++){
scanf("%d",&j);
*(ptr+i) = j;
}
}
void output(int n,int *ptr){
int i;
for(i=0;i<n;i++){
printf("%4d",*(ptr+i));
}
printf("\n");
}
void swap(int *x,int *y){
int sw;
sw = *x;
*x = *y;
*y = sw;
}
//main.c
#include <stdio.h>
#include "lib.h"
#define N 5
int main()
{
int arr[N]={0};
input(N,arr); //輸入一個數組
printf("the max is arr[%d] = %d\n",fun_max(N,arr),*(arr+fun_max(N,arr)));
printf("the min is arr[%d] = %d\n",fun_min(N,arr),*(arr+fun_min(N,arr)));
swap(arr+fun_max(N,arr),arr+fun_min(N,arr)); //交換兩個陣列中的數
output(N,arr); //輸出一個數組
return 0;
}
------------------------------------------------------------------------------------------------------------------------------15. 首先對 a 所指的 N 行 N 列的矩陣,找出各行中的最大的數,再求這 N 個最大值中的最小的那個數。
#include <stdio.h>
#define N 4 //行數
#define M 4 //列數
void twoutput(int n,int m,int (*ptr)[m]);//輸出一個二位陣列
void twoinput(int n,int m,int (*ptr)[m]);//輸入一個二位陣列
int find_max(int n,int m,int (*ptr)[m]); //查詢二位陣列中每行的最大值,@return:最大值下標
int fun_max(int n,int a[]);//查詢最大值,@return:最大值下標
int fun_min(int n,int a[]);//查詢最小值,@return:最小值下標
int main()
{
int arb[N]; //儲存每行最大的數
int arr[N][M]; //輸入的二位陣列
int sum;
twoinput(N,M,arr); //提示輸入一個二位陣列
twoutput(N,M,arr); //輸出這個二位陣列的數
for(sum=0;sum<N;sum++)
{
printf("第%d行最大的數是%d \n",sum+1,arr[sum][find_max(sum,M,arr)]);
// printf("s=%d\n",find_max(sum,M,arr));
// printf("第%d行最大的數是%d \n",sum+1,*(*(arr+sum)+find_max(sum,M,arr)));
arb[sum] = arr[sum][find_max(sum,M,arr)]; //
}
printf("\n");
printf("%d 行最大元素為 %d\n",N,*(arb+fun_max(N,arb)));
printf("%d 行最小元素為 %d\n",N,*(arb+fun_min(N,arb)));
return 0;
}
int find_max(int n,int m,int (*ptr)[m]){
int temp = *(*(ptr+n));
int count=0;
int i;
for(i=0;i<m-1;i++){
if(temp < *(*(ptr+n)+i+1)){
temp = *(*(ptr+n)+i+1);
count= i+1;
}
}
return count;
}
int fun_max(int n,int a[]){
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++){
if(temp < *(a+i+1)){
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
int fun_min(int n,int a[])
{
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++){
if(temp > *(a+i+1)){
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
void twoinput(int n,int m,int (*ptr)[m]){
printf("請輸入%d行%d列的陣列,共%d個元素\n",n,m,n*m);
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",(*(ptr+i)+j));
}
}
}
void twoutput(int n,int m,int (*ptr)[m]){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%-3d",*(*(ptr+i)+j));
}
printf("\n");
}
}
------------------------------------------------------------------------------------------------------------------------------16. 在陣列中查詢最大的數與陣列中最後一個數交換,並查詢陣列中最小的數與陣列第一個數交換。
#include <stdio.h>
#define N 6
void swap(int *x,int *y); //交換
void input(int n,int *ptr); //輸入
void output(int n,int *ptr);//輸出
int fun_max(int n,int a[]); //查詢最大值,@return:最大值下標
int fun_min(int n,int a[]); //查詢最小值,@return:最小值下標
int main(){
int arr[N];
input(N,arr); //輸入一個一維陣列
fun_max(N,arr); //查詢陣列中的最大值
swap(arr+fun_max(N,arr),arr+N-1); //與陣列中最後一個數交換
fun_min(N,arr); //查詢最小值
swap(arr+fun_min(N,arr),arr); //與陣列中的第一個數交換
output(N,arr); //輸出交換後的陣列
return 0;
}
int fun_max(int n,int a[]){
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++){
if(temp < *(a+i+1)){
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
int fun_min(int n,int a[]){
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++){
if(temp > *(a+i+1)){
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
void input(int n,int *ptr){
int i,j;
printf("Input %d Integer:\n",n);
for(i=0;i<n;i++){
scanf("%d",&j);
*(ptr+i) = j;
}
}
void output(int n,int *ptr){
int i;
for(i=0;i<n;i++){
printf("%4d",*(ptr+i));
}
printf("\n");
}
void swap(int *x,int *y){
int sw;
sw = *x;
*x = *y;
*y = sw;
}
------------------------------------------------------------------------------------------------------------------------------17. 將字元變數的值插入已經按 ASCII 碼值從小到大排好序的字串中
#include <stdio.h>
#include <string.h>
void order(int n,char a[]);//排序
void insert_char(char a[],char ch);//插入一個字元ch到陣列a[]中
int main()
{
char i;
char arra[128]={0};
printf("請輸入一字串: ");
scanf("%s",arra);
order(strlen(arra),arra); //排序,從小到大
printf("字串的排序為: %s\n",arra);
printf("請插入一個字元: ");
getchar();
scanf("%c",&i);
insert_char(arra,i); //插入一個字元
printf("字元插入結果為: %s\n",arra);
return 0;
}
void order(int n,char a[])
{
char swap;
int i,j;
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(*(a+j) > *(a+j+1)){
swap = *(a+1+j); *(a+1+j) = *(a+j); *(a+j) = swap;} } }}void insert_char(char a[],char ch){ int i = 0; for(i=0;i<=strlen(a);i++) { if(ch < a[strlen(a)-i]) //從後往前比 { *(a+strlen(a)+1-i) = *(a+strlen(a)-i); //將最大字元往後挪一位 *(a+strlen(a)-i)=ch; //將字元插入中間 } }} ------------------------------------------------------------------------------------------------------------------------------18. 下面程式的功能是從鍵盤上輸入兩個字串,對兩個字串分別排序;然後將它們合併,合併後的字串按 ASCII 碼值從小到大排序,並刪去相同的字元。
#include <stdio.h>
#include <string.h>
void order(int n,char a[]); //排序
void del_same(int n,char a[],char b[]);//消除相同字元
int main()
{
char a[256];
char b[64];
char res[256]={0};
printf("輸入第一個字串:");
scanf("%s",a);
order(strlen(a),a); //對輸入的第一個字串排序
printf("排列後 結果:%s\n",a);
printf("輸入第二個字串:");
scanf("%s",b);
order(strlen(b),b); //對輸入的第二個字串排序
printf("排列後 結果:%s\n",b);
strcat(a,b); //合併兩個字串
order(strlen(a),a); //合併後排序
printf("合併後 結果:%s\n",a);
del_same(strlen(a),a,res); //刪除相同的字元
printf("去掉相同字元結果:%s\n",res);
return 0;
}
void order(int n,char a[])
{
char swap;
int i,j;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(*(a+j) > *(a+j+1))
{
swap = *(a+1+j);
*(a+1+j) = *(a+j);
*(a+j) = swap;
}
}
}
}
void del_same(int n,char a[],char b[])
{
int i;
int j=0;
for(i=0;i<=strlen(a);i++)
{
if( *(a+i) != *(a+1+i))
{
*(b+j) = *(a+i);
j++;
}
}
}
------------------------------------------------------------------------------------------------------------------------------19. 一數列 包含 10 個數,已按升序排列,現要求,能夠從指定位置開始的 n 個數按逆序重新排列並輸出新的完整數列(例如:1 ,2,3,4,5,6,7,8,9,10。若要求把從第 4 個數開始的 5 個數逆序重新排列,新數列為 1,2,3,8,7,6,5,4,9,10)
#include <stdio.h>
#define N 10
void input(int n,int *ptr); //輸入陣列
void output(int n,int *ptr); //輸出陣列
void order(int n,int a[]); //對陣列排序
void swap(int *x,int *y); //交換
void new_alignment(int n,int m,int a[]);//新的排序區間n,m為區間的開始和末尾
int main()
{
int a,b;
int arr[N];
input(N,arr);
order(N,arr);
printf("升序排列後為:");
output(N,arr);
printf("區間[n,m]為調換區,請輸入n m\n");
scanf("%d %d",&a,&b);
new_alignment(a,b,arr);
printf("排序後的數列:");
output(N,arr);
return 0;
}
void new_alignment(int n,int m,int a[]){
int i;
int temp;
for(i=0;i<(m-n)/2;i++) //將要指定的區間內容進行調換
{
swap((a+i+n-1),(a+m-2-i));
}
}
void swap(int *x,int *y){
int sw;
sw = *x;
*x = *y;
*y = sw;
}
void input(int n,int *ptr){
int i,j;
printf("Input %d Integer:\n",n);
for(i=0;i<n;i++){
scanf("%d",&j);
*(ptr+i) = j;
}
}
void output(int n,int *ptr){
int i;
for(i=0;i<n;i++){
printf("%4d",*(ptr+i));
}
printf("\n");
}
void order(int n,int a[]){
int swap;
int i,j;
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(*(a+j) > *(a+j+1)){
swap = *(a+1+j);
*(a+1+j) = *(a+j);
*(a+j) = swap;
}
}
}
}
------------------------------------------------------------------------------------------------------------------------------
20. 10 個學生圍一圈,從第一個學生開始數數,數到 3 的學生退出,顯示最後剩餘的學生號碼。
#include <stdio.h>
int main()
{
int arr[128];
int x,a,i=0,j=0;
int count=0;
printf("輸入學生數量x = \n");
scanf("%d",&x);
for(a=1;a<=x;a++){
*(arr+a-1) = a; //將10個學生編號為1~10
}
/************************************************/
while(j < x-1) //10個學生,那麼迴圈數9次,就剩下最後一個
{
if(*(arr+i) != 0 )
{
count++; //如果不為0,開始數數
}
if(count == 3) //如果數到三
{
count = 0; //重新開始數
*(arr+i) = 0; //退出後將其位置填0
j++; //當前數的次數+1,
}
i++; //陣列中的數迴圈數數
if(i == x) //如果到10了,從第一個數接著數
{
i = 0;
}
}
/***************************************************/
for(i=0;i<10;i++)
{
printf("%-3d",*(arr+i));
}
printf("\n");
return 0;
}
------------------------------------------------------------------------------------------------------------------------------21. 程式的功能是輸入 10 個整數,將它們存入陣列a 中,再輸入一個數 x,然後在陣列中查詢 x,如果找到,輸出相應的下標(如有多個元素與 x 相等,只要輸出下標值最小的那個元素的下標),否則,輸出“Not Found”。
#include <stdio.h>
#define N 10
void input(int n,int *ptr); //輸入陣列
void output(int n,int *ptr); //輸出陣列
void find_num(int n,int a[],int *m,int b[]); //查詢陣列
int main()
{
int arr[N]; //輸入一個數組
int nu[N]; //儲存查詢後索引號的陣列
int s=0; //標記,有多少個相同元素
input(N,arr);
find_num(N,arr,&s,nu);
printf("x 的索引為:\n");
output(s,nu);//輸出結果
return 0;
}
void find_num(int n,int a[],int *m,int num[])
{
int x,i;
printf("input a num:\n");
scanf("%d",&x);
for(i=0;i<n;i++)
{
if(x == *(a+i)) //如果輸入的x與陣列中的元素相同
{
*(num+*m) = i; //將索引號存入陣列num中,
(*m)++; //有意個相等,那麼標記就+1。
}
}
if(*m == 0) //如果一次都不相等,那麼就是沒有找到
{
printf("Not Found!");
}
printf("\n");
}
void input(int n,int *ptr){
int i,j;
printf("Input %d Integer:\n",n);
for(i=0;i<n;i++){
scanf("%d",&j);
*(ptr+i) = j;
}
}
void output(int n,int *ptr){
int i;
for(i=0;i<n;i++){
printf("%4d",*(ptr+i));
}
printf("\n");
}
------------------------------------------------------------------------------------------------------------------------------22. 求數列中第二小的數
#include <stdio.h>
#define N 5
void input(int n,int *ptr);//輸入一個數組
void order(int n,int a[]); //排序
int main()
{
int arr[N];
input(N,arr); //輸入一個數組
order(N,arr); //對著個數組排序
printf("第二小的數 = %d\n",*(arr+1));
return 0;
}
void order(int n,int a[])
{
int swap;
int i,j;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(*(a+j) > *(a+j+1)){
swap = *(a+1+j);
*(a+1+j) = *(a+j);
*(a+j) = swap;
}
}
}
}
void input(int n,int *ptr)
{
int i,j;
printf("Input %d Integer:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&j);
*(ptr+i) = j;
}
}
------------------------------------------------------------------------------------------------------------------------------23. 統計兩個陣列中相應元素大於、等於或小於的次數,並由此決定那個陣列較大。
#include <stdio.h>
#include <string.h>
void compare();
int main()
{
compare(); //比較兩個陣列
return 0;
}
void compare()
{
char arra[128];
char arrb[128];
int i,s,a=0,b=0,c=0;
printf("輸入第一個字串:");
scanf("%s",arra);
printf("輸入第二個字串:");
scanf("%s",arrb);
if(strlen(arra) >= strlen(arrb))
{
s = strlen(arra); //s為比較次數,兩個陣列那個字串長度長取哪個
}else{
s = strlen(arrb);
}
for(i=0;i<s;i++)
{
if(*(arra+i) > *(arrb+i)){
a++; //大於的次數
}else if(*(arra+i) < *(arrb+i)){
b++; //小於的次數
}else if(*(arra+i) == *(arrb+i)){
c++; //等於的次數
}
}
printf("\n");
if( a > b ){
printf("第 一 個字串大\n");
}else if(a < b){
printf("第 二 個字串大\n");
}else{
printf(" 兩個字串相等\n");
}
printf("第1個字串相應元素 大於 第二個的次數為:%d次\n",a);
printf(" 小於 :%d次\n",b);
printf(" 等於 :%d次\n",c);
}
------------------------------------------------------------------------------------------------------------------------------24. 請編寫一個函式 fun,它的功能是:將一個字串轉換為一個整數
#include <stdio.h>
#include <string.h>
int main()
{
char arr[256]={0};
char brr[128]={0};
int i,j=0;
int sum = 0;
printf("輸入一個數字字串:");
scanf("%s",arr);
for(i=0;i<strlen(arr);i++) //輸入的字串,將數字取出來存入brr中
{
if(arr[i] >= '0' && arr[i] <= '9')
{
brr[j] = arr[i];
j++;
}
}
for(i=0;i<strlen(brr);i++) //對brr中的字元數子進行轉換,轉黃乘整數
{
sum = sum*10+(brr[i]-'0');
}
printf("sum = %d\n",sum);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------25. 編寫一個函式,該函式可以統計一個字串在另一個字串中出現的次數。
#include <stdio.h>
#include <string.h>
int statistic(char a[],char b[]); //統計b在a中出現的次數
int main()
{
char a[128];
char b[32];
printf("請輸入一個字串char_1:");
scanf("%s",a);
getchar();
printf("請輸入查詢字串char_2:");
scanf("%s",b);
statistic(a,b); //統計b在a中出現的次數,返回值:出現的次數
printf("字串char_2在char_1中出現 %d 次。\n",statistic(a,b));
return 0;
}
int statistic(char a[],char b[])
{
int i,j,s=0,k=0;
for(i=0;i<strlen(a);i++) //字串char1長度,將每個字元都跟char2的比較
{
if(*(a+i) == *b)
{
for(j=0;j<strlen(b);j++) //字串char2長度,判斷char1當前字串開頭的後的每位字元,是否都與char2的每位
字元相等
{
if(a[i+j] == b[j])
{
s++;//如果有一個相等,則s就+1,
}else{
s=0;
}
if(s == strlen(b))//如果s等於有strlen(b),則證明這每位的字元都相等
{
k++; //k+1,證明該char2在char1中出現了1次
s=0; //重新計數
}
}
}
}
return k;
}
------------------------------------------------------------------------------------------------------------------------------26. 該程式功能是執行時輸入 n,輸出 n 各位數字之和(如 n=1308,則輸出 12,n=-3204 則輸出 9)
#include <stdio.h>
#include <string.h>
int main()
{
char arr[128];
int i,sum = 0;
printf("請輸入n:");
scanf("%s",arr);
if(*arr == '-'){
for(i=1;i<strlen(arr);i++)
{
sum += (*(arr+i)-'0');
}
printf("sum = %d\n",sum);
}
else{
for(i=0;i<strlen(arr);i++)
{
sum += (*(arr+i)-'0');
}
printf("sum = %d\n",sum);
}
return 0;
}
------------------------------------------------------------------------------------------------------------------------------
27. 統計整數的各位數字中零的個數,並求各位數字中最大者的個數及最大數輸出。
#include <stdio.h>
#include <string.h>
int fun_max(int n,char a[]);//差炸最大值下標
int main()
{
char a[128],s;
int i;
int couna = 0;
int counb = 0;
printf("請輸入一個整數: \n");
scanf("%s",a);
s=*(a+fun_max(strlen(a),a)); //s為陣列中的最大數
for(i=0;i<strlen(a);i++)
{
if( *(a+i)>='0' && *(a+i)<='9' )
{
if(*(a+i)=='0') //統計0的個數
{
couna++;
}
else if(*(a+i) == s) //統計最大數的個數
{
counb++;
}
}
}
printf("該整數有 %d 個 0\n",couna);
printf("該整數最大數為%c\n",s);
printf("該整數有 %d 個 %c\n",counb,s);
return 0;
}
int fun_max(int n,char a[])
{
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++)
{
if(temp < *(a+i+1))
{
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
------------------------------------------------------------------------------------------------------------------------------
28. 計算一個英文句子中最長的單詞的長度。假設英文句子只有字母和空格,連續的字母為單詞,句子以‘.‘結束。(利用一級指標)
#include <stdio.h>
#include <string.h>
int fun_max(int n,int a[]);
int main()
{
char arr[128];
int sum[64];
int i, a = 0, b = 0;
printf("輸入一個英文句子,單詞以空格分離,結束用‘.’標註\n");
gets(arr);
for(i=0;i<=strlen(arr);i++)
{
if(*(arr+i) != ' ' && *(arr+i) != '.')
{
a++; //當前連續字母個數
}else{ //如果遇到空格或者'.'的時候,證明一個單詞結束,a代表單詞的個數
*(sum+b) = a; //將 a 的值存入陣列sum中,a的數值為空格前面單詞的字元數
a=0; //將 a 清零,重新記錄下一個
b++; //記錄有多少個單詞
}
}
printf("最長的單詞長度為 %d 個位元組\n",*(sum+fun_max(b,sum))); //fun_max(b,sum)為新陣列最大數的索引
return 0;
}
int fun_max(int n,int a[])
{
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++)
{
if(temp < *(a+i+1))
{
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
------------------------------------------------------------------------------------------------------------------------------
29. 輸入一個字串,然後按下面要求輸出一個新的字串。新串是在原串中的每兩個字元之間分別插入 1、3、5,......個字元'#'形成的。例如,原串為"abcd"、那麼新串為"a#b###c#####d"。如果原串中只有一個字元,則新串與原串相同。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int new_mamory_count(int count); //新開闢空間總個數,count:原記憶體字元個數
void insert(int count,char *ptr,char a[]);//將輸入的字元插入新開闢的空間中
int main()
{
char a[64],ch;
char *pstr=(char *)malloc(sizeof(char));
int i,len = 1,count=0;
int sum = 0;
memset(pstr,0,len);
while(1)
{
scanf("%c",&ch);
if(ch != '\n')
{
pstr=(char *)realloc(pstr,len);//將原pstr所指堆中的內容拷貝到新開闢的記憶體中,新地址重新賦給pstr,空間大小+1,
用於判斷下一個。
len ++; //空間+1,用於下一個
*(pstr+count) = ch; //將值賦給開闢的空間
*(a+count) = ch; //儲存輸入字元
count ++; //索引+1,存放資料,也是元素個數
}
else //如果遇到回車,退出
{
break;
}
}
sum = new_mamory_count(count);
pstr = realloc(pstr,sum+1); //sum+count+1開闢新空間大小,+1多開闢一個用於存'\0'
*(pstr+sum+1) = '\0'; //最後一個空間存'\0'
memset(pstr,'#',sum); //剩餘空間填 #
insert(count,pstr,a); //將輸入的字串插入
printf("%s\n",pstr);
free(pstr);
return 0;
}
int new_mamory_count(int count) //新開闢空間總個數,count:原記憶體字元個數
{
int sum;
int i;
for(i=0;i<count-1;i++) //count:輸入元素個數
{
sum = sum + 2*i +1; //統計字母中要插入 # 的個數
}
sum = sum + count;
return sum;
}
void insert(int count,char *ptr,char a[])
{
int sum;
int i;
for(i=0;i<count;i++) //在對應的位置插入字元陣列中a[]中的各元素。
{
sum = sum + 2*i + 1;
*(ptr+sum-i-1) = *(a+i);
}
}
------------------------------------------------------------------------------------------------------------------------------
30. 在執行檔名後輸入十個字串,通過函式找出最長的那個串
#include <stdio.h>
#include <string.h>
int fun_max(int n,int a[]); //查詢最大值下標
int main (int argc,char *argv[]) //argc:統計 ./ 後面輸入字串串的個數。*argc[]:陣列指標,儲存各個陣列的收地址
{
char temp;
int i,j;
int arr[32];
for(i=1;i<argc;i++)
{
arr[i-1] = strlen(*(argv+i)); //統計每個字串的長度,並一次存入陣列arr中
}
fun_max(argc-1,arr);
printf("%s\n",argv[fun_max(argc,arr)+1]);
return 0;
}
/*
*功能:查詢一個含有N個數組中最小元素的位置
* @retuan:count:索引
* */
int fun_max(int n,int a[])
{
int i;
int temp = *a;
int count = 0;
for(i=0;i<n-1;i++)
{
if(temp < *(a+i+1))
{
temp = *(a+i+1);
count = i+1;
}
}
return count;
}
------------------------------------------------------------------------------------------------------------------------------
31. 將字串中的數字串取出存入各個陣列中,例如:如 adfad1234adfj4561,則分別取出 1234、4561 放
到陣列中,並轉置,既放進去是 4321,1654;
/*功能:在字串str中查詢數字字串
引數:
str:查詢的字串
pNumStrLen:在查詢的字串中第一個數字字串的長度
返回值:查詢成功返回第一個數字串的首地址 查詢失敗返回null
*/
char *findNumStr(char *pstr, int *pNumStrLen);
設計思路:
1 計算源串有多少個數字串
2 char *findNumStr(char *pstr, int *pNumStrLen);
獲取每個數字串的長度並儲存
3 為每個數字串開闢足夠空間並將每個首地址儲存
4 將每個數字串的內容複製到每個新開闢的記憶體空間中
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *findNumStr(char *pstr,int *pNumStrlen){
int i;
int nu_ch = 0,count_nu = 0;
char *p = NULL;
for(i=0;i<strlen(pstr);i++){
if( pstr[i] >= '0' && pstr[i] <= '9'){
nu_ch++;
}
}
if(nu_ch != 0){
for(i=0;i<strlen(pstr);i++){
if( pstr[i] >= '0' && pstr[i] <= '9'){
p = pstr+i - count_nu;
count_nu++;
}else if(count_nu != 0){
*pNumStrlen = count_nu;
return p;
}
}
}
else
{
return NULL;
}
}
int main()
{
char pstr[64];
char *p=NULL;
int pNumStrlen = 0;
printf("輸入字串\n");
scanf("%s",pstr); //列印收地址
printf("字串首地址 = %p\n",pstr);
p = findNumStr(pstr,&pNumStrlen);
printf("第一個數字串首地址 = %p\n",p);
printf("第一個數字串的長度 = %d\n",pNumStrlen);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------32.搜尋競價排名系統,在大量的資訊尋找一個特定的資訊,排序是按照某個關鍵字的大小遞增或遞減。
#include <stdio.h>
#include <string.h>
#define ARRAY_NUM(a, len) (sizeof(a)/(len))
void keySort(char (*p)[21], int arrayNum);
int findKey(char *keyStr, char (*p)[21], int arrayNum);
int main()
{
char array[][21]={"牛仔裝","牛仔褲","牛仔服","耳環","帽廠","中國印染","電熨斗","旗袍","棉紡織品","毛皮","襯衣","男女皮鞋",
"鴨絨枕","被褥","芭蕾舞衣","長統襪","毛紡織業","真絲服裝","羅口手套","手套","褲襪","印染棉布","中國絲綢","胸罩","鞋城",
"褲子","羊絨紗","加密鎖","羊毛衫","針織產品","紡織印染","雨披","領結","毛皮服裝","潛水服","羊毛","混紡布","女式服裝",
"羊駝絨","棉毛衫褲","圍巾","西服","羊毛衫","拖鞋","襪業","運動服","制服","女士大衣","內衣","內褲","皮手套","襪子","鞋襪",
"帽子","尖頭鞋","飛行帽","鞋墊","挎包","童裝","羊毛","馬海毛","開司米","羊毛線","純羊毛","皮靴","胸針", "冰茶","清茶",
"冰糖","雪糕","茶葉","飯館","醬","香菇","猴頭","蘆筍","小麥","杏茶","河蟹","海藻","燕窩","麵包","燕麥片","海帶","米醋",
"扎啤","洋酒","話梅","粽子","柑橘","滷味","花粉","杏仁露","花生醬","香蘭素","海藻酸","酒具","乳製品","茉莉花茶","乾貝",
"醬菜","豆汁","脆棗","蝦皮","堅果仁","菠菜","矽藻","冰激淋","黃豆","木耳","小米","辣椒醬","檸檬酸","礦泉水","紅酒",
"米粉","牛肉乾","棗","小籠包","辣醬油","鮮奶油","海蟄","菜花","冬筍","棗脯","果膠糖","蝦米","棗泥","方糖","榴蓮","香椿",
"滷肉","桔子","壓縮餅乾","豆腐","墨魚","墨魚仔","烏魚蛋","炸醬麵","奶油蛋糕","黃油醬","豆餅","鮮荔枝","瓶裝啤酒",
"水煮魚","香辣蟹","福壽螺","巧克力","鮮奶","蘋果","果汁","冰紅茶"};
//根據字元的長度排序
int arrayNum=ARRAY_NUM(array, 21);
int i;
keySort(array, arrayNum);
for(i=0; i<arrayNum; i++)
{
printf("%s\n", array[i]);
}
char keyStr[1024];
int resultIndex=0;
memset(keyStr, 0, sizeof(keyStr));
printf("輸入關鍵字:");
scanf("%s", keyStr);
resultIndex=findKey(keyStr, array, arrayNum);
if(resultIndex != -1)
{
printf("%s is found!\n", array[resultIndex]);
}
else
{
printf("%s isnot found!\n", keyStr);
}
return 0;
}
int findKey(char *keyStr, char (*p)[21], int arrayNum)
{
int i;
for(i=0;i<arrayNum;i++)
{
if(strcmp(keyStr,*(p+i)) == 0)
{
return i;
}
}
return -1;
}
void keySort(char (*p)[21], int arrayNum)
{
int i, j;
int len1, len2;
char buf[50];
for(i=0;i<arrayNum-1;i++)
{
for(j=0;j<arrayNum-1-i;j++)
{
if(strlen( *(p+j) ) > strlen( *(p+j+1) ) )
{
strcpy( buf , (*(p+j)) );
strcpy( (*(p+j)) , (*(p+j+1)) );
strcpy( (*(p+j+1)) , buf ) ;
}
}
}
return;
}
------------------------------------------------------------------------------------------------------------------------------
33. 結構體中存n(從鍵盤接受)人的姓名和年齡,輸出年齡最大者的姓名和年齡。
Struc student{
char name[20];
int age;
}
//pub.h
#ifndef PUB_H
#define PUB_H
#include <iostream>
using namespace std;
#endif
#include "pub.h"
int fun_max(int n,struct student_t *p);//查詢陣列中的最大值,返回值為其索引
struct student_t{
char name[68];
int age;
};
int main()
{
int i,index;
int stuNum;
int arr[64];
struct student_t person[30];
cout<<"輸入學生人數"<<endl;
cin>>stuNum;
for(i=0;i<stuNum;i++)
{
cout<<"輸入姓名,年齡"<<endl;
cin>>(person+i)->name;
cin>>(person+i)->age;
// arr[i] = (person+i)->age; //將年齡存入陣列arr中
}
index = fun_max(stuNum,person); //s為最大值索引
// printf("name:%s age:%d\n",person[index].name,person[index].age);
cout<<"姓名:"<<person[index].name<<endl;
cout<<"年齡: "<<person[index].age<<endl;
return 0;
}
int fun_max(int n,struct student_t *p)
{
int i;
int temp = p[0].age;
int count = 0;
for(i=1;i<n;i++)
{
if(temp < p[i].age)
{
temp = p[i].age;
count = i;
}
}
return count;
}
------------------------------------------------------------------------------------------------------------------------------
34. 統計學生成績,功能包括輸入學生姓名和成績,按成績從高到低排序輸出,對前 70%的學生為合格,而後 30%的學生不合格。
Strucr Student{
char *name;
int scoer;
}
//lib.h
#ifndef _WORK34_H
#define _WORK34_H
typedef struct student_t{
int score;
char name[32];
}STU;
void input_student(int *p,STU *ptr);
void order(int *p,STU *ptr,STU *ppr);
void output_student(int *p,STU *ptr);
#endif
//lib.c
#include <stdio.h>
#include "lib.h"
void input_student(int *p,STU *ptr)
{
int i;
for(i=0;i<*p;i++)
{
printf("請輸入第%d個學生姓名\n",i+1);
scanf("%s",(ptr+i)->name);
printf("請輸入第%d個學生成績\n",i+1);
scanf("%d",&(ptr+i)->score);
}
}
void order(int *p,STU *ptr,STU *ppr)
{
int i,j;
for(i=0;i<*p-1;i++)
{
for(j=0;j<*p-1-i;j++)
{
if((ptr+j)->score < (ptr+j+1)->score ) //如果第一個結構體中學生成績小於第二個
{
*ppr = *(ptr+j); //直接交換兩個結構體
*(ptr+j) = *(ptr+j+1);
*(ptr+j+1) = *ppr;
}
}
}
}
void output_student(int *p,STU *ptr)
{
int i;
for(i=0;i<*p;i++)
{
if(i == 0){
printf("合格學生為\n");
}
printf("姓名:%-15s成績:%d\n",(ptr+i)->name,(ptr+i)->score);
if(i == (int)((*p)*0.7)){ //前70%為合格,後%30為不合格
printf("不合格學生為\n");
}
}
}
//main.c
#include <stdio.h>
#include "lib.h"
int main()
{
STU ptr[128]; //存放學生姓名和成績
STU ppr[128]; //結構體型別陣列,用來儲存臨時交換的值
int sum;
printf("請輸入學生總數:");
scanf("%d",&sum); //輸入學生人數
input_student(&sum,ptr); //輸入每個學生的姓名和成績
order(&sum,ptr,ppr); //對ptr陣列中的學生排序
output_student(&sum,ptr); //輸入成績
return 0;
}
------------------------------------------------------------------------------------------------------------------------------
35. 輸入 x 個學校,每個學校 y 個班級,每個班級 z個學生,列印每個學校所有成績的和。
Struct School{
struct class *sch_class;
}
struct class{
struct Student *class_student;
}
struct Student{
int stu_id;
int stu_score;
}
#include <stdio.h>
#include <stdlib.h>
#define X 2
#define Y 3
#define Z 2
typedef struct Student_t{
int stu_id;
int stu_score;
}STU;
typedef struct Class_t{
struct Student_t *stu_ptr;
}CLA;
typedef struct School_t{
struct Class_t *cla_ptr;
}SCH;
int main()
{
int i,j,k;
int sum = 0,su = 0,s = 0;
SCH *sch_ptr = (SCH *)malloc( X *sizeof(SCH));
for(i=0;i<X;i++)
{
(sch_ptr+i)->cla_ptr = (CLA *)malloc( Y * sizeof(CLA));
for(j=0;j<Y;j++)
{
((sch_ptr+i)->cla_ptr+j)->stu_ptr = (STU *)malloc( Z * sizeof(STU));
for(k=0;k<Z;k++)
{
printf("輸入第%d個學校,第%d個班級,第%d個學生的 ID 和 成績:\n",i+1,j+1,k+1);
scanf("%d %d",&(((sch_ptr+i)->cla_ptr+j)->stu_ptr+k)->stu_id,&(((sch_ptr+i)->cla_ptr+j)->stu_ptr+k)->stu_score);
sum = sum + (((sch_ptr+i)->cla_ptr+j)->stu_ptr+k)->stu_score;
}
su = su + sum ;
sum = 0;
}
s = s + su;
printf("第%d個學校學生的總成績為:%d\n",i+1,su);
s = 0;
}
printf("\n");
return 0;
}
------------------------------------------------------------------------------------------------------------------------------
36. 定義結構體包括資料域和指向本身結構體的指標,並定義三個這樣結構體變數,
(1)將三個變數連線 x 的指標域指向 y,y 的指標域指向 z,z 的指標域指向 NULL,並在主函式中列印其資料域的值。
p=link(x, y, z);
根據p列印x、y、z的資料
(2)將 y 刪除,遍歷列印鏈的值
void delete(y.data, p);
根據p列印資料域內容
(3)將 y 新增到鏈上,遍歷列印鏈的值。
insertHead(p, y);
根據p列印資料域->y.data x.data z.data
#include <stdio.h>
typedef struct Pointer_t{
int data;
struct Pointer_t *ptr;
}POT;
POT *link(POT *x,POT *y,POT *z)
{
POT *p = x;
x->ptr = y;
y->ptr = z;
z->ptr = NULL;
return p;
}
void delete(POT *p,POT *y)
{
p->ptr = y->ptr;
}
POT *insertHead(POT *p,POT *y)
{
POT *pnew = y;
y->ptr = p;
return pnew;
}
int main()
{
POT *p = NULL;
POT x;
POT y;
POT z;
printf("輸入 X Y Z :\n");
scanf("%d %d %d",&x.data,&y.data,&z.data);
p = link(&x,&y,&z); //根據p列印x,y,z的數值
printf("P=%d P1=%d P2=%d\n",p->data,p->ptr->data,p->ptr->ptr->data);
delete(p,&y); //將y鏈刪除
printf("P=%d P1=%d\n",p->data,p->ptr->data);
p = insertHead(p,&y); //將y新增到鏈上
printf("P=%dX P1=%d P2=%d\n",p->data,p->ptr->data,p->ptr->ptr->data);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------37. 實現計算器功能輸入+、-、*、/輸出計算的結果
struct opt{
int (*p_add)(int, int);
int (*p_sub)(int, int);
int (*p_div)(int, int);
int (*p_mul)(int, int);
}
//lib.h
#ifndef _WORK37_H
#define _WORK37_H
struct arithmetic_t{
int (*p_add)(int,int);
int (*p_sub)(int,int);
int (*p_div)(int,int);
int (*p_mul)(int,int);
};
int add(int x,int y);
int sub(int x,int y);
int div(int x,int y);
int mul(int x,int y);
#endif
//lib.c
#include <stdio.h>
#include "lib.h"
int add(int x,int y) //加
{
int sum;
sum = x + y;
return sum;
}
int sub(int x,int y) //減
{
int sum;
sum = x - y;
}
int div(int x,int y) //乘
{
int sum;
if(y == 0)
{
printf("data2 不能為 0\n");
}else{
sum = x / y;
}
return sum;
}
int mul(int x,int y) //除
{
int sum;
sum = x * y;
return sum;
}
//main.c
#include <stdio.h>
#include "lib.h"
int main()
{
struct arithmetic_t op;
int data1,data2,ret;
char ch;
printf("輸入 運算子 data1 data2\n");
scanf("%c %d %d",&ch,&data1,&data2);
switch(ch)
{
case '+':op.p_add = add;ret = op.p_add(data1,data2);break;
case '-':op.p_sub = sub;ret = op.p_sub(data1,data2);break;
case '/':op.p_div = div;ret = op.p_div(data1,data2);break;
case '*':op.p_mul = mul;ret = op.p_mul(data1,data2);break;
}
printf("sum = %d\n",ret);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------38. 根據以下要求編寫函式。
1)、輸入引數是 unsigned char 型別
2)、引數的格式是:
bit 數值 含義
0~1 2 輸出字串“你是”
其他 輸出字串“我是”
2~4 5 輸出字串“集團”
其他 輸出字串“股份”
5~7 4 輸出字串“員工”
其他 輸出字串“職員”
#include <stdio.h>
struct pack_t{
unsigned a:2;
unsigned b:3;
unsigned c:3;
};
union pack_k{
char ch;
struct pack_t byte;
};
int main()
{
union pack_k ch;
printf("輸入一個字元:\n");
scanf("%c",&ch.ch);
if(ch.byte.a == 2){
printf("你是");
}else{
printf("我是");
}
if(ch.byte.b == 3){
printf("集團");
}else{
printf("股份");
}
if(ch.byte.c == 3){
printf("員工!\n");
}else{
printf("職員!\n");
}
return 0;
}
------------------------------------------------------------------------------------------------------------------------------39. 編寫程式,從鍵盤輸入 3 個學生的資料,將它們存入檔案 student;然後再從檔案中讀出資料,顯示在螢幕上。
Struct Student{
int stu_id;
char *stu_name;
int stu_age;
char addr[200];
}
#include <stdio.h>
#define N 3
struct Student_t{
int stu_id;
char stu_name[200];
int stu_age;
char addr[200];
};
void write(struct Student_t *data,int n);
void read(struct Student_t *date,int n);
int main()
{
FILE *fp=NULL,*fpr=NULL; //定義兩個檔案流
// size_t num;
struct Student_t data[3]={0}; //fwrite寫檔案的緩衝區
struct Student_t date[3]={0}; //fread 讀檔案的緩衝區
/***************************寫入***********************************/
fp = fopen("student","w");
if(fp == NULL){
printf("file open failt!\n");
return 1;
}
write(data,3);
fwrite(data,sizeof(struct Student_t),3,fp); //緩衝區、結構體長度
fclose(fp); //每次讀入位元組數
printf("file write success!\n"); //檔案流入口
/***************************讀出***********************************/
fpr = fopen("student","r");
if(fpr == NULL){
printf("file open failt!\n");
return 1;
}
fread(date+1,sizeof(struct Student_t),1,fpr);
read(date,3);
fclose(fpr);
printf("file read success!\n");
/******************************************************************/
return 0;
}
void write(struct Student_t *data,int n) //輸入學生資訊
{
int i;
for(i=0;i<3;i++){
printf(