12万作品が月額500円(税別)で見放題なのはdTVだけ!! >>dTV(外部リンク)

 私は、ある大学に通う二年生です。実は、授業でC言語のプログラミングの授業があるのですが、includeとか、for文とか、とにかくそこに出てくる用語も全然と言っても良いぐらい分からないし、それにその科目を教えている先生から課題が出されました。
 その課題というのは、以下の問題です。誰か僕に力をください。
 お願いします。 
 問
   正の整数1から10までの範囲でパスカルの三角形を画面上に出力するプログラムを作り、さらにその三角形をもう一つ組み合わせてひし形を作り、ひし形が出力できるように補修せよ。
 (注)「使用できる配列は、1次元に限る」という条件を守って作ること。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> includeとか、for文とか、とにかくそこに出てくる用語も全然と言っても良いぐらい


> 分からない

というところへ、ソースを提示して理解が深まるのかどうか、あやしいですが、
ちょっと書いてみましたので、読んでみます?

#include <iostream.h>
#include <iomanip.h>

#define KETA  3

void get_pascal_triangle_line(int n, int x[])
{
  int i;
  if (n == 1) {
    x[0] = 1;
    return;
  }
  int* xx;
  xx = new int [n - 1];
  get_pascal_triangle_line(n - 1, xx);
  x[0] = xx[0];
  for (i = 1 ; i < n - 1 ; ++i)
  {
    x[i] = xx[i - 1] + xx[i];
  }
  x[n-1] = xx[n-2];
  delete [] xx;
}

void print_pascal_triangle_line(int n, int x[])
{
  int i;
  for (i = 0 ; i < n ; ++i)
  {
    cout << setw(KETA) << x[i];
  }
  cout << endl;
}

int get_max_value(int n, int x[])
{
  int i;
  int mx = x[0];
  for (i = 1; i < n ; ++i)
  {
    if (mx < x[i])
      mx = x[i];
  }
  return mx;
}

int main()
{
  int a[100];
  int n, i;
  n = 1;

  /* 10 が出てくるまでパスカルの三角形を書く */
  do
  {
    get_pascal_triangle_line(n, a);
    print_pascal_triangle_line(n, a);
  } while (get_max_value(n++, a) < 10);

  /* 下半分の三角形を書いてひし形に見せる */
  for (i = n - 2 ; i > 0 ; --i)
  {
    get_pascal_triangle_line(i, a);
    int j;
    for (j = 1 ; j < n - i ; ++j)
      cout << setw(KETA) << " ";
    print_pascal_triangle_line(i, a);
  }

  return 0;
}

ひし形が歪んでいるのと、パスカルの三角形に 10 が出て来るということを
前提に書いちゃってますけど。


私の説明する気を殺がない程度に自分で調べてみてから、分からないところが
あれば、遠慮せずに聞いてください。反応はすぐ返せないかもしれないけど、
それなりに説明をする気はあります。


# 因みに、このソースは C++ で書きましたので、このまま提出しても
# 通るとは思えません
    • good
    • 0

うーん、プログラム組むのは簡単だけど、数式が理解できないや...


と言う事で下記を参考にどうぞ。

あと、もう少しカテゴリを考えて質問しないと、良い答えも返ってこないよ。

参考URL:http://www.geocities.co.jp/SiliconValley-Oakland …
    • good
    • 0

C言語はあるていどできます。


私の頭の悪さから、問いの意味がよくわかりません。
ごめんなさい。
最終的にどう出力されれば良いのですか?
   1
  2 2
 3 3 3
4…
ってことですか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qc言語 プログラム ピラミッド

プログラミングについて教えてください

プログラムは
ピラミッドの図形をユーザーが指定した数字で正三角形の
ピラミッドの段数を指定できるプログラムです

例えば「5」と打てば
********* ■
********■■■
******■■■■■
****■■■■■■■
**■■■■■■■■■
このような感じに表示されます
*の部分は空白です

#include<stdio.h>
int main (void)
{
int num,i,j,h;

printf("ピラミッドの高さを入力してください : ");
scanf("%d" ,&num);

for(i=1; i<=num; i++){
for(j=num; j>=i+1; j--){
printf(" ",j);
}
for(h=1; h<=j; h++){

printf("■");
}
printf("\n");
}
return 0;
}

