| 這個作業屬於哪個課程 | 數據結構 |
|---|---|
| 這個作業要求在哪里 | https://edu.cnblogs.com/campus/qdu/DS2020/homework/11213 |
| 這個作業的目標 | 復習C語言中函數、數組、指針、結構體與共用體等的概念,熟悉利用C語言進行程序設計的一般方法 |
| 學號 | 2018204150 |
預備實驗---- C語言的函數數組指針結構體知識
一、實驗目的
1、復習C語言中函數、數組、指針、結構體與共用體等的概念。
2、熟悉利用C語言進行程序設計的一般方法。
二、實驗預習
說明以下C語言中的概念
1、函數:函數是一個自我包含的完成一定相關功能的執行代碼段。我們可以把函數看成一個“黑盒子”,你只要將數據送進去就能得到結果,而函數內部究竟是如何工作的,外部程序是不知道的。外部程序所知道的僅限於輸入給函數什么以及函數輸出什么。函數提供了編制程序的手段,使之容易讀、寫、理解、排除錯誤、修改和維護。
2、數組:數組是一組數據的集合,它所包含的每一個數據叫做數組元素,所包含的數據的個數稱為數組長度,數組中的每個元素都有一個序號,這個序號從0開始,而不是從我們熟悉的1開始,稱為下標。使用數組元素時,指明下標即可,字符串也是一種數組。它們以ASCII的NULL作為數組的結束。
3、指針:不同數據類型所占用的內存單元數不等,如整型量占2個單元,字符量占1個單元,每個內存單元都有編號.這個編號也叫地址.就是我們所說的指針.內存單元的指針和內存單元的內容是兩個不同的概念.對於一個內存單元來說,單元的地址即為指針,其中存放的數據才是該單元的內容.在C語言中,允許用一個變量來存放指針,這種變量稱為指針變量
4、結構體:結構體從本質上講是一種自定義的數據類型,只不過這種數據類型比較復雜,是由 int、char、float 等基本類型組成的。你可以認為結構體是一種聚合類型。在實際開發中,我們可以將一組類型不同的、但是用來描述同一件事物的變量放到結構體中。例如,在校學生有姓名、年齡、身高、成績等屬性,學了結構體后,我們就不需要再定義多個變量了,將它們都放到結構體中即可。
5、共用體:在進行某些算法的C語言編程的時候,需要使幾種不同類型的變量放到同一段內存單元中。也就是使用覆蓋技術,幾個變量互相覆蓋。這種幾個不同的變量共同占用一段內存的結構,在C語言中,被稱作“共用體”類型結構,簡稱共用體。
三、實驗內容和要求
1、調試程序:輸出100以內所有的素數(用函數實現)
代碼:
#include<stdio.h>
int isprime(int n){ /*判斷一個數是否為素數*/
int m;
for(m=2;m*m<=n;m++)
if(n%m==0) return 0;
return 1;
}
int main(){ /*輸出100以內所有素數*/
int i; printf("\n");
for(i=2;i<100;i++)
if(isprime(i)==1) printf("%4d",i);
return 0;
}
運行結果:

2、 調試程序:對一維數組中的元素進行逆序排列
代碼:
#include<stdio.h>
#define N 10
int main(){
int a[N]={0,1,2,3,4,5,6,7,8,9},i,temp;
printf("\nthe original Array is:\n ");
for(i=0;i<N;i++)
printf("%4d",a[i]);
for(i=0;i<N/2;i++){ /*交換數組元素使之逆序*/
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("\nthe changed Array is:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
return 0;
}
運行結果:

3、調試程序:在二維數組中,若某一位置上的元素在該行中最大,而在該列中最小,則該元素即為該二維數組的一個鞍點。要求從鍵盤上輸入一個二維數組,當鞍點存在時,把鞍點找出來。
代碼:
#include<stdio.h>
#define M 3
#define N 4
int main(){
int a[M][N],i,j,k;
printf("\n請輸入二維數組的數據:\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++){ /*輸出矩陣*/
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
for(i=0;i<M;i++){
k=0;
for(j=1;j<N;j++) /*找出第i行的最大值*/
if(a[i][j]>a[i][k])
k=j;
for(j=0;j<M;j++) /*判斷第i行的最大值是否為該列的最小值*/
if(a[j][k]<a[i][k])
break;
if(j==M) /*在第i行找到鞍點*/
printf("%d,%d,%d\n",a[i][k],i,k);
}
return 0;
}
運行結果:

4、 調試程序:利用指針輸出二維數組的元素
代碼:
#include<stdio.h>
int main(){
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++){
if((p-a[0])%4==0) printf("\n");
printf("%4d",*p);
}
return 0;
}
運行結果:

5、調試程序:設有一個教師與學生通用的表格,教師的數據有姓名、年齡、職業、教研室四項,學生有姓名、年齡、專業、班級四項,編程輸入人員的數據,再以表格輸出
代碼:
#include <stdio.h>
#define N 10
struct student{
char name[8]; /*姓名*/
int age; /*年齡*/
char job; /*職業或專業,用s或t表示學生或教師*/
union {
int class1; /*班級*/
char office[10]; /*教研室*/
}depa;
}stu[N];
int main(){
int i; int n;
printf("\n請輸入人員數(<10):\n");
scanf("%d",&n);
for(i=0;i<n;i++){ /*輸入n個人員的信息*/
printf("\n請輸入第%d人員的信息:(name age job class1/office)\n",i+1);
scanf("%s,%d,%c",stu[i].name, &stu[i].age, &stu[i].job);
if(stu[i].job='s')
scanf("%d",&stu[i].depa.class1);
else
scanf("%s",stu[i].depa.office);
}
printf("name age job class1/office");
for(i=0;i<n;i++){ /*輸出*/
if(stu[i].job=='s')
printf("%s %3d %3c %d\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.class1);
else
printf("%s %3d %3c %s\n",stu[i].name, stu[i].age, stu[i].job, stu[i].depa.office);
}
}
輸入的數據:2
Wang 19 s 99061
Li 36 t computer
運行結果:

四、實驗小結
通過本次實驗,對c語言數組、指針方面進行了一次較為全面的復習,自己動手去寫程序,調試程序,比對運算結果,不但加強了對c語言的理解程度,而且加深了對它的印象,當然在進行實驗的過程中也發現了一些小問題,但也及時糾正,認識到了自己的不足。總而言之,這次實驗是一次很不錯的經歷,希望自己以后能繼續參加實驗,提高自我能力,豐富自我認知。
