分類は 誰かに 任せた
目次
Q.曲線(リサージュ)を描く
#include <stdio.h>
void lisajous(int a,int b){
char str[1024];
sprintf(str,
"echo \"set parametric;"
"set samples 400;"
"plot cos(2*pi*%d*t),sin(2*pi*%d*t)\""
"| gnuplot -persist",a,b);
system(str);
}
#include <stdio.h>
#include <math.h>
#define PI 3 // およそ3
main()
{
/* a,bの値 */
int a = 10, b = 20, i;
double x, y, t = 0.0;
char c;
/* x,yのどちらを表示するか */
printf("x or y ? -> ");
scanf("%c", &c);
/* 計算して表示 */
printf("\n -1 0 1\n");
printf("t |----------|---------|\n");
while (t < 10.0) {
x = cos(2 * PI * a * t);
y = sin(2 * PI * b * t);
printf("%2.1lf ", t);
if (c == 'x')
for (i = 0; i < (int)(10.0 * x + 10); i++)
putc(' ', stdout);
else if (c == 'y')
for (i = 0; i < (int)(10.0 * y + 10); i++)
putc(' ', stdout);
printf("*\n");
t += 0.1;
}
return 0;
}
Q.入力した文章の単語数と各単語の文字数を表示
Please enter a statemant: This is a programming class
Total 5 words. Each word contains;
This: 4 letters.
is: 2 letters.
a: 1 letters.
programming: 11 letters.
class: 5 letters.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define TANGOSU 30
#define MOJISU 20
int main(void)
{
int i;
int tango_index;
int count;
char buffer[TANGOSU * MOJISU+1];
char *splitted[TANGOSU];
char* p;
printf("Please enter a statement: ");
gets(buffer);
for(tango_index = 0, p=buffer, count=0; *p != 0; p++)
{
if(!isspace(*p) && '\0' != *p)
{
if(count == 0)
{
splitted[tango_index] =p;
tango_index ++;
}
count ++;
} else
count = 0;
if(isspace(*p))
{
*p = 0;
continue;
}
}
printf("Total %d words. Each words contains;\n", tango_index);
for (i = 0; i < tango_index; ++i)
{
printf("%s: %d letters.\n", splitted[i], strlen(splitted[i]));
}
return 0;
}
Q.配列を使ってリングバッファを実装
1 を追加
2 を追加
3 を追加
4 を追加 (*)
取り出し
取り出し
5 を追加
6 を追加 (*)
7 を追加
取り出し
8 を追加
取り出し (*)
9 を追加
10 を追加
取り出し
取り出し (*)
取り出し
取り出し
取り出し
取り出し (*)
(終了)
#include<stdio.h>
#define QMAX 32
#define QO() printf("%d\n",qo())
int WP = 0;
int RP = 0;
int QUEUE[QMAX];
void qi(int a){
QUEUE[WP]=a;
WP=(WP+1)%QMAX;
}
int qo(){
int ret=QUEUE[RP];
RP=(RP+1)%QMAX;
return ret;
}
int main(void){
qi(1);qi(2);qi(3);qi(4);
QO();QO();
qi(5);qi(6);qi(7);
QO();
qi(8);
QO();
qi(9);qi(10);
QO();QO();QO();QO();QO();QO();
return 0;
}
Q.平均値と標準偏差を求めよ
#include <stdio.h>
#include <math.h>
#define VAL_MAX (12)
int main( void ) {
double a[VAL_MAX], ave = 0.0, ss = 0.0, var, std;
int i;
for( i = 0; i < VAL_MAX; i++ ) {
printf( "a[%d]:", i + 1 ); scanf( "%lf", a + i );
}
for( i = 0; i < VAL_MAX; i++ )
ave += a[i];
ave /= (double)VAL_MAX;
for( i = 0; i < VAL_MAX; i++ )
ss += ( a[i] - ave ) * ( a[i] - ave );
var = ss / (double)VAL_MAX;
std = sqrt( var );
printf( "Ave = %lf, Var = %lf, Std = %lf\n", ave, var, std );
return 0;
}
Q.四則演算機の作成
calc 4 + 2 <enter>
6.00
上記の例に示すようなコマンドライン版の超簡単な加減乗除演算機を作成してください.
加減乗除ですから,+ - * / の4つのオペレータ(加減乗除演算子)を考えるだけで十分です.
括弧の処理はなくて構いません.
括弧による優先順位や四則演算の優先順位を考慮すると格段に難しい問題になります.
したがって本課題では考慮の必要はありません.
コマンドラインから与える「数値1」と「数値2」は実際には文字列として main 関数に渡されます.
ご注意ください.
例にあるように,コマンド名calcと数値1の間には半角スペースを入れます.
同様に数値1とオペレータの間にも半角スペースを入れます.
もちろんオペレータと数値2の間にもスペースが必要です.
例では小数点以下2桁で結果を表示しています.表示方法は各自で工夫してください.
http://pc8.2ch.net/test/read.cgi/tech/1165190320/96
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
double num1, num2, result;
char op;
if (argc == 4) {
num1 = atof(argv[1]);
num2 = atof(argv[3]);
op = *argv[2];
switch (op) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
default:
printf("Unknown operator.\n");
break;
}
printf("%.2f\n", result);
} else {
printf("Usage:\n");
printf("\tcalc num1 [+|-|*|/] num2\n");
}
return 0;
}
Q.マスターマインド(ヒット・アンド・ブロー 数当てゲーム)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4
int main(){
int Number[N],In[N];
int i,j,hit,blow;
srand(time(NULL));
for(i=0;i<N;i++){Number[i]=rand()%10;In[i]=0;}
do{
printf("%d桁の数を入力!:",N);
for(i=0;i<N;i++){if((In[i]=getchar()) ==EOF) break;
In[i]-='0';}
fflush(stdin);hit=0,blow=0;
for(i=0;i<N;i++){if(Number[i]==In[i]) hit++;}
for(i=0;i<N;i++){for(j=0;j<N;j++){if(Number[i]==In[j]) {
blow++;
break;
}}}
for(i=0;i<N;i++) printf("%d-",In[i]);
printf("%dHit,%dBlow\n",hit,blow-hit);
}while(hit!=N);
for(i=0;i<N;i++) printf("%d",Number[i]);
puts("\nComplete!!");
}
Q.商品ごとの売り上げ個数と月ごとの売り上げ個数を集計する
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int month = 12;
const char *item[] = {"1","2","3"};
int main()
{
int i,j,item_count,hyo[12][3],sum_item[3]={0},sum_month[12]={0};
char temp[16];
item_count = sizeof(item)/sizeof(*item);
/* データの入力 */
for(i = 0;i < month;i++){
for(j = 0;j < item_count;j++){
printf("%d月の%sの売り上げ > ",i+1,item[j]);
fgets(temp,sizeof(temp),stdin);
hyo[i][j] = atoi(temp);
}
}
/* 商品ごとの合計売り上げ計算 */
for(i = 0;i < month;i++){
for(j = 0;j < item_count;j++){
sum_item[j] += hyo[i][j];
}
}
/* 月ごとの合計売り上げ計算 */
for(i = 0;i < month;i++){
for(j = 0;j < item_count;j++){
sum_month[i] += hyo[i][j];
}
}
/* 表示 */
printf("\n\n");
for(i = 0;i < item_count;i++){
printf("%sの合計売り上げ:%d\n",item[i],sum_item[i]);
}
printf("\n");
for(i = 0;i < month;i++){
printf("%d月の合計売り上げ:%d\n",i+1,sum_month[i]);
}
return 0;
}
Q.学生番号と氏名をメンバとする構造体を定義し、読み込む
学生番号(3桁の整数)> 444
氏名(アルファベットで姓のみ)> Takeda
…………
学生番号(3桁の整数)
学生番号(3桁の整数) > 99
学生番号(3桁の整数)> 631
氏名(アルファベットで姓のみ)> Sato
学生番号(3桁の整数)> 107
氏名(アルファベットで姓のみ)> Furukawa
〔5名分のデータ表示例〕
学生番号: 444 氏名: Takeda
学生番号: 221 氏名: Kato
学生番号: 859 氏名: Azuma
学生番号: 631 氏名: Sato
学生番号: 107 氏名: Furukawa
#include <stdio.h>
struct gakusei {
int number;
char name[1000];
};
main()
{
int i = 0;
struct gakusei g[5];
while (i < 5) {
printf("学生番号(3桁の整数)> ");
scanf("%d", &g[i].number);
if (100 <= g[i].number && g[i].number < 1000) {
printf("氏名(アルファベットで姓のみ)> ");
scanf("%s", g[i].name);
i++;
}
}
printf("\n");
while (i-- > 0)
printf("学生番号: %d 氏名: %s\n", g[4-i].number, g[4-i].name);
return 0;
}
Q.身長、体重、肥満度のメンバを加えた構造体を新たに定義し、肥満度を計算する
#include <stdio.h>
struct gakusei {
int n;
char a[1000];
double s, t;
};
main()
{
void print(struct gakusei);
int i = 0;
struct gakusei g[5] = { {444, "A", 0, 0},
{445, "B", 0, 0},
{446, "C", 0, 0},
{447, "D", 0, 0},
{448, "E", 0, 0} };
while(i<5) {
printf("学生番号 %d: 身長[m]> ", g[i].n);
scanf("%lf", &g[i].s);
printf("学生番号 %d: 体重[kg]> ", g[i].n);
scanf("%lf", &g[i].t);
i++;
}
printf("\n");
while(i-->0)
print(g[4-i]);
return 0;
}
double bmi(struct gakusei *g)
{
return g->t/(g->s * g->s * 22)*100-100;
}
void print(struct gakusei g)
{
int i;
double bmi(struct gakusei *);
char *chr(char *, char *);
char s[1000], a[50], *b;
printf("学生番号: %d 氏名: %s BMI: %lf", g.n, g.a, bmi(&g));
if(bmi(&g)>30){
switch (i = abs(((int)g.a[0]+g.n)%9*(g.n%13+(int)(bmi(&g)*10))%3)) {
case 0 :
strcpy(s, " (^ω^ ) ピザキメェおwww ");
b = chr(s, a);
memcpy(b, "vip? no vip?", 12);
puts(s);
break;
case 1 :
strcpy(s, " (^ω^ )⊃ アウアウ!! ");
b = chr(s, a);
memcpy(b, "vip? no vip?", 12);
puts("");
puts(s);
puts(" ⊂ミ⊃ ) ");
puts(" / ヽ ");
break;
case 2 :
strcpy(s, " (^ω^ *) おっおっおwwwww ");
b = chr(s, a);
memcpy(b, "vip? no vip?", 12);
puts(s);
break;
default :
break;
}
}
else
puts("");
}
char *chr(char *s, char *a)
{
struct gakusei g;
strcpy(g.a, s);
if(strncmp(g.a, " gakusei", 2)==0){
if(g.a[strlen(g.a)-1]==0x20)
return a;
else
return NULL;
}
else
return NULL;
}
カレンダー
#include<stdio.h>
int main(){
int days[] = {31,28,31,30,31,30,31,30,31,31,30,31,30,31};
int y, m, d, i, k;
printf("y=");
scanf("%d", &y);
printf("m=");
scanf("%d", &m);
if(1583>y || y>4000 || 1>m || m>12) return 1;
printf("\n%d/%d\n\n", y, m);
d = days[m-1];
if(m==2 && (y%4==0&&y%100!=0||y%400==0)) d++;
if(m==1 || m==2){
y--;
m += 12;
}
k = (y+(int)(y/4)-(int)(y/100)+(int)(y/400)+(int)((13*m+8)/5)+1) % 7;
printf("日 月 火 水 木 金 土\n");
for(i=0; i<k; i++) printf(" ");
for(i=1; i<=d; i++){
printf("%2d ", i);
if(++k%7==0) printf("\n");
}
printf("\n");
return 0;
}
ハッシュ
#include<stdio.h>
#define HASH_SIZE 7
int hash(char* s){
int h = 0;
while(*s != '\0') h += *s++;
return h % HASH_SIZE;
}
int main(){
printf("Matsuzaka %d\n",hash("Matsuzaka"));
printf("Igawa %d\n",hash("Igawa"));
printf("Kuwata %d\n",hash("Kuwata"));
printf("Okajima %d\n",hash("Okajima"));
return 0;
}
スタック
#include<stdio.h>
#define N 5
int push(int data, int *sp, int *STK){
if(*sp <= 0) return 0;
STK[--(*sp)] = data;
return 1;
}
int pop(int *dataP, int *sp, int *STK){
if(*sp >= N) return 0;
*dataP = STK[(*sp)++];
return 1;
}
void dsp_stack(int top, int *a){
while(top++ < N)
printf("%d: %d\n",top-1, a[top-1]);
}
int main(){
int data,stk[N],top=N;
char cmd;
while(scanf("%c",&cmd) != EOF){
if (cmd=='i'){
scanf("%d", &data);
if(push(data,&top,stk)==1)
dsp_stack(top,stk);
}else if(cmd=='o'){
if(pop(&data,&top,stk)==1){
printf("popped data= %d\n",data);
dsp_stack(top,stk);
}
}
}
return 0;
}
最小公倍数
#include<stdio.h>
int main(){
int a, b, i = 0;
scanf("%d %d", &a, &b);
while(b&&(i+=a))
if(i%b == 0) break;
printf("lcm(%d,%d) = %d\n", a, b, i);
return 0;
}
二進数で出力
#include<stdio.h>
void BinDisp(int n){
if(n > 1) BinDisp(n / 2);
printf("%d", n % 2);
}
int main(){
BinDisp(10);
printf("\n");
}
ASCII文字表
#include<stdio.h>
int main(){
int i, j, k;
for(i=0; i<=0xF; i++){
for(j=0; j<=7; j++){
k = i*8 + j;
if(0x20<=k && k<=0x7e)
printf(" %c ", k);
else
printf("** ");
}
printf("\n");
}
return 0;
}
Simpson法を使った積分
シンプソンの公式を用いて定積分を求めるプログラムを作成し、
以下2つの定積分を計算せよ。ただし刻み幅 h=0.1 とする。
#include<stdio.h>
#include<math.h>
typedef double (*SingleVFunc)(double);
double quadInterpol( SingleVFunc fun, double begin, double h )
{
return (fun( begin ) + 4.0*fun( begin + h ) + fun( begin + 2.0*h )) * h/3.0;
}
double integral( SingleVFunc fun, double begin, double end, double h )
{
double result = 0.0;
double pos = begin;
do
{
result += quadInterpol( fun, pos, h );
pos += 2.0*h;
} while( pos < end );
return result;
}
double f(double x) { return exp(-x*x); }
double g(double x) { return 1.0/sqrt(1 + x*x*x*x); }
int main(void)
{
const double diff = 0.1;
printf("result=%f\n",integral(f,0.0,1.0,diff));
printf("result=%f\n",integral(g,0.0,1.0,diff));
return 0;
}
指数関数exp(x)
#include <stdio.h>
double myexp(double x)
{
double coefficient = 1.0;
double value = 0.0;
int k = 1;
while( coefficient >= 1.0e-6 )
{
value += coefficient;
coefficient *= x / (double)k;
++k;
}
return value;
}
int main(void)
{
double x;
printf("\t x\t myexp(x)\n");
for( x=1.0; x<=10.0; ++x )
printf("\t%.1f\t%13.5f\n",x,myexp(x));
return 0;
}
最終更新:2007年11月02日 22:32