ここまで出来ています、詰まっているのでご教授ください
よろしくお願いします

Aベストアンサー

#include<stdio.h>
int main (void)
{
int num,i,j,h;
int k;

printf("ピラミッドの高さを入力してください : ");
scanf("%d" ,&num);

for(i=1; i<=num; i++){
for(j=num; j>=i+1; j--){
printf(" ",j);
}
for(h=1; h<=2*j-1; h++){
printf("■");
}
printf("\n");
}
return 0;
}

Qアスタリスクでダイヤ型を作る

アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが
実行例と比較して形が変になってしまいます。また、関数をif文で作ったのですがそれをfor文while文で実行できる形にするにはどのようにしたらいいのでしょうか?
実行例と私が作ったプログラムの実行データを画像に添付しました。

#include <stdio.h>

int daiya( int i, int j, int Num ){
if( j<= i+Num && j<=-i+Num &&
j>= i-Num && j>=-i-Num ){
return 1;
}

}

int main(){
int i, j, n;

do{
puts("数字を入力:");
scanf( "%d", &n );

if(n<2||n>9){
printf("入力エラーです。もう一度入力して下さい\n");
}
}while(n<2||n>9);

for( j=-n/2; j<=n/2; j++ ){
for( i=-n/2; i<=n/2; i++ ){
if( daiya( i, j, n/2 ) == 1 ){
putchar('*');
}
else {
putchar(' ');
}
}
putchar('\n');
}

return 0;
}

アスタリスクでダイヤ型の形を出力するプログラムを作ったのですが
実行例と比較して形が変になってしまいます。また、関数をif文で作ったのですがそれをfor文while文で実行できる形にするにはどのようにしたらいいのでしょうか?
実行例と私が作ったプログラムの実行データを画像に添付しました。

#include <stdio.h>

int daiya( int i, int j, int Num ){
if( j<= i+Num && j<=-i+Num &&
j>= i-Num && j>=-i-Num ){
return 1;
}

}

int main(){
int i, j, n;

do{
puts("...続きを読む

Aベストアンサー

#include <stdio.h>

int daiya(int x, int y, int n)
{
return y <= x + n - 1 && y <= -x + n - 1 &&
y >= x - n + 1 && y >= -x - n + 1;
}

int main(void)
{
int n, x, y;

printf("段数:"); scanf("%d", &n);
for (x = -n + 1; x <= n - 1; x++) {
for (y = -n + 1; y <= n - 1; y++) {
putchar(daiya(x, y, n) ? '*' : ' ');
}
putchar('\n');
}
return 0;
}

Qひし形のあたり判定について

C言語でクォータービューのRPGを作っているのですが、ひし形をマップの座標からウィンドウへ描画する座標については自力で解決できたのですが、マウスの位置を取得してそこにカーソルを重ねるときにひし形のあたり判定の仕方がわからないのですが、どなたかご存知ないでしょうか?
教えてくださいお願いします。

Aベストアンサー

一例です。
CreatePolygonRgn()で判定をしたい菱形のリージョンを作ります。
そして、PtInRgn()で指定した座標(この場合マウスポインタの座標)
が作成したリージョン内にあるか否かの判定ができます。
#かなり省略して書いているので各関数の詳細は調べてくださいね。

Q課題なんですが・・・

プログラムが書いてあるため非常に長文です。
お許しください。
いま、C++でのプログラミング課題が出ているのですが、
正方形の中抜きは出来たのですが、三角形・逆三角形の中抜きが作れません・・・。
もちろん、宿題・課題の丸投げは禁止されているのは分かっています。
しかし、一向に進まないのでなにかヒントだけでも(できたら答えも・・・というのは冗談です)教えていただけないでしょうか。
ちなみに問題は、入力数分の縦×横の図形を描くプログラムを組む。
というものです。

#include <stdio.h>
void main (void)
{
/*変数の宣言*/
int cnt1, cnt2,n;

/*数字の入力*/
do
{
printf("数字2~19を入力してください:");
scanf("%d",&n);
if(n<2 || n>19)
{
printf("入力エラーです!!\nもう一度");
}
}while(n<2 || n>19);


/*正方形の作成*/
printf("\n正方形\n");

for(cnt1=0;cnt1<n;cnt1++)
{
for(cnt2=1;cnt2<=n;cnt2++)
{
printf("*");
}
printf("\n");
}

  printf("\n三角形\n");

for(cnt1=1;cnt1<=n;cnt1++)
{
for(cnt2=0;cnt2<cnt1;cnt2++)
{
printf("*");
}
printf("\n");
}

printf("\n逆三角形\n");

for(cnt1=1;cnt1<=n;cnt1++)
{
for(cnt2=n;cnt2>=cnt1;cnt2--)
{
printf("*");
}
printf("\n");
}

printf("\n三角旗\n");

for(cnt1=1;cnt1<=n;cnt1++)
{
for(cnt2=0;cnt2<cnt1;cnt2++)
{
printf("*");
}
printf("\n");
}
for(cnt1=n-1;cnt1>=0;cnt1--)
{
for(cnt2=0;cnt2<cnt1;cnt2++)
{
printf("*");
}
printf("\n");
}


printf("\nダイヤ形\n");

for(cnt1=1;cnt1<=n;cnt1++)
{
for(cnt2=1;cnt2<=n*2;cnt2++)
{
if(cnt2<=n-cnt1 || cnt2>=n+cnt1)
{
printf(" ");
}
else
{
printf("*");
}
}
printf("\n");
}
for(cnt1=n-1;cnt1>0;cnt1--)
{
for(cnt2=1;cnt2<=n*2;cnt2++)
{
if(cnt2<=n-cnt1 || cnt2>=n+cnt1)
{
printf(" ");
}
else
{
printf("*");
}
}
printf("\n");
}

printf("\n中抜き正方形\n");

for(cnt1=1;cnt1<=n;cnt1++)
{
if(cnt1==1 || cnt1==n)
{
for(cnt2=1;cnt2<=n;cnt2++)
{
printf("*");
}

}
else for(cnt2=1;cnt2<=n;cnt2++)
{
if(cnt2==1 || cnt2==n)
{
printf("*");
}
else
{
printf(" ");
}
}


printf("\n");
}
rewind(stdin);
getchar();
}

プログラムが書いてあるため非常に長文です。
お許しください。
いま、C++でのプログラミング課題が出ているのですが、
正方形の中抜きは出来たのですが、三角形・逆三角形の中抜きが作れません・・・。
もちろん、宿題・課題の丸投げは禁止されているのは分かっています。
しかし、一向に進まないのでなにかヒントだけでも(できたら答えも・・・というのは冗談です)教えていただけないでしょうか。
ちなみに問題は、入力数分の縦×横の図形を描くプログラムを組む。
というものです。

#include <stdi...続きを読む

Aベストアンサー

> かなり高度なものだと思うのですが・・・

まったく通常レベルのものだと思いますけど。。。^^;

> 質問欄にある形式(構文)のみで組むことは出来ませんか?

組むことはできるでしょうね^^

関数呼び出しもダメ、if/while/for だけしか使うな、とか無意味、というより害があると思いますよ(笑)

でもまあ、課題をクリアして、学校を信じてがんばってください。

Q直角三角形を表示するプログラム

下記のプログラムを実行するとコマンドプロントになにも表示されず、強制終了しなければならなくなってしまいます。
whileのところがおかしいのはわかったのですが、この書き方の何がいけないのかが分かりません。
初歩的な質問で申し訳ありませんが、回答していただけると有難いです。

#include <stdio.h>

int main(void){
int count, i;
printf("何段ですか?");
scanf("%d", &count);

for(i = 1; i <= count; i++){
while(i-- > 0){
putchar('*');
}
putchar('\n');
}
return 0;
}

Aベストアンサー

変数 i を段数のカウント用に使っているようですが、
for文の中にあるwhile文のループで
i が0になるまで減らしてしまっているため、
いつまでたってもfor文のループを抜けることができません。
下記のように別の変数を導入すれば、うまくいくと思います。
なお、改行を入れる場所がまずかったので修正してあります。

#include <stdio.h>

int main(void)
{
int count, n, i;

printf("何段ですか?");
scanf("%d", &count);

for (i = 1; i <= count; i++) {
n = i;
while (n-- > 0) {
putchar('*');
}
putchar('\n');
}
return 0;
}

Q多角形の描画。(VC++)

三角形を描画したいと考えていますが、多角形を書くための関数で「Polygon」というものがあると知りました。
ヘルプを読んで早速、やってみようとしたのですがどうにも上手く行きません。

Polygonを使って描画する例などありましたら教えてください。

Aベストアンサー

Polygon関数(API)は指定したデバイスコンテキストに対して多角形を描画します。

多角形の描画の前には、
ペンの設定
ブラシの設定
描画モードの設定
塗り潰しモードの設定
等が必要です。

ペン、ブラシの設定はSelectObject関数で
描画モードの設定はブラシやペンの作成時のモードで(CreatePen関数、CreateSolidBrush関数など)
塗り潰しの設定はSetPolyFillMode関数で
それぞれ設定する必要があります。

そして、POINT構造体を頂点分だけ並べた配列が必要です。

API関数のみで書くと、かなり大きなソースコードになるので、サンプル例までは無理です。

上記説明に出てきた関数のヘルプを読んで実験してみて下さい。

Q再起呼び出しの回数をカウントするプログラム

現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください

再起呼び出しの回数をカウントして
その回数を返したいのですが

例えば

coid honoi(int n,char a,char b,char c)  {
    int count=0;
    if (n>0)  {
        hanoi(n-1,a,c,b);
        count++;
    }
}

のようなプログラムを組むと
hanoi(n-1,a,c,b)
を呼び出すと、countが再度 0 に戻され
count=1 になってしまいます。

同様に

if()  {
    int count=0;
    hanoi();
    count++
}

としても、count=1のままでした。

再起呼び出しをするたびに、この count値を増やしていくには
どのようにプログラムを書けばよいのでしょうか?

まだCは初心者レベルなので
易しめにご説明ください。
よろしくお願いします。

現在学校の課題で
プログラムを組んでるんですが
ちょっとよくわからないことがあるので教えてください

再起呼び出しの回数をカウントして
その回数を返したいのですが

例えば

coid honoi(int n,char a,char b,char c)  {
    int count=0;
    if (n>0)  {
        hanoi(n-1,a,c,b);
        count++;
    }
}

のようなプログラムを組むと
hanoi(n-1,a,c,b)
を呼び出すと、countが再度 0 に戻され
count=1 になってしまいます。

同様に

if()  {
...続きを読む

Aベストアンサー

関数の外で変数を宣言し、どこかで初期化して、カウントアップすれば実現できます。

static int count;
  :
  :
int main(int argc, char *argv[]) {

  :
  :
  count = 0;
  hanoi(適当な引数);
  :
  :

}
void hanoi(int n,char a,char b,char c)  {
    count++;
    if (n>0)  {
        hanoi(n-1,a,c,b);
    }
}

こんな感じです。

QC言語のプログラムが実行できません。

C言語のプログラムが実行できません。

コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。

これは何のエラーなんでしょうか?
基本的な事かもしれませんが、分かる方宜しくお願い致します。

Aベストアンサー

僕も何度も出したなぁ。

ひとくちにSegmentation faultといっても、それこそさまざまな要因があるので、
これだけで原因を突き止めるのは非常に難しいです。

コンパイルはあくまで文法としてみているだけであり、
処理の流れ、メモリ確保など、プログラムそのものを見ているわけではありません。
このエラーが出るのは文法などよりもっと上位の原因なのです。
たとえばですが。
長さ10の配列があったとして、11番目以降を参照したりすると、
そういうのが出たような気がします。

ですから、変数があれば、その内容をprintf文で逐一出していき、
変な値が入っていないとか、少しずつ直していくしかないと思います。

QC *での三角形描画

課題で*を使って三角形を描画するプログラムを作るんですが、ネットで見たかぎり、
#include<stdio.h>
int main()
{
int n, i, j, k, l;
printf("段数を入力してください:");
scanf("%d", &n);
for(i = 0; i < n; i ++) {
for(j = 0; j < n; j ++) {
for(k = 0; k < n*n-i*n-j-1; k ++)
printf(" ");
for(k = 0; k < i; k ++) {
for(l = 0; l < j*2+1; l ++)
printf("*");
for(; l < n*2; l ++)
printf(" ");
}
for(k = 0; k < j*2+1; k ++)
printf("*");
printf("\n");
}
}
return 0;
}
となっているのが、

 段数を入力してください:2
    *
   ***
  *   *
 *** ***
という風に表示されるので、これを
 段数を入力してください:2
    *
   ***
という形に表示させられるよう変更すべき箇所を教えてください。

課題で*を使って三角形を描画するプログラムを作るんですが、ネットで見たかぎり、
#include<stdio.h>
int main()
{
int n, i, j, k, l;
printf("段数を入力してください:");
scanf("%d", &n);
for(i = 0; i < n; i ++) {
for(j = 0; j < n; j ++) {
for(k = 0; k < n*n-i*n-j-1; k ++)
printf(" ");
for(k = 0; k < i; k ++) {
for(l = 0; l < j*2+1; l ++)
printf("*");
for(; l < n*2; l ++)
printf(" ");
}
for(k = 0; k < j*2+1; k ++)
printf("*");
printf("\n");...続きを読む

Aベストアンサー

    *
   ***



 *
*** と左詰として「回答」します。

>という形に表示させられるよう変更すべき箇所を教えてください。

 他の回答者さんも言っているとおり、「新しく作った方が」・・。

《ポイント》
 ・変数名を判り易くする。
 ・2段のとき、3段のときの状況を紙に描く。
 ・その違いから、各行の必要空白・*数を求める「式」◆を考える。
《ヒント》
 ・各行の*数は奇数です。

★全部ソースに書いてはマズイかな。+++++ の部分を考えて・・。

#include <stdio.h>

void main()
{
 int  iDansu, iY, iX, iSpaceSu, iPekeSu;

 printf( "段数を入力してください:" );

 scanf( "%d", &iDansu );

 for( iY = 0; iY < iDansu; iY++ ){ // 上段から下段へ

  iSpaceSu = ++++ - ++++ - ++++; // 左空白数◆

  iPekeSu = ++++ * ++++ + ++++; // *数◆

  for( iX = 0; iX < iSpaceSu; iX++ ) printf(" ");

  for( iX = 0; iX < iPekeSu; iX++ ) printf("*");

  printf( "\n" );
 }
}
注:インデントに全角空白を用いています。

    *
   ***



 *
*** と左詰として「回答」します。

>という形に表示させられるよう変更すべき箇所を教えてください。

 他の回答者さんも言っているとおり、「新しく作った方が」・・。

《ポイント》
 ・変数名を判り易くする。
 ・2段のとき、3段のときの状況を紙に描く。
 ・その違いから、各行の必要空白・*数を求める「式」◆を考える。
《ヒント》
 ・各行の*数は奇数です。

★全部ソースに書いてはマズイかな。+++++ の部分を考えて・・。

#includ...続きを読む

QC言語のfor文問題で・・・

C言語のfor文問題で・・・

わからない問題がありまして・・・

アスタリスクを表示させる問題なのですが・・・

わかる方いたら、ソースコードだけでいいので、教えてくだい、お願いします

ただし、printfで、全てのアスタリスクを表示させるのはNGで、配列も使ってはいけません。

main関数以外の関数は使わないように、お願いします。

(1)

    1段目に*が1つで、 (三角旗型のアスタリスク)  
    2段目に*が2つで、
    3段目に*が3つで、
    4段目に*が2つで、
    5段目に*が1つ。

(2)


  1段目に*が1つで、  
    2段目に*が3つで、
    3段目に*が5つで、    (ダイヤ型のアスタリスク)
    4段目に*が3つで、
    5段目に*が1つ。    


(3)
      1段目に*が2つで、   (六角形型のアスタリスク)
      2段目に*が4つで、
      3段目に*が2つ。
   


以上3問です。

Aベストアンサー

「ソースコードだけ」っていうじゃなーい、でもそれ「代わりに回答してくれ」って意味ですから、残念。
#我ながら古い。

という訳で方針だけ説明しますが、要は「*の位置決めをどうするか」という話ですね。
ANSIエスケープシーケンスなんて手もなくはないですが、まぁ普通に空白で左から埋めていけばいいでしょう。
「関数」を封じられると#1でも言われているように打つ手なしですが、まぁ本意は「関数を作るな、main()内で完結しろ」って意味でしょうから普通にfor()とputchar()でケースに応じて空白か*を出力するだけです。
一行終わったら改行を出力して次の行、の繰り返し。
配列がNGなのは先に文字列パターンを作って出力するだけ、という手を封じるのが目的でしょうか。
ベタにやってもいいですが、増減値にパターンがあるので各行の空白の数、*の数は計算でも出せなくはありません。


人気Q&Aランキング